Материал: Using_MySql,_MS_SQL_Server_and_Oracle(1)

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Пример 47: формирование и анализ связанных структур

Таким образом, как и было сказано выше, в Oracle первый вариант решения тоже не находит альтернативные пути разной длины, в то время как второй вариант справляется с этим.

На этом решение данной задачи завершено.

Задание 7.1.2.TSK.A: в тех СУБД, которые поддерживают соответствующую функциональность, реализовать решение{493} задачи 7.1.2.b{491} не через хранимую процедуру, а через хранимую функцию.

Задание 7.1.2.TSK.B: сравнить производительность первого и второго вариантов решения{493} задачи 7.1.2.b{491} для MySQL.

Задание 7.1.2.TSK.C: реализовать первый вариант решения{493} задачи 7.1.2.b{491} для Oracle с использованием выражения CONNECT BY.

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 515/545

Пример 48: резервное копирование и восстановление базы данных

7.2. Операции с базами данных

7.2.1.Пример 48: резервное копирование и восстановление базы данных

Задача 7.2.1.a{516}: написать командный файл для автоматизации создания резервной копии базы данных.

Задача 7.2.1.b{518}: написать командный файл для автоматизации восстановления базы данных из резервной копии.

Задача 7.2.1.c{519}: написать командный файл для автоматизации создания рабочей копии базы данных.

Ожидаемый результат 7.2.1.a:

Поскольку само решение и является ожидаемым результатом, см. решение

7.2.1.a{516}.

Ожидаемый результат 7.2.1.b:

Поскольку само решение и является ожидаемым результатом, см. решение

7.2.1.b{518}.

Ожидаемый результат 7.2.1.c:

Поскольку само решение и является ожидаемым результатом, см. решение

7.2.1.c{519}.

Решение 7.2.1.a{516}.

В данном случае под «резервной копией базы данных» мы будем понимать набор SQL-команд, выполнив которые (возможно, с предварительной правкой) на произвольном сервере, мы получим полноценную рабочую копию исходной базы данных.

Здесь не будет идти речь о создании резервных копий конкретного сервера и/или его конкретных баз данных, о резервировании по расписанию, инкрементных резервных копиях и прочих способах автоматизировать резервное копирование и восстановление в рамках одной системы.

В MySQL для выполнения соответствующей операции существует утилита mysqldump. Удостоверьтесь, что путь к ней прописан в переменной окружения PATH, после чего следующий командный файл будет создавать полную резервную копию указанной базы данных.

MySQL Решение 7.2.1.a (код cmd-файла) (общая идея)

1 mysqldump -uИМЯ -pПАРОЛЬ БАЗА_ДАННЫХ > БАЗА_ДАННЫХ.sql

MySQL

Решение 7.2.1.a (код cmd-файла) (пример)

1 mysqldump -uabc -pdef library > library.sql

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 516/545

Пример 48: резервное копирование и восстановление базы данных

В MS SQL Server получить резервную копию базы данных в виде SQL-кода можно с помощью MS SQL Server Management Studio43 или с помощью SQL Server Management Objects44, но столь же простого и элегантного решения, как в MySQL, в этой СУБД нет. Зато есть возможность получить бинарную резервную копию с помощью следующего командного файла (удостоверьтесь, что путь к утилите sqlcmd прописан в переменной окружения PATH).

Представленный ниже код должен быть записан одной строкой, и расширение файла обязательно должно быть bak.

MS SQL Решение 7.2.1.a (код cmd-файла) (общая идея)

1 sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -Q "BACKUP DATABASE [БАЗА_ДАННЫХ] TO DISK='ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ.bak'"

MS SQL Решение 7.2.1.a (код cmd-файла) (пример)

1 sqlcmd -U abc -P def -S COMP\MS SQLSRV -Q "BACKUP DATABASE [library] TO

DISK='C:\backup\library.bak'"

В Oracle (как и в MS SQL Server) нет простого пути получения из командной строки полноценного SQL-кода с полной резервной копией базы данных (но можно использовать Oracle SQL Developer45), зато есть утилита expdp, создающая бинарную резервную копию. Код с её использованием показан ниже (удостоверьтесь, что путь к утилите expdp прописан в переменной окружения PATH).

Также обратите внимание на то, что в командном файле первые две строки отвечают за выполнение SQL-запросов, которые производят необходимую подготовку на уровне СУБД.

Oracle Решение 7.2.1.a (код cmd-файла) (общая идея)

1@echo GRANT CREATE ANY DIRECTORY TO ИМЯ; | sqlplus ИМЯ/ПАРОЛЬ@СЕРВЕР

2@echo CREATE DIRECTORY ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА AS 'ПОЛНЫЙ_ПУТЬ_К_КАТАЛОГУ';

