Наверняка, каждый программист хоть раз задумывался о сохранности его кода и базы данных. И наверняка, каждый придумывал какие-то изощренные способы резервирования данных. С исходными кодами и файлами дело обстоит довольно-таки просто — достаточно иметь одну резервную копию у себя на компьютере. А вот с бекапами базы данных немного сложней, поскольку отделаться одним бекапом не получится из-за постоянного обновления базы данных. Но и каждый день делать руками копию бд тоже не очень удобно. И в этой статье я и хочу рассказать о том, как можно автоматизировать процесс создания резервной копии базы данных. Все просто, для этого там необходимо написать один скрипт и установить его на выполнение на cron. Обычно такие скрипты устанавливают на выполнение один раз в сутки — ночью.
Ниже приведет код скрипта, который нужно установить на cron, с подробными комментариями:
<?php // задаем побольше времени для выполнения скрипта set_time_limit(300); // ===>>>подключение к БД define("HOST", ""); define("USER", "best_like"); define("PASSWORD", "best_like"); define("DB_NAME", "best_like"); $db_connect = mysql_connect(HOST, USER, PASSWORD, TRUE); mysql_selectdb(DB_NAME, $db_connect); mysql_set_charset('utf8'); // <<<=== // ===>>>Получаем список всех таблиц $tables = array(); $result = mysql_query('SHOW TABLES'); while($row = mysql_fetch_row($result)){ $tables[] = $row[0]; } // <<<=== // создаем и открываем файл для записи дампа $file = fopen('db_backup_'.date('Y_m_d').'.sql','w+'); // Перебираем все таблицы foreach($tables as $table){ // все данные из таблицы $result = mysql_query('SELECT * FROM '.$table); // количество записей в таблице $countFields = mysql_num_fields($result); // получаем sql-код для создания таблицы $createTable = mysql_fetch_row(mysql_query('SHOW CREATE TABLE '.$table)); // записываем в переменную sql-код $sql.= "\n".$createTable[1].";\n\n"; // перебираем все записи в таблице for ($i = 0; $i < $countFields; $i++){ while($row = mysql_fetch_row($result)){ // ===>>> записываем в переменную sql-код для записи данных $sql.= 'INSERT INTO '.$table.' VALUES('; // перебираем все поля таблицы for($f=0; $f<$countFields; $f++){ // экранируем спецсимволы (добавляем слеши) $row[$f] = addslashes($row[$f]); // если есть значение, то записываем его if (isset($row[$f])) { $sql.= '"'.$row[$f].'"' ; }else{ $sql.= '""'; } // если поле не последнее добавляем запятую if ($f<($countFields-1)) { $sql.= ','; } } $sql.= ");\n"; // <<<=== // записываем в файл, то что скопилось в переменной fwrite($file, $sql); // очищаем переменную $sql = ""; } } // делаем красиво (отступ) $sql.="\n"; } // закрываем и сохраняем файл fclose($file); ?>
Если говорить о кроне, то есть вариант лучше:
exec(‘mysqldump -u пользователь_БД -p имя_БД > имя_файла’);