Материал: Using_MySql,_MS_SQL_Server_and_Oracle

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

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

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