| sqlplus ИМЯ/ПАРОЛЬ@СЕРВЕР

3expdp ИМЯ/ПАРОЛЬ@СЕРВЕР schemas=ИМЯ directory=ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА dumpfile=ИМЯ_ФАЙЛА.dmp logfile=ИМЯ_ЛОГ_ФАЙЛА.log

Oracle

Решение 7.2.1.a (код cmd-файла) (пример)

1@echo GRANT CREATE ANY DIRECTORY TO abc; | sqlplus abc/def@COMP

2@echo CREATE DIRECTORY LIBRARY_BACKUP AS 'C:\backup'; | sqlplus

abc/def@COMP

3expdp abc/def@COMP schemas=abc directory=LIBRARY_BACKUP dumpfile=library.dmp logfile=library_log.log

Пользуясь случаем, напоминаем: обязательно делайте резервные копии своих данных. Полученные резервные копии стоит проверить на пригодность к использованию для восстановления (т.е. восстановить на тестовом сервере).

На этом решение данной задачи завершено.

43http://blog.sqlauthority.com/2011/05/07/sql-server-2008-2008-r2-create-script-to-copy-database-schema-and-all-the-objects-data- schema-stored-procedure-functions-triggers-tables-views-constraints-and-all-other-database-objects/

44https://www.simple-talk.com/sql/database-administration/automated-script-generation-with-powershell-and-smo/

45http://docs.oracle.com/cd/E17781_01/server.112/e18804/impexp.htm#ADMQS256

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 517/545

Пример 48: резервное копирование и восстановление базы данных

Решение 7.2.1.b{516}.

В MySQL для решения данной задачи мы используем поставляемый с данной СУБД консольный клиент.

Удаление и повторное создание (строки 1-2) являются способом быстрого получения пустой базы данных: как правило, база данных, которую нужно восстанавливать из резервной копии, уже повреждена настолько, что её можно удалять.

Внимательно следите за именами баз данных в представленном ниже коде командного файла. Есть риск удалить «не ту» базу данных.

Если база данных, которую вы собираетесь «пересоздать», содержит полезную информацию, рекомендуется в любом случае сделать её отдельную резервную копию перед выполнением восстановления.

MySQL

Решение 7.2.1.b (код cmd-файла) (общая идея)

1mysql -uИМЯ -pПАРОЛЬ -e "DROP SCHEMA `БАЗА_ДАННЫХ`;";

2mysql -uИМЯ -pПАРОЛЬ -e "CREATE SCHEMA `БАЗА_ДАННЫХ` DEFAULT CHARACTER SET

 

 

 

utf8 COLLATE utf8_general_ci;";

 

3

 

mysql -uИМЯ -pПАРОЛЬ БАЗА_ДАННЫХ < БАЗА_ДАННЫХ.sql

 

 

 

 

MySQL

Решение 7.2.1.b (код cmd-файла) (пример)

1mysql -uabc -pdef -e "DROP SCHEMA `library`;";

2mysql -uabc -pdef -e "CREATE SCHEMA `library` DEFAULT CHARACTER SET utf8

COLLATE utf8_general_ci;";

3mysql -uabc -pdef library < library.sql

ВMS SQL Server есть два пути восстановления базы данных из резервной копии. Первый путь актуален, если у вас есть полный SQL-код базы данных со всеми её структурами и данными.

MS SQL

Решение 7.2.1.b (код cmd-файла) (общая идея)

1 sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -i БАЗА_ДАННЫХ.sql

MS SQL

Решение 7.2.1.b (код cmd-файла) (пример)

1 sqlcmd -U abc -P def -S COMP\MS SQLSRV -i library.sql

Второй путь актуален, если восстановление нужно произвести из бинарной резервной копии. Следующий код представляет собой одну строку.

MS SQL

Решение 7.2.1.b (код cmd-файла) (общая идея)

1sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -Q "RESTORE DATABASE [БАЗА_ДАННЫХ] FROM DISK='ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ.bak'"

MS SQL

Решение 7.2.1.b (код cmd-файла) (пример)

1sqlcmd -U abc -P def -S COMP\MS SQLSRV -Q "RESTORE DATABASE [library] FROM DISK='C:\backup\library.bak'"

ВOracle восстановление можно выполнить с использованием утилиты impdp (при условии, что резервное копирование было выполнено утилитой expdp). Следующий код представляет собой одну строку.

Oracle

Решение 7.2.1.b (код cmd-файла) (общая идея)

1impdp ИМЯ/ПАРОЛЬ@СЕРВЕР schemas=ИМЯ directory=ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА dumpfile=ИМЯ_ФАЙЛА.dmp logfile=ИМЯ_ЛОГ_ФАЙЛА.log

Oracle

Решение 7.2.1.b (код cmd-файла) (пример)

