#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, но если это большая база данных, то я бы не рекомендовал этого, поскольку вы могли бы с таким же успехом всегда сжимать дампы.