MySQL数据库副本

Dil*_*ary 3 mysql mysqldump backup python

我需要使用 Python 程序在 MySQL 服务器中创建数据库的副本。

经过一番研究,我发现 mysqldump 是更好的方法:

import subprocess

command_to_copy_db = f"mysqldump -h {SQL_DB_HOST} -P 3306 -u {SQL_DB_USER} -p{SQL_DB_PASSWORD} {src_database_name} | mysql -u root -p{SQL_DB_PASSWORD} {dest_database_name}"


backup_db_command_result = subprocess.run(command_to_copy_db, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                                          shell=True, text=True)
Run Code Online (Sandbox Code Playgroud)

我的查询:

这种方法有什么问题吗?或者有没有更好的方法来做到这一点?

Bil*_*win 7

是的,您正在做的事情对于较小的数据库来说是一个很好的解决方案。如果您的数据库变得更大(例如,1GB 或更大),您可能会发现使用 mysqldump 太慢。对于较大的数据库,请使用Percona XtraBackup或文件系统快照。

将 mysqldump 作为子进程执行是创建转储输出的正确方法。有些人试图通过直接编写 SQL 查询来复制 mysqldump 的功能,但他们低估了 mysqldump 的复杂程度。它处理表、视图、存储过程、触发器、事件。它处理包含特殊字符的标识符。它正确支持 NULL 和字符集。它可以压缩数据。它可以处理任何大小的数据库(尽管速度很慢)。

我建议对命令的改进是避免将用户名和密码放在子进程命令的参数中。请改用MySQL 选项文件,并将用户名和密码放入该文件中。

如果您使用 InnoDB 表,还可以使用--single-transactionmysqldump 选项。它有助于避免表上的长期锁定。