Резервное копирование данных mysql

#php #mysql #backup

#php #mysql #резервное копирование

Вопрос:

Есть ли способ с помощью PHP создать резервную копию данных только из таблиц базы данных MySQL?

Комментарии:

1. Это, конечно, возможно. Тем не менее, можете ли вы выполнить стандартную mysqldump команду в вашей операционной среде? (Будет намного меньше хлопот, если вы сможете использовать этот подход.)

2. Я могу, но mysqldump также использует структуру — не так ли?

3. @user398341 Итак, вам просто нужны необработанные данные (например: в формате CSV), а не какая-либо форма INSERT инструкций и т.д.?

Ответ №1:

Взгляните на http://davidwalsh.name/backup-mysql-database-php и удалите части, где он генерирует команды sql для повторного создания структуры.

Ответ №2:

Использовать SHOW TABLES (http://dev.mysql.com/doc/refman/5.0/en/show-tables.html ) чтобы получить каждую таблицу, зациклите их с помощью PHP с помощью SELECT * FROM -tablename- . Затем зациклите этот набор записей, используйте implode(',' $results) для получения данных (CSV). Возможно, вы захотите создать отдельный for или что-то еще для каждой таблицы, конечно.

Ответ №3:

Вы соглашаетесь с тем, что вам нужны «исходные данные (например: в формате CSV), а не какая-либо форма инструкций INSERT» — но принятый вами ответ касается именно последнего, используя, например, эту строку кода:

 $return.= 'INSERT INTO '.$table.' VALUES(';
  

Что прекрасно, если это действительно то, чего вы хотите, но на вашем месте я бы просто сделал системный вызов mysqldump вместо этого. Вы можете заставить mysqldump просто генерировать набор инструкций INSERT INTO безопасным и надежным способом, не беспокоясь о том, «я закрыл эту двойную кавычку? Должна ли здесь быть дополнительная запятая?» и т.д.

Я не знаю, почему вы также не хотите экспортировать схему — если вы укажете —add-drop-table, тогда дамп вашей базы данных станет приятным, аккуратным восстановлением всей вашей базы данных, если случится худшее — но если вы просто хотите экспортировать свои данные, и вы можете выполнить системный вызов mysqldump в вашем PHP-скрипте, вы могли бы запустить:

 mysqldump --skip-triggers --compact --no-create-info db_name | gzip -c > /tmp/db_name_backup.sql.gz
  

—no-create-info исключает все инструкции CREATE TABLE; но, как я уже сказал, я бы предпочел включить как CREATE, так и DROP, ЕСЛИ ОНИ СУЩЕСТВУЮТ, чтобы у вас была полная резервная копия данных и схемы.

Я действительно рекомендую выполнять резервное копирование с использованием сгенерированного mysqldump SQL, который MySQL изначально понимает и который правильно обрабатывает кодировку, пробелы и т.д., А не что-то вроде CSV, который AFAIK на самом деле не является каким-либо международно признанным стандартом и не может быть передан обратно в mysql для восстановления вашей базы данных позже:

 gunzip -c < /tmp/db_name_backup.sql.gz | mysql db_name
  

Если ваша резервная копия представляла собой отдельный CSV-файл для каждой отдельной таблицы, восстановление этой резервной копии становится гораздо более сложной задачей.

Комментарии:

1. Могу ли я сделать это без сжатия? Также — я использую PDO — любой пример, как мне это сделать с ним?

2. Другая проблема заключается в взаимосвязях — при восстановлении — взаимосвязь между таблицами может вызвать проблемы, если команды выполняются не в правильном порядке — поэтому ручное резервное копирование дает мне немного больше контроля над тем, как создавать резервные копии и в каком порядке использовать таблицы. есть ли возможность поместить все инструкции ALTER с ВНЕШНИМИ КЛЮЧАМИ в конец файла?

3. И извините — под необработанными данными я подразумеваю инструкции sql, которые содержат только данные — без структуры базы данных — поэтому они будут включать инструкции INSERT.

4. Вызывая mysqldump, я получаю вот что: Использование: mysqldump [ПАРАМЕТРЫ] базы данных [таблицы] ИЛИ mysqldump [ПАРАМЕТРЫ] —базы данных [ПАРАМЕТРЫ] DB1 [DB2 DB3 …] ИЛИ mysqldump [ПАРАМЕТРЫ] —все базы данных [ПАРАМЕТРЫ] Для получения дополнительных опций используйте mysqldump —help

5. Ни одна из этих проблем не связана с mysqldump. Он отлично выгружается для восстановления таблицы. Если вы получаете эти параметры, значит, вы не запускаете mysqldump с указанным мной именем db_name. Если вы не хотите, чтобы она сжималась, то вы можете просто опустить этапы gzip / gunzip, но если это большая база данных, то я бы не рекомендовал этого, поскольку вы могли бы с таким же успехом всегда сжимать дампы.