php – 自动或定期备份mysql数据

我想使用<在此处插入最喜欢的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运行脚本.但它造成了各种各样的问题.这些包括

>有时数据不一致
>该文件似乎被截断
>输出无法导入另一个数据库
>有时脚本会超时

我也听说过MysqLdump.我试图用exec运行它,但它会产生错误.

我怎么解决这个问题?

解决方法:

CSV和SELECT INTO OUTFILE

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

SELECT … INTO OUTFILE writes the selected rows to a file. Column and
line terminators can be specified to produce a specific output format.

这是一个完整的例子:

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只是该命令可以做的许多事情之一.

The MysqLdump client utility performs logical backups, producing a set
of sql statements that can be executed to reproduce the original
database object deFinitions and table data. It dumps one or more MysqL
databases for backup or transfer to another sql server. The MysqLdump
command can also generate output in CSV, other delimited text, or XML
format.

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

MysqLdump并非没有它的公平份额的问题.

It is not intended as a fast or scalable solution for backing up
substantial amounts of data. With large data sizes, even if the backup
step takes a reasonable time, restoring the data can be very slow
because replaying the sql statements involves disk I/O for insertion,
index creation, and so on.

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

MysqL复制

Replication enables data from one MysqL database server (the master)
to be copied to one or more MysqL database servers (the slaves).
Replication is asynchronous by default; slaves do not need to be
connected permanently to receive updates from the master. Depending on
the configuration, you can replicate all databases, selected
databases, or even selected tables within a database.

因此,replication的运行方式与SELECT INTO OUTFILE或msyqldump的运行方式不同.理想的是保持本地副本中的数据几乎是最新的(完全同步,但有一些称为slave lag)另一方面,如果你使用一个计划任务来运行MysqLdump每24小时一次.想象一下,如果服务器在23小时后崩溃会发生什么?

每次运行MysqLdump时,你都会生成大量数据,定期继续操作,你会发现你的硬盘已经填满,或者你的文件存储费用已经达到顶峰.使用复制时,只会将更改传递给服务器(通过使用所谓的binlog)

XtraBackup

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

Percona XtraBackup is an open-source hot backup utility for MysqL
based servers that doesn’t lock your database during the backup.

虽然Percona,它与MysqL和Mariadb兼容.它具有执行增量备份的能力,缺少这是MysqLdump的最大限制.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...