登录mysql查看是否开启binlog
show variables like 'log_%'
window修改my.ini, Linux修改my.cnf
[mysqld]
server_id=2
log_bin=mysql-bin
binlog_format=ROW
查看binlog日志事件节点
show binlog events in 'binlog.000001'
查看binlog当前节点
show master status
终止当前binlog,并生成新的binlog
flush logs
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql恢复binlog数据
mysqlbinlog -d wzn_census --start-position=219 --stop-position=517 mysql-bin.000001 | mysql -uroot -p123456
mysqlbinlog -d wzn_census --start-datetime="2022-11-22 13:56:00" --stop-datetime="2022-11-22 13:58:00" mysql-bin.000001 > bin.sql [mysql -uroot -p123456 < bin.sql]
mysqlbinlog 运行过程中如果出现unknown variable 'default-character-set=utf8mb4'异常,可以再该命令后加--no-defaults参数解决:mysqlbinlog --no-defaults
导出可视化sql: mysqlbinlog mysql-bin.000001 -–base64-output=decode-rows -v > tmp.sql
=========================
binlog2sql恢复binlog数据 git clone https://github.com/danfengcao/binlog2sql.git
所需环境 Python 3.9.5 pip 22.0.4
pip install -r requirements.txt
常见问题1: Access denied for user 'root'@'localhost' (using password:YES)
update user set host = '%' where user = 'root';
flush privileges;
常见问题2: python 连接 mysql 数据库出现 keyerror: 255
pip install --upgrade PyMySQL
常见问题3: ModuleNotFoundError: No module named 'pymysql.util'
pip uninstall pymsql
pip install pymysql==0.9.3
常见问题4:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb in position 39: invalid start byte
修改binlog2sql源码中的binlog2sql_util.py指定字符编码的代码 block.decode('utf-8','ignore')
**mysql连接配置**
mysql -h host -P port -u user -p password
**解析模式**
--stop-never 持续解析binlog。可选。默认False,同步至执行命令时最新的binlog位置。
-K, --no-primary-key 对INSERT语句去除主键。可选。默认False
-B, --flashback 生成回滚SQL,可解析大文件,不受内存限制。可选。默认False。与stop-never或no-primary-key不能同时添加。
--back-interval -B模式下,每打印一千行回滚SQL,加一句SLEEP多少秒,如不想加SLEEP,请设为0。可选。默认1.0。
**解析范围控制**
--start-file 起始解析文件,只需文件名,无需全路径 。必须。
--start-position/--start-pos 起始解析位置。可选。默认为start-file的起始位置。
--stop-file/--end-file 终止解析文件。可选。默认为start-file同一个文件。若解析模式为stop-never,此选项失效。
--stop-position/--end-pos 终止解析位置。可选。默认为stop-file的最末位置;若解析模式为stop-never,此选项失效。
--start-datetime 起始解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
--stop-datetime 终止解析时间,格式'%Y-%m-%d %H:%M:%S'。可选。默认不过滤。
**对象过滤**
-d, --databases 只解析目标db的sql,多个库用空格隔开,如-d db1 db2。可选。默认为空。
-t, --tables 只解析目标table的sql,多张表用空格隔开,如-t tbl1 tbl2。可选。默认为空。
--only-dml 只解析dml,忽略ddl。可选。默认False。
--sql-type 只解析指定类型,支持INSERT, UPDATE, DELETE。多个类型用空格隔开,如--sql-type INSERT DELETE。可选。默认为增删改都解析。用了此参数但没填任何类型,则三者都不解析。
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p123456 -d wzn_census -t sys_event_counts --start-file mysql-bin.000001 --start-position 219 --stop-position 517 -B > tmp.sql
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p123456 -d wzn_census -t sys_house_info_import --start-file="mysql-bin.000001" --start-datetime="2022-11-22 13:56:00" --stop-datetime="2022-11-22 13:58:00" -B | mysql -uroot -p123456
======================
MyFlash恢复binlog数据 git clone https://github.com/Meituan-Dianping/MyFlash.git
安装依赖:
yum install gcc* pkg-config glib2 libgnomeui-devel -y
开始安装: cd MyFlash
gcc -w `pkg-config --cflags --libs glib-2.0` source/binlogParseGlib.c -o binary/flashback
配置环境变量:
vim /etc/profile
# 在文件最后一行添加
alias flashback=/home/MyFlash/binary/flashback
# 生效环境配置
source /etc/profile
查看安装成功:
./flashback --help
操作命令:
Application Options:
--databaseNames databaseName to apply. if multiple, seperate by comma(,) 指定需要回滚的数据库名。多个数据库可以用“,”隔开。如果不指定该参数,相当于指定了所有数据库。
--tableNames tableName to apply. if multiple, seperate by comma(,) 指定需要回滚的表名。多个表可以用“,”隔开。如果不指定该参数,相当于指定了所有表。
--start-position start position 指定回滚开始的位置。如不指定,从文件的开始处回滚。请指定正确的有效的位置,否则无法回滚
--stop-position stop position 指定回滚结束的位置。如不指定,回滚到文件结尾。请指定正确的有效的位置,否则无法回滚
--start-datetime start time (format %Y-%m-%d %H:%M:%S) 指定回滚的开始时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
--stop-datetime stop time (format %Y-%m-%d %H:%M:%S) 指定回滚的结束时间。注意格式必须是 %Y-%m-%d %H:%M:%S。 如不指定,则不限定时间
--sqlTypes sql type to filter . support INSERT, UPDATE ,DELETE. if multiple, seperate by comma(,) 指定需要回滚的sql类型。目前支持的过滤类型是INSERT, UPDATE ,DELETE。多个类型可以用“,”隔开。
--maxSplitSize max file size after split, the uint is M 一旦指定该参数,对文件进行固定尺寸的分割(单位为M),过滤条件有效,但不进行回滚操作。该参数主要用来将大的binlog文件切割,防止单次应用的binlog尺寸过大,对线上造成压力
--binlogFileNames binlog files to process. if multiple, seperate by comma(,) 指定需要回滚的binlog文件,目前只支持单个文件,后续会增加多个文件支持
--outBinlogFileNameBase output binlog file name base 指定输出的binlog文件前缀,如不指定,则默认为binlog_output_base.flashback
--logLevel log level, available option is debug,warning,error 仅供开发者使用,默认级别为error级别。在生产环境中不要修改这个级别,否则输出过多
--include-gtids gtids to process 指定需要回滚的gtid,支持gtid的单个和范围两种形式。
--exclude-gtids gtids to skip 指定不需要回滚的gtid,用法同include-gtids
生成回滚文件
./flashback --binlogFileNames=binlog.000003 --sqlTypes='UPDATE' --databaseNames=wzn_census --tableNames=sys_house_info_import --start-datetime='2022-11-22 13:56:00' --stop-datetime='2022-11-22 13:58:00'
切割大文件
./flashback --maxSplitSize=1 --binlogFileNames=binlog_output_base.flashback
回滚文件
mysqlbinlog binlog_output_base.flashback.000001 | mysql -h<host> -u<user> -p<password>