Навігація по публікаціям
Періодично то там, то тут піднімається питання, як зробити резервну копію бази даних, або як виконати SQL скрипт величезного розміру.
Якщо у вас є доступ до сервера тільки по FTP і з PHP скриптів заборонений запуск команд оболонки, то іншого виходу немає, окрім як шукати скрипти виконують необхідні функції на чистому PHP. Однак, на більшості хостингових майданчиків надається SSH доступ до сервера. І на більшості * nix серверів, навіть якщо вони не є серверами баз даних, вже встановлені утиліти командного рядка для роботи з БД mysql.
Отже: нам знадобиться SSH доступ до сервера, наявність на сервері утиліт mysql і mysqldump і доступ до їх запуску.
Якщо на домашньому комп'ютері стоїть Windows, то працювати з сервером зручно через WinSCP як файлового менеджера і PuTTY як SSH клієнта. WinSCP і PuTTY можуть бути пов'язані між собою. Якщо операції з базою разові і не будуть зберігатися в скриптах, то WinSCP - не потрібен, достатньо консолі.
Щоб зробити резервну копію всієї бази потрібно виконати команду;
mysqldump --host = $ host --user = $ user -p $ pass $ db> $ sqlfile
тут:
$ Host - Сервер БД
$ User - Користувач БД
$ Pass - Пароль БД
$ Db - Ім'я БД
$ Sqlfile - Файл, в який буде збережений дамп.
Для копіювання певних таблиць бази, можна використовувати наступний синтаксис:
mysqldump --host = $ host --user = $ user -p $ pass $ db $ table1 $ table2> $ sqlfile
Щоб залити цей дамп в іншу БД, потрібно виконати команду:
mysql --host = $ host2 --user = $ user2 -p $ pass2 $ db2 <$sqlfile
# Дані другої бази, в яку копіюємо:
pass2 = 'pass2'
user2 = 'user2'
db2 = 'db2'
host2 = 'mysql2.ru'
# Ім'я файлу формуємо по масці: БД_год_месяц_день.sql
sqlfile = $ db '_' `date +% Y_% m_.`'.sql '
# Створюємо файл копії першої бази
mysqldump --host = $ host --user = $ user -p $ pass $ db> $ sqlfile
# Заливаємо файл в другу базу
mysql --host = $ host2 --user = $ user2 -p $ pass2 $ db2 <$sqlfile
Резервні копії бази краще створювати за розкладом і відразу стискати. Тому в наступний скрипт включені команди вибору директорії та архівування.
sqldump.sh:
# Шлях до папки з резервними копіями
home = '/ home / web / back / dbname'
pass = 'пароль'
user = 'користувач'
db = 'база'
host = 'сервер'
# Вибираємо підпапку: в перший день місяця складаємо в папку 'm',
# Щонеділі - в папку 'w', всі інші - в папку 'd'
if [ `date + .` =" 01 "]
then
subf = "m"
elif [ `date +% u` =" 7 "]
then
subf = "w"
else
subf = "d"
fi
# Задаємо імена sql і tar.gz файлів
sqlfile = $ db '_' `date +% Y_% m_.`'.sql '
tgzfile = 'back /' $ subf '/' $ sqlfile'.tgz '
# Створюємо дамп
mysqldump --host = $ host --user = $ user -p $ pass $ db> $ sqlfile
# архівуємо
tar -czf $ tgzfile $ sqlfile
# Видаляємо дамп
rm $ sqlfile
Якщо створюється копія великої бази даних, з великою кількістю таблиць, то може бути отримана помилка виду:
Got error: 1016: Can not open file: 'база / таблиця' (errno: 24) when using LOCK TABLES
тоді в опції mysqldump слід додати опцію -single-transaction:
mysqldump --single-transaction --host = $ host --user = $ user -p $ pass $ db> $ sqlfile