1impdp abc/def@COMP schemas=abc directory=LIBRARY_BACKUP dumpfile=library.dmp logfile=library_log.log

На этом решение данной задачи завершено.

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 518/545

Пример 48: резервное копирование и восстановление базы данных

Решение 7.2.1.c{516}.

Самым простым, быстрым и универсальным решением данной задачи для всех трёх СУБД является комбинация решения{516} задачи 7.2.1.a{516} и решения{518} задачи 7.2.1.b{516} с небольшой доработкой — восстанавливать базу данных мы будем под новым именем.

ВMySQL не требуется никаких дополнительных приготовлений и ухищрений

просто реализуем только что описанную логику.

MySQL

Решение 7.2.1.b (код cmd-файла) (общая идея)

1rem Экспорт

2mysqldump -uИМЯ -pПАРОЛЬ ИСХОДНАЯ_БАЗА_ДАННЫХ > ИСХОДНАЯ_БАЗА_ДАННЫХ.sql

3rem Импорт

4mysql -uИМЯ -pПАРОЛЬ -e "DROP SCHEMA `НОВАЯ_БАЗА_ДАННЫХ`;";

5mysql -uИМЯ -pПАРОЛЬ -e "CREATE SCHEMA `НОВАЯ_БАЗА_ДАННЫХ` DEFAULT CHARAC-

 

 

 

TER SET utf8 COLLATE

utf8_general_ci;";

 

6

 

mysql -uИМЯ -pПАРОЛЬ

НОВАЯ_БАЗА_ДАННЫХ < ИСХОДНАЯ_БАЗА_ДАННЫХ.sql

 

 

 

 

MySQL

Решение 7.2.1.b (код cmd-файла) (пример)

1rem Экспорт

2mysqldump -uabc -pdef library > library.sql

3rem Импорт

4mysql -uabc -pdef -e "DROP SCHEMA `library_copy`;";

5mysql -uabc -pdef -e "CREATE SCHEMA `library_copy` DEFAULT CHARACTER SET

utf8 COLLATE utf8_general_ci;";

6mysql -uabc -pdef library_copy < library.sql

ВMS SQL Server экспорт представляет собой обычное резервное копирование, а в процессе импорта необходимо использовать конструкцию WITH MOVE,

чтобы указать новые имена файлов базы данных.

Строка 5 нужна для того, чтобы определить логические имена, присутствующие в резервной копии, и вписать их в строку 6. Т.е. при первом запуске строку 6 можно закомментировать, т.к. она всё равно, скорее всего, не сработает. А при повторных запусках можно закомментировать строку 5, т.к. она уже не нужна.

MS SQL

Решение 7.2.1.b (код cmd-файла) (общая идея)

1rem Экспорт

2sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -Q "BACKUP DATABASE [ИСХОД-

НАЯ_БАЗА_ДАННЫХ] TO DISK='ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ.bak'"

3rem Импорт

4sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -Q "DROP DATABASE [НОВАЯ_БАЗА_ДАН-

 

 

НЫХ]"

5

 

sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -Q "RESTORE FILELISTONLY FROM

 

 

DISK='C:\!\ 'ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ.bak'"

 

 

 

6sqlcmd -U ИМЯ -P ПАРОЛЬ -S СЕРВЕР\СЕРВИС -Q "RESTORE DATABASE [НОВАЯ_БАЗА_ДАННЫХ] FROM DISK='ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ.bak' WITH MOVE 'ЛОГИЧЕСКОЕ_ИМЯ_1' TO 'НОВОЕ_ПОЛНОЕ_ИМЯ_ФАЙЛА_1', MOVE 'ЛОГИЧЕСКОЕ_ИМЯ_2' TO 'НОВОЕ_ПОЛНОЕ_ИМЯ_ФАЙЛА_2'"

MS SQL

Решение 7.2.1.b (код cmd-файла) (пример)

1rem Экспорт

2sqlcmd -U abc -P def -S COMP\MS SQLSRV -Q "BACKUP DATABASE [library] TO

DISK='C:\backup\library.bak'"

3rem Импорт

4sqlcmd -U abc -P def -S COMP\MS SQLSRV -Q "DROP DATABASE [library_copy]"

5sqlcmd -U abc -P def -S COMP\MS SQLSRV -Q "RESTORE FILELISTONLY FROM

DISK='C:\backup\library.bak'"

6sqlcmd -U abc -P def -S COMP\MS SQLSRV -Q "RESTORE DATABASE [library_copy] FROM DISK='C:\backup\library.bak' WITH MOVE 'library' TO 'C:\new\library_copy.mdf', MOVE 'library_log' TO 'C:\new\library_copy_log.ldf'"

Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016–2018 Стр: 519/545

Источник: https://studfile.net/preview/16418462/