我是同步覆盖了两张表,现在想用日志恢复。
先说结论,没有恢复,因为我的日志不完整,设置了定时清理。
如果你truncate了表或者数据库,如果没有完整的日志是恢复不了数据的。
第一、mysqlbinlog 可能没开启
第二、开启了mysqlbinlog日志,设置了定时清理也恢复不了之前的数据,因为他恢复数据的原理是重新运行一次sql。
1、查询存在的mysqlbinlog 日志 ,在sql中运行
SHOW BINARY LOGS;
运行命令直接查看日志,想看全部请继续往下看,日志文件导出sql。
show binlog events in 'mysql-bin.000076'
2、 linux上找到mysql的位置和日志的位置
whereis mysql不大起作用,
我找了半天 mysql装在
/www/server/mysql 这了
运行mysql一般安装的配置文件,发现日志在
/www/server/data下
[root@localhost mysql]# more /etc/my.cnf
第三步 执行 mysqlbinlog 文件转成sql文件
命令,分别执行:
mysqlbinlog mysql-bin.000076 > /tmp/binlog.sql
mysqlbinlog mysql-bin.000076 -d sys_dict_data > /tmp/sys_dict_data.sql
mysqlbinlog mysql-bin.000076 -d hussar > /tmp/hussar.sql
mysqlbinlog mysql-bin.000076 -d hussar > /tmp/hussar.sql
然后分析导出的文件,你操作的节点或者时间在哪里,我是同步的表,根据我的操作时间,我查询表,答题找到在这里。
这里如果报mysqlbinlog不识别
运行 ln -s /www/server/mysql/bin/mysqlbinlog mysqlbinlog 解决
第四步 执行 日志的恢复操作:他的原理就是把之前的sql再运行一遍,所以如果你的日志是定时清空的,恢复以前的操作是不可能的,你清除了表和库,没有之前的日志,也是恢复不了了。
1、按pos点
./mysqlbinlog --start-position=开始点 --stop-position=结束点 --database=数据库 /binlog路径/mysql-bin.000001 | ./mysql -u用户名 -p密码 -v 数据库
2、按时间
./mysqlbinlog --start-datetime="2022-12-30 10:00:00" --stop-datetime="2022-12-30 18:00:00" --database=demo5_p2p7_cn /www/server/data/mysql-bin.000038 | ./mysql -uroot -p12345 -v datebase;
例子:
mysqlbinlog --stop-position=23801393 --database=hussar /www/server/data/mysql-bin.000076 | ./mysql -uroot -proot -v hussar;
我的执行语句
# mysqlbinlog --stop-position=23801393 --database=hussar /www/server/data/mysql-bin.000076 | mysql -uroot -proot -v hussar;
恢复目前节点之前的日志里所有操作,报错 ,不过是成功的执行了恢复,只不过确实重复执行肯定报错。所以恢复的之后,也就是重复执行的时候,记得选择开始和节数的节点,不然数据容易不可控。