Главная Новости

Mysqldump нет места на диске что делать

Опубликовано: 28.02.2017

Временами то там, то здесь подымается вопрос, как сделать запасную копию базы данных, либо как выполнить 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: http://mysql.ru/docs/man/mysqldump.html

Чтоб залить этот дамп в другую БД, необходимо выполнить команду:
mysql --host=$host2 --user=$user2 -p$pass2 $db2 < $sqlfile

Чтоб заавтоматизировать выполнение этих команд создаем файл copydb.sh (обычно заавтоматизировать нужно только создание запасных копий, а восстановление из базы — по необходимости).
# данные первой базы, из которой копируем:
pass='pass'
user='user'
db='db'
host='mysql1.ru'

# данные 2-ой базы, в которую копируем:
pass2='pass2'
user2='user2'
db2='db2'
host2='mysql2.ru'

# название файла формируем по маске: БД_год_месяц_день.sql
sqlfile=$db'_'`date +%Y_%m_%d`'.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='сервер'

# избираем подпапку: в 1-ый денек месяца складываем в папку 'm',
# каждое воскресенье - в папку 'w', все другие - в папку 'd'
if [ `date +%d` = "01" ]
then
subf="m"
elif [ `date +%u` = "7" ]
then
subf="w"
else
subf="d"
fi

cd $home

# Задаем имена sql и tar.gz файлов
sqlfile=$db'_'`date +%Y_%m_%d`'.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’t open file: ‘база/таблица’ (errno: 24) when using LOCK TABLES
тогда в функции mysqldump следует добавить опцию —single-transaction:

mysqldump --single-transaction --host=$host --user=$user -p$pass $db > $sqlfile

Новости


rss