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

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

Пример 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-файла) (общая идея) і

 

1

rem Экспорт

 

 

2

mysqldump ИМЯ ПАРОЛЬ ИСХОДНАЯ_БАЗА_ДАННЫХ

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

3

rem Импорт

 

 

4

mysql

ИМЯ

- -e "DROP SCHEMA 'НОВАЯ—БАЗА—ДАННЫХ';";

5

рПАРОЛЬ

 

-e "CREATE SCHEMA 'НОВАЯ_БАЗА_ДАННЫХ' DEFAULT CHARAC-

 

mysql

ИМЯ

- utf8_general_ci;";

 

рПАРОЛЬ

 

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

TER SET utf8 COLLATE mysql -uMHH ^ПАРОЛЬ

MySQL

1

2

3

4

5

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

rem Экспорт mysqldump -uabc -pdef library > library.sql rem Импорт mysql -

uabc-pdef

-e "DROP SCHEMA 'library_copy';";

mysql -uabc -pdef

-e "CREATE SCHEMA 'library_copy' DEFAULT

CHARACTER SET

 

utf8 COLLATE utf8_general_ci;";

mysql

-uabc -pdef

library copy < library.sql

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

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

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

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

1

rem Экспорт

 

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

 

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

3

rem Импорт

 

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

 

НЫХ]"

 

5

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

 

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

6

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

 

[НОВАЯ_БАЗА_ДАННЫХ] FROM DISK='ПОЛНЫЙ_ПУТЬ_К_ФАЙЛУ.bak' WITH MOVE

 

'ЛОГИЧЕСКОЕ_ИМЯ_1' TO 'НОВОЕ_ПОЛНОЕ_ИМЯ_ФАЙЛА_1', MOVE 'ЛОГИЧЕСКОЕ_ИМЯ_2' TO

 

'НОВОЕ ПОЛНОЕ ИМЯ ФАЙЛА 2'"

MS SQL I

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

1

rem Экспорт

 

2 sqlcmd -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 Стр: 550/545

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

В Oracle решение является самым объёмным.

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

1rem Экспорт

2del ИМЯ_ФАЙЛА

3del ИМЯ_ЛОГ_ФАЙЛА

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

5@echo CREATE DIRECTORY ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА AS 'ПОЛНЫЙ_ПУТЬ_К_КАТАЛОГУ'; | sqlplus ИМЯ/ПАРОЛЬ@СЕРВЕР

6expdp ИМЯ/ПАРОЛЬ@СЕРВЕР schemas=ИМЯ directory=ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА dump- ^1Є=ИМЯ_ФАЙЛА.dmp logfile=ИМЯ_ЛОГ_ФАЙЛА.log

78 rem Импорт

@echo DROP TABLESPACE ТАБЛИЧНОЕ_ПРОСТРАНСТВО_КОПИИ INCLUDING CONTENTS AND DATAFILES; | sqlplus ИМЯ/ПАРОЛЬ@СЕРВЕР

910 @echo DROP USER ИМЯ_ДЛЯ_КОПИИ CASCADE; | sqlplus ИМЯ/ПАРОЛЬ@СЕРВЕР @echo CREATE TABLESPACE ТАБЛИЧНОЕ_ПРОСТРАНСТВО_КОПИИ DATAFILE

'ФАЙЛ_ДАННЫХ_КОПИИ.dat' SIZE 5M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIM

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

11@echo CREATE USER ИМЯ_ДЛЯ_КОПИИ IDENTIFIED BY ПАРОЛЬ_ДЛЯ_КОПИИ DEFAULT TABLESPACE ТАБЛИЧНОЕ_ПРОСТРАНСТВО_КОПИИ TEMPORARY TABLESPACE temp; | sqlplus

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

12@echo GRANT ALL PRIVILEGES TO ИМЯ_ДЛЯ_КОПИИ; | sqlplus ИМЯ/ПАРОЛЬ@СЕРВЕР

13impdp ИМЯ/ПАРОЛЬ@СЕРВЕР schemas=ИМЯ directory=ЛОГИЧЕСКОЕ_ИМЯ_КАТАЛОГА remap_schema=ИМЯ:ИМЯ_ДЛЯ_КОПИИ remap_tablespace=ТАБЛИЧНОЕ_ПРОСТРАНСТВО:

ТАБЛИЧНОЕ_ПРОСТРАНСТВО_КОПИИ dumpfile=ИМЯ_ФАЙЛА.dmp logfile=^TH ЛОГ ФАЙЛА.log

Oracle і

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

і

1rem Экспорт

2del "C:\backup\library.dmp" del "C:\backup\library_log.log"

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

5@echo CREATE DIRECTORY LIBRARY_BACKUP AS 'C:\backup'; | sqlplus abc/def@COMP

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

7rem Импорт

@echo DROP TABLESPACE library_copy_ts INCLUDING CONTENTS AND DATAFILES; |

8sqlplus abc/def@COMP

9@echo DROP USER library_copy CASCADE; | sqlplus abc/def@COMP

@echo CREATE TABLESPACE library_copy_ts DATAFILE 'library_copy_ts.dat' SIZE

105M REUSE AUTOEXTEND ON NEXT 1M MAXSIZE UNLIMITED; | sqlplus abc/def@COMP @echo CREATE USER library_copy IDENTIFIED BY library_copy_pwd DEFAULT TA-

11BLESPACE library_copy_ts TEMPORARY TABLESPACE temp; | sqlplus abc/def@COMP

