Пример 47: формирование и анализ связанных структур
Oracle I |
Решение 7.1.2.b (код для проверки работоспособности) |
| |
1-- Для первого варианта решения:
2TRUNCATE TABLE "connections_temp";
3DECLARE
4fp SYS_REFCURSOR;
5cn_from NUMBER(10 ;
6cn_to NUMBER 10);
cn_cost DOUBLE PRECISION;
8cn_bidir CHAR(1);
9cn_steps NUMBER 5 ;
10cn_route VARCHAR 1000 ;
11BEGIN
12FIND_PATH({начальная_точка}, {конечная_точка}, fp ;
13LOOP
14FETCH fp INTO cn_from
15 |
cn_to |
16 |
cn_cost, |
17 |
cn_bidir, |
18 |
cn_steps, |
19 |
cn_route; |
20EXIT WHEN fp NOTFOUND;
21DBMS_OUTPUT.PUT_LINE(cn_from || ' | ' ||
22 |
cn_to || ' | ' || |
|
23 |
cn_cost || ' | ' || |
|
24 |
cn_bidir |
|| ' | ' || |
25 |
cn_steps |
|| ' | ' || |
26 |
cn_route); |
|
27END LOOP;
28CLOSE fp;
29END;
30
31-- Для второго варианта решения:
32TRUNCATE TABLE "current_path";
33TRUNCATE TABLE "final_paths"
34BEGIN
35FIND_PATH({начальная_точка}, {конечная_точка});
36END;
37SELECT * FROM "final_paths"
Но если в таблицу connections поместить следующие данные
cn_from |
cn_to |
cn_cost |
cn_bidir |
1 |
3 |
100 |
N |
1 |
5 |
100 |
N |
3 |
5 |
20 |
N |
5 |
3 |
200 |
N |
и поискать путь между городами 1 и 5, результаты будут разными. Результат первого варианта решения:
cn_from |
|
cn_to |
cn_cost |
cn_bidir |
cn_steps |
cn route |
||||
1 |
|
5 |
100 |
|
N |
|
1 |
|
[1][5] |
|
Результат второго варианта решения: |
|
|||||||||
|
|
|
|
|
|
|
|
|||
fp_id |
fp_from |
|
fp_to |
fp_cost |
fp_bidir |
|
|
|||
3.5748 |
1 |
|
|
3 |
100 |
N |
|
|
||
3.5748 |
3 |
|
|
5 |
20 |
|
N |
|
|
|
5.881 |
1 |
|
|
5 |
100 |
N |
|
|
||
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 545/545
Пример 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 Стр: 546/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, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 547/545
Пример 48: резервное копирование и восстановление базы данных
ВMS SQL Server получить резервную копию базы данных в виде SQL-кода можно с помощью MS SQL Server Management Studio44 или с помощью SQL Server
Management Objects45, но столь же простого и элегантного решения, как в MySQL, в этой СУБД нет. Зато есть возможность получить бинарную резервную копию с помощью следующего командного файла (удостоверьтесь, что путь к утилите sqlcmd прописан в переменной окружения PATH).
Представленный ниже код должен быть записан одной строкой, и расширение файла обязательно должно быть bak.
ВOracle (как и в MS SQL Server) нет простого пути получения из командной строки полноценного SQL-кода с полной резервной копией базы данных (но можно использовать Oracle SQL Developer46), зато есть утилита 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=ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА dump- ^1Є=ИМЯ ФАЙЛА.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
expdp abc/def@COMP schemas=abc directory=LIBRARY_BACKUP dumpfile=library.dmp logfile=library log.log
Пользуясь случаем, напоминаем: обязательно делайте резервные копии своих данных. Полученные резервные копии стоит проверить на пригодность к использованию для восстановления (т.е. восстановить на тестовом сервере).
На этом решение данной задачи завершено.
44http://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/
45https://www.simple-talk.com/sql/database-administration/automated-script-generation-with-powershell-and-smo/
46http://docs.oracle.com/cd/E17781_01/server.112/e18804/impexp.htm#ADMQS256
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 548/545
Пример 48: резервное копирование и восстановление базы данных
Решение 7.2.1.b{516}.
В MySQL для решения данной задачи мы используем поставляемый с дан-
ной СУБД консольный клиент. |
|
|||
|
|
Удаление и повторное создание (строки 1-2) являются способом |
||
|
быстрого получения пустой базы данных: как правило, база данных, |
|||
( |
которую нужно восстанавливать из резервной копии, уже повреждена |
|||
настолько, что её можно удалять. |
||||
Внимательно следите за именами баз данных в представленном ниже |
||||
|
коде командного файла. Есть риск удалить «не ту» базу данных. |
|||
|
Если база данных, которую вы собираетесь «пересоздать», содержит по- |
|||
|
лезную информацию, рекомендуется в любом случае сделать её отдель- |
|||
|
ную резервную копию перед выполнением восстановления. |
|||
MySQL і Решение 7.2.1.b (код cmd-файла) (общая идея) і |
||||
1 |
. mySql -иИМЯ -рПАРОЛЬ. -e "DROP SCHEMA 'БАЗА_ДАННЫХ';" ; ................... |
|||
2 |
mysql |
-иИМЯ |
-рПАРОЛЬ |
-е "CREATE SCHEMA |
'БАЗА_ДАННЫХ'DEFAULT CHARACTER SET |
|
|||
|
utf8 COLLATE utf8_general_ci;"; |
|
||
3 |
mysql |
-иИМЯ |
-рПАРОЛЬ |
БАЗА ДАННЫХ < БАЗА ДАННЫХ.sql |
|
Решение 7.2.1.b |
cmd- |
|
|
1 |
mysql-uabc-pdef-e "DROP SCHEMA 'library';"; |
|||
2 |
mysql-uabc-pdef |
|
-e "CREATE SCHEMA 'library' DEFAULT |
|
CHARACTER SET utf8 |
|
|
||
|
COLLATE utf8_general_ci;"; |
|
||
3mysql-uabc-pdeflibrary < library.sql
ВMS SQL Server есть два пути восстановления базы данных из резервной копии. Первый путь актуален, если у вас есть полный SQL-код базы данных со всеми её структурами и данными.
Второй путь актуален, если восстановление нужно произвести из бинарной резервной копии. Следующий код представляет собой одну строку.
В Oracle восстановление можно выполнить с использованием утилиты impdp (при условии, что резервное копирование было выполнено утилитой expdp). Следующий код представляет собой одну строку.
На этом решение данной задачи завершено.
Работа с MySQL, MS SQL Server и Oracle в примерах © EPAM Systems, RD Dep, 2016-2018 Стр: 549/545