Здравствуйте! Подскажите, как средствами PHP можно сделать дамп базы данных? Какие запросы нужно выполнить посредством mysql_query(), чтобы в этоге получился текстовый файл с полной копией данных? Спасибо.
привет, вот сегодня и я занимался таким вопросом. Может кому это покажется некрасивым и кривым методом, но он рабочий и всех устраивает. Вот что я придумал: на выходе получаем эксельный файлик. естественно в файлике только одна таблица.
Готовые не устраивают тем, что хочется написать свое. Для этого мне надо разобраться с запросами дампа и понять как их связать с PHP. Создать файл backup'a как phpMyAdmin.
PHP: <?php include($_SERVER["DOCUMENT_ROOT"]."/functions.php"); // Запоминается текущее время с точностью до милисекунд $time_start=microtime(1); // Открывается файл для записис дампа $file=fopen("dump.sql","w"); // Запись в файл информации о дампе: имя сервера и дата fwrite($file,"#######################################\n"); fwrite($file,"# Дамп базы данных сервера ".strtoupper($_SERVER['HTTP_HOST'])."\n"); fwrite($file,"# ".date($config_date_time,time())."\n"); fwrite($file,"#######################################\n\n"); // Обращение к базе данных в целью получить список всех баз данных сервера $list_dbs_query=mysql_list_dbs(); // Из полученного результата в цикле извлекается по одному названию базы данных while($row1=mysql_fetch_array($list_dbs_query)) { // Создается пустой массив, который будет содержат имена таблиц в данной базе данных $list_tables=array(); // Запись в файл информации о названии текущей таблицы fwrite($file,"# Дамп базы данных $row1[0]\n\n"); // Запись в файл запроса на создание данной базы данных fwrite($file,"CREATE DATABASE IF NOT EXISTS $row1[0];\n\n"); // Запись в файл запроса на переход к данной базе данных fwrite($file,"USE $row1[0];\n\n"); // Запрос на получение списка таблиц текущей базы данных $list_table_query=mysql_list_tables($row1[0]); // Из неассоциативного массива полученного результата добавляются элементы в пользовательский массив while($row2=mysql_fetch_array($list_table_query)) { $list_tables[]=$row2[0]; } // Излекается по одному значению из массива имен таблиц foreach($list_tables as $table) { // Запись в файл информации о дампе текущей таблицы fwrite($file,"# Дамп таблицы $table\n\n"); // Запрос на получение списка колонок таблицы $query_fields=mysql_query("SHOW FIELDS FROM $table"); // Начало создания запроса на создание таблицы $str="CREATE TABLE IF NOT EXISTS $table ("; // Массив имен колонок $fields=array(); $k=0; // Количество извлеченных колонок таблицы до цикла извлечения их из выполненного выше запроса $i=0; // Индекс массива колонок // Цикл извлечения информации о колонках из выполненного выше запроса while($row3=mysql_fetch_array($query_fields)) { $k++; // Извлечение данных о колонке $fields[$i]=$row3["Field"]; // Имя $type=$row3["Type"]; // Тип $null=$row3["Null"]; // Признак NULL $key=$row3["Key"]; // Ключевое или нет $default=$row3["Default"]; // Значение по-умолчанию $extra=$row3["Extra"]; // Дополнительные параметры (auto_increment) // К запросу на создание таблицы добавляется имя и тип колонки, а также: $str.=" '$fields[$i]' ".strtoupper($type); // Если значение NULL = NO, это свойство добавляется к запросу, иначе по-умолчанию NULL будет = YES if($null=="NO") { $str.=" NOT NULL"; } // Если эта колонка является ключевой, добавляется это свойство if($key=="PRI") { $str.=" PRIMARY KEY"; } // Если значения по-умолчанию не равняется пустым, оно добавляется к запросу if(!empty($default)) { $str.=" DEFAULT $default"; } // Если дополнительный параметр = auto_increment, он также добавляется к запросу if($extra=="auto_increment") { $str.=" AUTO_INCREMENT"; } // Если количество колонок, добавленных к запросу меньше их общего количества в данной таблице, добавляется запятая, чтобы разделить колонки в запросе if($k<mysql_num_rows($query_fields)) { $str.=","; } $i++; } // В конце запроса добавляется скобка и точка с запятой $str.=");"; // Полученный запрос записывается в файл fwrite($file,"$str\n\n"); // Запрос на получение данных из таблицы $query_data=mysql_query("SELECT * FROM $table"); // Извлечение данных из запроса while($row4=mysql_fetch_array($query_data)) { // Начало формирования запроса на вставку данных $str="INSERT INTO $table VALUES ("; // Цикл извлечения имен колонок из массива, определение их типа for($i=0;$i<count($fields);$i++) { // Определение типа колонки $field_type=mysql_field_type($query_data,$i); // Если тип текстовый, содержимое ячейки берется в кавычки (добавление в начало) if($field_type=="string" || $field_type=="blob") { $str.="'"; } // К запросу добавляется содержимое ячейки $str.=$row4[$fields[$i]]; // Если тип текстовый, содержимое ячейки берется в кавычки (добавление в конец) if($field_type=="string" || $field_type=="blob") { $str.="'"; } // Если индекс массива колонок + 1 меньше общего количесва элементов этого массива... if($i+1<count($fields)) { // Добавляется запятая, которая будет разделять данные в запросе $str.=","; } } // Запрос заканчивается скобкой и точкой с запятой $str.=");"; // Запись полученного в файл fwrite($file,"$str\n\n"); } // Запись информации о завершении дампа данной таблицы fwrite($file,"# Конец дампа таблицы $table\n\n"); // Удаление массива, содержащего колонки unset($fields); } // Удаление массива, содержащего имена таблиц в текущей базе данных unset($list_tables); // Запись в файл информации о завершении дампа базы данных fwrite($file,"# Конец дампа базы данных $row1[0]\n\n"); } fwrite($file,"#######################################\n"); // Запись в файл информации о продолжительности выполнения операции fwrite($file,"# Процесс дампа занял: ".(microtime(1)-$time_start)." сек."); // Закрытие файла fclose($file); ?> Вот что получилось у меня. Надо еше разобраться как избежать конфликта с кавычками. Дело в том, что строковые данные у меня в запросе предваряются с обоих сторон кавычками, а может получиться так, что строка тоже содержит кавычки. Как лучше это сделать? Еще надо добавить кодировку к запросам на создание баз и таблиц. Тоже не знаю как.