How to Backup MySQL Database using PHP
Dynamically creating database backup via program will be hand in many a situations. We can schedule the backup process periodically by using CRON jobs.
Taking the database backup using PHP programming is easy. In this tutorial, we are going to learn how to backup MySQL database with a simple core PHP code.
First, I get the database connection object to get the table schema and data to be dumped into a file. I read all the table names from the database and store into an array.
Then, I iterate the array of database tables to prepare the SQL script for the data/structure. This SQL script will be written into a file which will be downloaded to the user’s browser and removed from the target.
Getting Database Table Names
The code shows how to get the database connection and set the default character set before executing queries. Since we are dumping the database structure and the data, we need to be careful about the consistency.
By setting the default character set, it tells the database server about the character encoding.
The SHOW TABLES statement is used to fetch the table names. The table names are stored in an array which will be iterated to prepare the backup SQL script for the database structure and the data.
set_charset("utf8"); // Get All Table Names From the Database $tables = array(); $sql = "SHOW TABLES"; $result = mysqli_query($conn, $sql); while ($row = mysqli_fetch_row($result)) < $tables[] = $row[0]; >?>
Create SQL Script for Table Data/Structure
After fetching the list of the database table name in an array, I loop through this array to generate the SQL script. For each loop iteration, I have generated the SQL script for creating the table structure and dumping data into the table.
The SHOW CREATE TABLE statement is used to get the SQL for creating a table structure. Then, I get the column name and data to prepare the SQL for dumping data.
else < $sqlScript .= '""'; >if ($j < ($columnCount - 1)) < $sqlScript .= ','; >> $sqlScript .= ");\n"; > > $sqlScript .= "\n"; > ?>
Save and Download Database Backup File
After preparing the SQL script for the database table and the structure, it will be written into a backup file which is created dynamically in the specified target.
Then, this file will be downloaded to the user’s browser and removed from the target location. The code for saving and downloading the database backup file is,
Элементарные PHP скрипты для резервного копирования данных
В ответ недавнему топику о бэкапах на Bash. Топик полезный, без сомнений, однако я хочу продемонстрировать более гибкий способ…
Основной недостаток приведенного способа в топике выше — ненадобность. Ну честно, кому надо бэкапить файлы и базу одновременно? Т.е. бэкапить каждый день и файлы и базу — глупо, но и делать раз в месяц это глупо. Поэтому мой пример я разбил на 2 части. Отдельно делаем бэкап базы ежедневно и отдельно делаем бэкап файлов раз в неделю.
Соответственно, нам понадобится php на сервере. Что в наше время уже не роскошь, а банальщина.
Итак, для себя я решил, что локально бэкапы хранятся в /usr/backup/
Создаем php скрипт /usr/backup/backup_db:
#!/usr/local/bin/php
$exс=array(‘information_schema’, ‘mysql’);
$db_pass=’password’;
$db_user=’root’;
system(‘mkdir -p /usr/backup/mysql/’.date(‘d.m.Y’).’/’);
$db=mysql_connect(«localhost», $db_user, $db_pass);
$sql=mysql_query(«SHOW DATABASES»);
while($a=mysql_fetch_assoc($sql)) $base=$a[‘Database’];
if(!in_array($base, $exс)) exec(‘/usr/local/bin/mysqldump -u’.$db_user.’ -p’.$db_pass.’ —opt ‘.$base.’ | /usr/bin/gzip > /usr/backup/mysql/’.date(‘d.m.Y’).’/’.$base.’.gz’);
>
>
Как видим, все просто и примитивно. Отмечу, что $exс — массив с исключениями. Сюда добавляем базы, которые не хотим бэкапить каждый день. Остальные базы, что видет пользователь $db_user, мы бэкапим, причем каждую отдельно и кладем их в директорию /usr/backup/mysql/дата/база.gz
Это намного удобней, чем создавать под каждый проект отдельный файл бэкапов. Например, у меня 2 сервера и на каждом 10+ проектов. Не так и много, но кол-во постоянно обновляется. Кто-то ушел, кто-то пришел, появился новый сервер итп. Мне достаточно скопировать один файл и бэкапы всех проектов собираются автоматом. Это удобно.
Соответственно добавляем в крон строку (для FreeBSD. Для Linux, насколько помню, другая. Пожалуйста, поправте, линуксойды):
0 5 * * * root /usr/backup/backup_db
Которая говорит о том, что каждый день в 05:00 собираем новый бэкап базы и гзипем его.
Ну и не забываем про код и картинки… /usr/backup/backup_www…
У кого как, у меня все проекты лежат в /usr/local/www/…
#!/usr/local/bin/php
$exс=array(‘test.ru’);
$dir=’/usr/local/www/’;
system(‘mkdir -p /usr/backup/www/’.date(‘d.m.Y’).’/’);
$d=opendir($dir);
while(($file=readdir($d))!==false) if($file!=’.’ && $file!=’..’ && is_dir($dir.’/’.$file) && !in_array($file, $exс)) exec(‘tar cpzvf /usr/backup/www/’.date(‘d.m.Y’).’/’.$file.’.tar.gz —exclude=*.log* —exclude=*.svn* ‘.$dir.$file);
>
>
Как видим, скрипт бэкапт все, кроме log файлов и svn файлов. Насчет svn может быть я и не прав, но пока проблем с этим небыло. Так же массив $exс является исключениями.
Для данного скрипта в крон пишем несколько другое правило:
0 5 * * 6 root /usr/backup/backup_www
таким образом бэкапим скрипты и статику в 5 утра в выходной.
Я использую данные скрипты не только на своих серверах, но и на клиентских. Правда, на клиентских дополняю их еще и копированием архивов на третьи сервера для пущего страху. На некоторых серверах отдельные таблицы в нужных базах бэкаплю каждый час итп. PHP дает гибкость, которой так не хватает в bash`е.
p.s. после добавления данных в крон не забываем его ребутить. И не забываем ставить chmod +x для backup_db и backup_www
p.p.s. любые дополнения и критика приветствуются.
Простой бэкап сайта средствами PHP
В этой статье я попытаюсь разъяснить создание простого скрипта для полного бэкапа сайта (файлы + база данных MySQL) средствами PHP, который будет отправлять отчет на почту и удалять старые архивы.
Для начала нужен FTP доступ к файловой системе, где расположен сайт. Предположим, что сайт у нас находится по адресу /home/my_site/www. Создаем папку backup в my_site:
И конечно же, сам файл backup.php:
touch /home/my_site/www/backup.php
Открываем backup.php любым редактором и создаем переменные:
$backup_folder = '/home/my_site/backup'; // куда будут сохранятся файлы $backup_name = 'my_site_backup_' . date("Y-m-d"); // имя архива $dir = '/home/my_site/www'; // что бэкапим $delay_delete = 30 * 24 * 3600; // время жизни архива (в секундах) $db_host = 'example.com'; $db_user = 'root'; $db_password = 'password'; $db_name = 'database'; $mail_to = 'my_email@example.com'; $mail_subject = 'Site backup'; $mail_message = ''; $mail_headers = 'MIME-Version: 1.0' . "\r\n"; $mail_headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $mail_headers .= 'To: me ' . "\r\n"; $mail_headers .= 'From: my_site ' . "\r\n";
Пишем функцию для бэкапа файлов:
function backupFiles($backup_folder, $backup_name, $dir) < $fullFileName = $backup_folder . '/' . $backup_name . '.tar.gz'; shell_exec("tar -cvf " . $fullFileName . " " . $dir . "/* "); return $fullFileName; >
function backupDB($backup_folder, $backup_name) < $fullFileName = $backup_folder . '/' . $backup_name . '.sql'; $command = 'mysqldump -h' . $db_host . ' -u' . $db_user . ' -p' . $db_password . ' ' . $db_name . ' >' . $fullFileName; shell_exec($command); return $fullFileName; >
И для удаления старых архивов:
function deleteOldArchives($backup_folder, $delay_delete) < $this_time = time(); $files = glob($backup_folder . "/*.tar.gz*"); $deleted = array(); foreach ($files as $file) < if ($this_time - filemtime($file) >$delay_delete) < array_push($deleted, $file); unlink($file); >> return $deleted; >
В общем все, осталось выполнить данные функции и отправить письмо:
$start = microtime(true); // запускаем таймер $deleteOld = deleteOldArchives($backup_folder, $delay_delete); // удаляем старые архивы $doBackupFiles = backupFiles($backup_folder, $backup_name, $dir); // делаем бэкап файлов $doBackupDB = backupDB($backup_folder, $backup_name); // и базы данных // добавляем в письмо отчеты if ($doBackupFiles) < $mail_message .= 'site backuped successfully
'; $mail_message .= 'Files: ' . $doBackupFiles . '
'; > if ($doBackupDB) < $mail_message .= 'DB: ' . $doBackupDB . '
'; > if ($deleteOld) < foreach ($deleteOld as $val) < $mail_message .= 'File deleted: ' . $val . '
'; > > $time = microtime(true) - $start; // считаем время, потраченое на выполнение скрипта $mail_message .= 'script time: ' . $time . '
'; mail($mail_to, $mail_subject, $mail_message, $mail_headers); // и отправляем письмо
Простой бэкап сайта средствами PHP
В этой статье я попытаюсь разъяснить создание простого скрипта для полного бэкапа сайта (файлы + база данных MySQL) средствами PHP, который будет отправлять отчет на почту и удалять старые архивы.
Для начала нужен FTP доступ к файловой системе, где расположен сайт. Предположим, что сайт у нас находится по адресу /home/my_site/www. Создаем папку backup в my_site:
И конечно же, сам файл backup.php:
touch /home/my_site/www/backup.php
Открываем backup.php любым редактором и создаем переменные:
$backup_folder = '/home/my_site/backup'; // куда будут сохранятся файлы $backup_name = 'my_site_backup_' . date("Y-m-d"); // имя архива $dir = '/home/my_site/www'; // что бэкапим $delay_delete = 30 * 24 * 3600; // время жизни архива (в секундах) $db_host = 'example.com'; $db_user = 'root'; $db_password = 'password'; $db_name = 'database'; $mail_to = 'my_email@example.com'; $mail_subject = 'Site backup'; $mail_message = ''; $mail_headers = 'MIME-Version: 1.0' . "\r\n"; $mail_headers .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; $mail_headers .= 'To: me ' . "\r\n"; $mail_headers .= 'From: my_site ' . "\r\n";
Пишем функцию для бэкапа файлов:
function backupFiles($backup_folder, $backup_name, $dir) < $fullFileName = $backup_folder . '/' . $backup_name . '.tar.gz'; shell_exec("tar -cvf " . $fullFileName . " " . $dir . "/* "); return $fullFileName; >
function backupDB($backup_folder, $backup_name) < $fullFileName = $backup_folder . '/' . $backup_name . '.sql'; $command = 'mysqldump -h' . $db_host . ' -u' . $db_user . ' -p' . $db_password . ' ' . $db_name . ' >' . $fullFileName; shell_exec($command); return $fullFileName; >
И для удаления старых архивов:
function deleteOldArchives($backup_folder, $delay_delete) < $this_time = time(); $files = glob($backup_folder . "/*.tar.gz*"); $deleted = array(); foreach ($files as $file) < if ($this_time - filemtime($file) >$delay_delete) < array_push($deleted, $file); unlink($file); >> return $deleted; >
В общем все, осталось выполнить данные функции и отправить письмо:
$start = microtime(true); // запускаем таймер $deleteOld = deleteOldArchives($backup_folder, $delay_delete); // удаляем старые архивы $doBackupFiles = backupFiles($backup_folder, $backup_name, $dir); // делаем бэкап файлов $doBackupDB = backupDB($backup_folder, $backup_name); // и базы данных // добавляем в письмо отчеты if ($doBackupFiles) < $mail_message .= 'site backuped successfully
'; $mail_message .= 'Files: ' . $doBackupFiles . '
'; > if ($doBackupDB) < $mail_message .= 'DB: ' . $doBackupDB . '
'; > if ($deleteOld) < foreach ($deleteOld as $val) < $mail_message .= 'File deleted: ' . $val . '
'; > > $time = microtime(true) - $start; // считаем время, потраченое на выполнение скрипта $mail_message .= 'script time: ' . $time . '
'; mail($mail_to, $mail_subject, $mail_message, $mail_headers); // и отправляем письмо