12@echo GRANT ALL PRIVILEGES TO library_copy; | sqlplus abc/def@COMP

13impdp abc/def@COMP schemas=abc directory=LIBRARY_BACKUP remap_schema=abc: library_copy remap_tablespace=library_ts:library_copy_ts dumpfile=library.dmp logfile=library log.log

Для начала нам нужно удалить существующие резервные копии (строки 2-3) и выполнить экспорт (строки 4-6) который представляет собой обычное резервное копирование, рассмотренное в решении{518} задачи 7.2.1. b{516}.

Затем мы:

удаляем табличное пространство копии базы данных — на случай, если оно уже было (строка 8);

удаляем пользователя/схему копии базы данных — на случай, если он существовал (строка 9);

создаём табличное пространство копии базы данных (строка 10);

создаём пользователя/схему копии базы данных (строка 11);

выдаём пользователю копии базы данных все права (строка 12) — не делайте такого на реальных серверах, но в учебном контексте это допустимо;

производим импорт (строка 13), указав изменение схемы (remap_schema) и

табличного пространства (remap_tablespace).

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

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

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

Задание 7.2.1.TSK.A: переписать командные файлы из решений

7.2.1.a{516}, 7.2.1.b{518} и 7.2.1.c{519} для работы под Linux.

Задание 7.2.1.TSK.B: реализовать (в тех СУБД, которые поддерживают такую функциональность) решение{519} задачи 7.2.1.c{516} без создания промежуточных файлов на диске.

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

Пример 49: управление пользователями, запуск и остановка СУБД

7.3. Операции с СУБД

7.3.1.Пример 49: управление пользователями, запуск и остановка СУБД

Задача 7.3.1 .a{522}: создать нового пользователя СУБД и предоставить ему полный набор прав на базу данных «Библиотека».

Задача 7.3.1.b{523}: сменить созданному в задаче 7.3.1.a пользователю пароль.

Задача 7.3.1.с{523}: создать командные файлы для запуска, остановки, перезапуска СУБД.

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

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

7.3.1. a<522\

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

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

7.3.W523}.

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

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

7.3.1.c<523\

Решение 7.3.1.a{522}.

В MySQL решение данной задачи достигается двумя командами. В строке 1 мы создаём пользователя (конструкция '%' после @ означает, что ему разрешён доступ с любых хостов), в строке 2 мы выдаём ему полные права на базу данных «Библиотека».

MySQL і Решение 7.3.1.a [

. 1 . CREATE USER rnew_userTeT%' IDENTIFIED BY 'new_password'; .....................

GRANT ALL PRIVILEGES ON 'library'.* TO 'new user'@'%';

В MS SQL Server сначала необходимо создать логин для подключения к СУБД (строки 2-3), а затем (строки 6-8) можно создать пользователя, проассоциированного с ранее созданным логином, и сделать его владельцем базы данных «Библиотека», что предоставит ему полные права на неё.

MS SQL і Решение 7.3.1.a

[

1-- Создание логина (для подключения к серверу)

2USE [master]

3CREATE LOGIN [new_login] WITH PASSWORD = 'new_password';

5-- Создание пользователя и выдача полных прав

6USE [library];

CREATE USER [new_user] FOR LOGIN [new_login];

8EXEC sp addrolemember N'db owner', N'new user';

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

Пример 49: управление пользователями, запуск и остановка СУБД

ВOracle нет простого способа выдать одному пользователю все права на всю схему другого пользователя. Существуют обходные пути47, но они слишком громоздки.

Однако можно воспользоваться интересной особенностью данной СУБД (которую также поддерживает MySQL) — проксированием доступа, когда авторизация происходит от имени одного пользователя, а работа — от имени другого.

Встроках 1-2 мы создаём нового пользователя, в строке 4 позволяем ему работать от имени владельца базы данных «Библиотека» и в строке 5 разрешаем ему устанавливать соединения с СУБД.

Oracle і Решение 7.3.1.a [

 

. 1 ..

CREATE . USER . new_user IDENTIFIED ..

BY new_password............................

2

DEFAULT TABLESPACE library_ts TEMPORARY TABLESPACE temp

3

 

 

4ALTER USER library GRANT CONNECT THROUGH new_user;

5GRANT CREATE SESSION TO new user

Теперь можно проверить работоспособность этого решения, подключившись к СУБД через sqlplus с такими учётными данными: new_user[library]/new_password@CEPBEP. После запуска sqlplus можно удостовериться, что мы работаем от имени пользователя library, выполнив команду SHOW USER.

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

хА?

'Vf Решение 7.3.1 .b{522}.

Во всех трёх СУБД эта задача решается в одну строку (в MySQL необходимо использовать функцию PASSWORD для хеширования исходного значения пароля).

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

Решение 7.3.1 .c{522}.

Решение данной задачи для всех трёх СУБД основано на использовании команд net start48 и net stop49. Отличия будут только в именах сервисов, и для MS SQL Server (возможно) придётся управлять также его сопутствующими сервисами, набор и имена которых зависят от конкретной версии СУБД.

Представленный ниже код командных файлов производит перезапуск СУБД. Очевидно, что можно использовать отдельно части, отвечающие за остановку и запуск СУБД для достижения соответствующего результата.

47https://community.oracle.com/thread/2386990?start=0&tstart=0

48https://technet.microsoft.com/en-us/library/bb490713.aspx

49https://technet.microsoft.com/en-us/library/bb490715.aspx

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

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