自动或定期备份mysql数据

时间:2016-08-12 10:49:15

标签: php mysql database mysql-backup

我想使用<在此处插入最喜欢的PHP框架>定期备份我的mysql数据库中的一些表。 / plain php /我最喜欢的第二语言。我希望它能够自动化,以便以后可以在出现问题时恢复备份。

我尝试执行查询并将结果保存到文件中。结束看起来有点像这样的代码。

$sql = 'SELECT * FROM my_table ORDER id DESC';
$result = mysqli_query( $connect, $sql );  
if( mysqli_num_rows( $result ) > 0){

    $output=fopen('/tmp/dumpfile.csv','w+');

    /* loop through recordset and add that to the file */
    while( $row = mysqli_fetch_array( $result ) ) {
        fputcsv( $output, $row, ',', '"');
    }

    fclose( $output );
}

我在本地计算机上设置了一个cron作业,使用此代码访问网页。我也尝试在服务器上编写一个cronjob作为CLI运行脚本。但它造成了各种各样的问题。其中包括

  1. 有时数据不一致
  2. 该文件似乎被截断
  3. 无法将输出导入另一个数据库
  4. 有时脚本超时
  5. 我也听说过mysqldump。我试图用exec运行它,但它会产生错误。

    我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

CSV和SELECT INTO OUTFILE

http://dev.mysql.com/doc/refman/5.7/en/select-into.html

  

SELECT ... INTO OUTFILE将选定的行写入文件。专栏和   可以指定行终止符以生成特定的输出格式。

这是一个完整的例子:

SELECT * FROM my_table INTO OUTFILE '/tmp/my_table.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM test_table;

文件保存在服务器上,所选路径需要可写。虽然这个查询可以通过PHP和Web请求执行,但最好通过mysql控制台执行。

可以使用LOAD DATA INFILE

将以这种方式导出的数据导入另一个数据库

虽然这种方法优于迭代结果集并逐行保存到文件,但它不如使用....

mysqldump的

mysqldump在许多方面优于SELECT INTO OUTFILE,生成CSV只是该命令可以执行的许多操作之一。

  

mysqldump客户端实用程序执行逻辑备份,生成一个集合   可以执行以重现原始的SQL语句   数据库对象定义和表数据。它转储一个或多个MySQL   用于备份或传输到另一个SQL服务器的数据库。 mysqldump   命令还可以生成CSV,其他分隔文本或XML的输出   格式。

理想情况下,应该从shell调用mysqldump。可以在php中使用exec来运行它,但由于生成转储可能需要很长时间,具体取决于数据量,并且php脚本通常只运行30秒,您需要将其作为一个运行后台进程。

mysqldump并非没有公平分享的问题。

  

它不是一种快速或可扩展的备份解决方案   大量数据。具有大数据大小,即使备份   步骤需要一段合理的时间,恢复数据可能会很慢   因为重放SQL语句涉及用于插入的磁盘I / O,   索引创建等。

一个典型的例子看到这个问题:Server crash on MySQL backup using python其中一个mysqldump似乎在前一个完成之前启动并使网站完全没有响应。

Mysql复制

  

复制启用来自一个MySQL数据库服务器(主服务器)的数据   被复制到一个或多个MySQL数据库服务器(从属服务器)。   默认情况下,复制是异步的奴隶不需要   永久连接以接收来自主服务器的更新。取决于   在配置中,您可以复制所有选定的数据库   数据库,甚至是数据库中的选定表。

因此,replication的运作方式与SELECT INTO OUTFILEmsyqldump的运作方式不同,理想情况是将本地副本中的数据保持在最新状态(完全同步,但有一些东西)称为从属滞后)另一方面,如果您使用计划任务每​​24小时运行mysqldump一次。想象一下,如果服务器在23小时后崩溃会发生什么?

每次运行mysqldump时,您都会生成大量数据,并定期执行此操作,您会发现硬盘已满,或者您的文件存储空间已达到顶峰。使用复制时,只会将更改传递给服务器(通过使用所谓的binlog)

XtraBackup

复制的替代方法是使用Percona XtraBackup

  

Percona XtraBackup是MySQL的开源热备份工具 -   基于在备份期间不会锁定数据库的服务器。

虽然Percona,它与Mysql和Mariadb兼容。它有能力进行增量备份,缺少这是mysqldump的最大限制。

答案 1 :(得分:1)

我建议使用脚本文件而不是PHP脚本通过命令行实用程序进行数据库备份。

为商店配置制作my.ini文件

将文件 my.ini 设置为用户根目录中的默认数据库用户名和密码。所以脚本将从该文件中获取用户名,密码和主机名

[client]
user = <db_user_name>
password = <db_password>
host = <db_host>

创建名为backup.sh

的sh文件
#!/bin/sh
#
# script for get backup everyday

#change directory to your backup directory
cd /path_of_your_directory
#get backup of database of applications
mysqldump <your_database_name> tmp_db.sql;

#compress it in zip file
zip app_database-$(date +%Y-%m-%d).sql.zip tmp_db.sql;

#remove  sql file
rm -rf tmp_db.sql;

为sh.file赋予可执行权限

chmod +x backup.sh

设置Cronjob

sh /<script_path>/backup.sh >/dev/null 2>&1

多数人

古德勒克