自动或定期备份mysql数据

我想定期备份我的MySQL数据库中的一些表,使用<在这里插入喜欢的PHP框架> /普通的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. 有时脚本超时

我也听说过mysqldump 。 我试图用exec运行它,但它会产生一个错误。

我该如何解决这个问题?

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; 

该文件保存在服务器上,select的path需要可写。 尽pipe这个查询可以通过PHP和Web请求来执行,但最好通过mysql控制台执行。

以这种方式导出的数据可以使用LOAD DATA INFILE导入到另一个数据库中

虽然这种方法是优越的遍历结果集并逐行保存到文件, 但它不如使用….

mysqldump的

mysqldump在很多方面优于SELECT INTO OUTFILE,生成CSV只是这个命令可以做的许多事情之一。

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

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

mysqldump不是没有它的公平份额的问题。

它不是作为备份大量数据的快速或可扩展的解决scheme。 对于较大的数据大小,即使备份步骤需要一段合理时间,恢复数据也可能非常缓慢,因为重放SQL语句涉及用于插入的磁盘I / O,索引创build等等。

一个经典的例子看到这个问题: 服务器崩溃在MySQL备份使用python ,其中一个mysqldump似乎开始之前,先前已完成,并使网站完全无响应。

Mysql复制

通过复制,可以将来自一个MySQL数据库服务器(主服务器)的数据复制到一个或多个MySQL数据库服务器(从服务器)。 默认情况下复制是asynchronous的; 从站不需要永久连接以接收来自主站的更新。 根据configuration,可以复制数据库中的所有数据库,选定数据库甚至选定的表。

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

每次运行mysqldump时,都会产生大量的数据,请定期进行操作,您会发现硬盘已满,或者您的文件存储帐单正在触顶。 使用复制时,只需将更改传递到服务器(通过使用所谓的二进制日志)

XtraBackup

复制的另一种方法是使用Percona XtraBackup 。

Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会locking您的数据库。

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

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

为商店configuration制作my.ini文件

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

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

创build一个名为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 

就这样

祝你好运