自动或定期备份 mysql 数据
Posted
技术标签:
【中文标题】自动或定期备份 mysql 数据【英文标题】:Automated or regular backup of mysql data 【发布时间】:2016-12-19 08:40:39 【问题描述】:我想使用 /plain php/我的第二喜欢的语言对我的 mysql 数据库中的一些表进行定期备份。我希望它是自动化的,以便以后可以在出现问题时恢复备份。
我尝试执行查询并将结果保存到文件中。最终得到的代码看起来有点像这样。
$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
运行它,但它会产生错误。
我该如何解决这个问题?
【问题讨论】:
【参考方案1】: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 服务器的数据库。 mysql转储 命令还可以生成 CSV、其他分隔文本或 XML 格式的输出 格式。
理想情况下 mysqldump 应该从你的 shell 中调用。可以在 php 中使用exec 来运行它,但由于生成转储可能需要很长时间,具体取决于数据量,并且 php 脚本通常只运行 30 秒,因此您需要将其作为后台进程运行.
mysqldump 并非没有问题。
它不是用于备份的快速或可扩展的解决方案 大量的数据。数据量大,即使备份 步骤需要合理的时间,恢复数据可能会很慢 因为重放 SQL 语句涉及插入的磁盘 I/O, 索引创建等等。
一个经典的例子请看这个问题:Server crash on MySQL backup using python 其中一个 mysqldump 似乎在前一个完成之前就开始了,并使网站完全没有响应。
Mysql 复制
复制支持来自一台 MySQL 数据库服务器(主服务器)的数据 复制到一个或多个 MySQL 数据库服务器(从属服务器)。 复制默认是异步的;奴隶不需要 永久连接以接收来自主服务器的更新。根据 配置,可以复制所有数据库,选中 数据库,甚至是数据库中的选定表。
因此,replication 与 SELECT INTO OUTFILE
或 msyqldump
的操作方式不同,最好将本地副本中的数据保持在最新状态(可以说完美同步,但存在所谓的从属滞后)另一方面,如果您使用计划任务每 24 小时运行一次mysqldump
。想象一下如果服务器在 23 小时后崩溃会发生什么?
每次运行 mysqldump 时都会产生大量数据,请定期执行此操作,您会发现硬盘已满或文件存储费用达到顶峰。通过复制,只有更改被传递到服务器(通过使用所谓的 binlog)
XtraBackup
复制的替代方法是使用Percona XtraBackup。
Percona XtraBackup 是一个开源的 MySQL 热备份工具 - 备份期间不会锁定数据库的基于服务器的服务器。
虽然是 Percona,但它与 Mysql 和 Mariadb 兼容。它有做增量备份的能力,这是mysqldump最大的限制。
【讨论】:
【参考方案2】:我建议通过命令行实用程序使用脚本文件而不是 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
就是这样
祝你好运
【讨论】:
以上是关于自动或定期备份 mysql 数据的主要内容,如果未能解决你的问题,请参考以下文章