我想使用<在此处插入最喜欢的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
运行它,但它会产生错误。
我该如何解决这个问题?
答案 0 :(得分:2)
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在许多方面优于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数据库服务器(从属服务器)。 默认情况下,复制是异步的奴隶不需要 永久连接以接收来自主服务器的更新。取决于 在配置中,您可以复制所有选定的数据库 数据库,甚至是数据库中的选定表。
因此,replication的运作方式与SELECT INTO OUTFILE
或msyqldump
的运作方式不同,理想情况是将本地副本中的数据保持在最新状态(完全同步,但有一些东西)称为从属滞后)另一方面,如果您使用计划任务每24小时运行mysqldump
一次。想象一下,如果服务器在23小时后崩溃会发生什么?
每次运行mysqldump时,您都会生成大量数据,并定期执行此操作,您会发现硬盘已满,或者您的文件存储空间已达到顶峰。使用复制时,只会将更改传递给服务器(通过使用所谓的binlog)
复制的替代方法是使用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
多数人
古德勒克