Пример 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