首先暂时不考虑python 如何实现,先实现mysql备份
两个思路 mysqldump + binlog 逻辑备份 与 xtraback 物理备份
考虑到实际需要,物理备份还原是通过删除原数据库从新创建并还原数据,这种方式对于频繁还原来说并不合适,
逻辑备份对于数据库本身无操作,只是操作对应sql语句,比较后决定使用第一种mysqldump + binlog的方式实现(先确认binlog可用)。
第一次通过命令行执行mysqldump进行全量备份
mysqldump -uroot -p12345 --single-transaction --master-data=1 testdb > /data/dev.sql
如果只表结构备份 -d 参数:
mysqldump -uroot -p12345 --single-transaction --master-data=1 -d testdb > /data/dev.sql
-u username -p password -P port -h host testdb 需要备份的库名 如果全库的话 --all-databases
默认情况下mysqldump会对表加锁,而使用--single-transaction会将备份的操作放在一个事务中进行,从而避免了加表锁。
--master-data=1会在dump出的sql文件中记录Binlog文件和位置。使用--master-data=1参数后sql文件中会出现下面这行:
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000001', MASTER_LOG_POS=155;
binlog.000001 文件用于后续增量备份时候进行切片,命令行执行如下
mysqlbinlog --start-post=155 binlog.000001 > /data/binlog.000001.sql
命令实现 通过pos点 155 开始到最新的日志 转成sql脚本。
或者通过时间进行切片转换sql脚本
mysqlbinlog --start-datetime='2022-01-1 00:00:00' /data/binlog.000001 > binlog.000001.sql
数据库语句:
查看是否开启 binlog
show variables like 'log_bin'
查看binglog文件
show binary logs
查看当前正在写入的binlog文件
show master status
数据库还原可以通过命令行操作对应文件
mysql -uroot -p123456 testdb < binlog.000001.sql
python实现可以使用os.system执行shell 命令
os.system("mysql -uroot -p12345 testdb < binlog.000001.sql ")