mysql 数据的自动或定期备份

Automated or regular backup of mysql data

我想使用<在此处插入最喜欢的 PHP 框架> / 普通 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。但它会引起各种各样的问题。其中包括

  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 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 和网络请求执行此查询,但最好通过 mysql 控制台执行。

可以使用 LOAD DATA INFILE

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

虽然此方法在遍历结果集并逐行保存到文件方面更胜一筹,但不如使用....

mysql转储

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.

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

mysql转储并非没有问题。

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.

一个经典的例子见这个问题: 其中一个 mysql 转储似乎在较早的转储完成之前开始,并使网站完全没有响应。

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.

因此 replicationSELECT INTO OUTFILEmsyqldump 的操作方式不同 理想的做法是将本地副本中的数据保持几乎最新(可以说完全同步,但有一种叫做从属的东西lag) 另一方面,如果您使用计划任务 运行 mysqldump 每 24 小时一次。想象一下如果服务器在 23 小时后崩溃会发生什么情况?

每次 运行 mysql 转储都会产生大量数据,请定期这样做,您会发现硬盘已满或文件存储费用达到顶峰.通过复制,仅将更改传递到服务器(通过使用所谓的二进制日志)

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 的最大限制。

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

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

make file 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

设置定时任务

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

就这些

祝你好运