Автоматическое или регулярное резервное копирование данных mysql
Я хочу регулярно выполнять резервное копирование некоторых таблиц в моей базе данных mysql, используя <insert favorite PHP framework here> / plain php / my второй любимый язык. Я хочу, чтобы он был автоматизирован, чтобы впоследствии можно было восстановить резервную копию, если что-то пойдет не так.
Я попытался выполнить запрос и сохранить результаты в файл. Закончился код, который выглядит примерно так.
$sql = 'SELECT * FROM my_table ORDER id DESC'; $result = mysqli_query( $connect, $sql ); if( mysqli_num_rows( $result ) > 0){ $output=fopen('/tmp/dumpfile.csv','w+'); /* loop through recordset and add that to the file */ while( $row = mysqli_fetch_array( $result ) ) { fputcsv( $output, $row, ',', '"'); } fclose( $output ); }
Я установил задание cron на моем локальном компьютере, чтобы попасть на веб-страницу с помощью этого кода. Я также попытался написать cronjob на сервере, чтобы запустить сценарий как CLI. Но это вызывает всевозможные проблемы. К ним относятся
- Иногда данные несовместимы
- Файл выглядит усеченным
- Выход не может быть импортирован в другую базу данных
- Иногда сценарий истекает
Я также слышал о mysqldump
. Я попытался запустить его с помощью exec
но он вызывает ошибку.
Как я могу это решить?
2 Solutions collect form web for “Автоматическое или регулярное резервное копирование данных mysql”
CSV и SELECT INTO OUTFILE
http://dev.mysql.com/doc/refman/5.7/en/select-into.html
SELECT … INTO OUTFILE записывает выбранные строки в файл. Терминаторы столбцов и строк могут быть указаны для создания определенного формата вывода.
Вот полный пример:
SELECT * FROM my_table INTO OUTFILE '/tmp/my_table.csv' FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n' FROM test_table;
Файл сохраняется на сервере, и выбранный путь должен быть доступен для записи. Хотя этот запрос может быть выполнен через PHP и веб-запрос, он лучше всего выполняется через консоль mysql.
Данные, экспортированные таким образом, могут быть импортированы в другую базу данных с использованием LOAD DATA INFILE
Хотя этот метод превосходит итерацию через набор результатов и сохранение в файл по строкам, это не так хорошо, как использование ….
туздЫшпр
mysqldump превосходит SELECT INTO OUTFILE во многих отношениях, создание CSV – это лишь одна из многих вещей, которые может выполнять эта команда.
Утилита клиента mysqldump выполняет логическое резервное копирование, создавая набор операторов SQL, которые могут быть выполнены для воспроизведения исходных определений объектов базы данных и табличных данных. Он удаляет одну или несколько баз данных MySQL для резервного копирования или передачи на другой SQL-сервер. Команда mysqldump также может генерировать выходные данные в CSV, другом разделительном тексте или формате XML.
В идеале mysqldump должен быть вызван из вашей оболочки. Можно использовать exec в php для его запуска, но так как создание дампа может занять много времени в зависимости от объема данных, а скрипты php обычно выполняются только в течение 30 секунд, вам нужно будет запустить его как фоновый процесс.
mysqldump не лишен достаточной доли проблем.
Он не предназначен для быстрого или масштабируемого решения для резервного копирования значительных объемов данных. При больших размерах данных, даже если шаг резервного копирования занимает разумное время, восстановление данных может быть очень медленным, потому что повторение операторов SQL связано с дисковым вводом-выводом для вставки, создания индекса и т. Д.
Классический пример см. В этом вопросе: сбой сервера на резервной копии MySQL с использованием python, где один mysqldump, кажется, начинается до того, как предыдущий закончен, и полностью отменил веб-сайт.
Репликация Mysql
Репликация позволяет копировать данные с одного сервера базы данных MySQL (мастер) на один или несколько серверов баз данных MySQL (подчиненных). По умолчанию репликация является асинхронной; ведомые устройства не должны постоянно подключаться для получения обновлений от ведущего устройства. В зависимости от конфигурации вы можете реплицировать все базы данных, выбранные базы данных или даже выбранные таблицы в базе данных.
Таким образом, репликация работает иначе, чем SELECT INTO OUTFILE
или msyqldump
. Идеально хранить данные в локальной копии почти до даты (было бы прекрасно сказано в синхронизации, но есть что-то, называемое slave lag). С другой стороны, если вы используете запланированную задачу для запуска mysqldump
один раз каждые 24 часа. Представьте, что может произойти, если сервер выйдет через 23 часа?
Каждый раз, когда вы запускаете mysqldump, вы производите большой объем данных, продолжайте делать это регулярно, и вы обнаружите, что ваш жесткий диск заполнен или ваши счета хранятся на крыше. При репликации только изменения передаются на сервер (с помощью так называемого binlog)
XtraBackup
Альтернативой репликации является использование Percona XtraBackup .
Percona XtraBackup – это утилита для резервного копирования с открытым исходным кодом для MySQL-серверов, которая не блокирует вашу базу данных во время резервного копирования.
Хотя Percona, он совместим с Mysql и Mariadb. Он имеет возможность делать инкрементные резервные копии, отсутствие которых является самым большим ограничением mysqldump.
Я предлагаю получить резервное копирование базы данных с помощью командной строки с использованием файла сценария вместо PHP-скрипта.
Сделать файл my.ini для конфигураций хранилища
make file my.ini для имени пользователя и пароля db по умолчанию в корневом каталоге пользователя. поэтому сценарий будет принимать имя пользователя, пароль и имя хоста из этого файла
[client] user = <db_user_name> password = <db_password> host = <db_host>
Создайте файл sh под названием backup.sh
#!/bin/sh # # script for get backup everyday #change directory to your backup directory cd /path_of_your_directory #get backup of database of applications mysqldump <your_database_name> tmp_db.sql; #compress it in zip file zip app_database-$(date +%Y-%m-%d).sql.zip tmp_db.sql; #remove sql file rm -rf tmp_db.sql;
Предоставить исполняемое разрешение sh.file
chmod +x backup.sh
Set Cronjob
sh /<script_path>/backup.sh >/dev/null 2>&1
Это все
Удачи