记一次生产环境MySQL删库经历
虽然是在几个月前发生的事情,但是还是记忆尤新,分享心得,引以为戒。
heidisql工具在备份RDS的时候正常来说是不会有问题的,但是在当时在执行此操作的时候发生了问题,在进行sql备份的时候从生产的RDS导入到另外一个RDS上,出现了权限错误,导致生产的数据库表被删除。
在我们自己的数据库导来导去都不会出现问题。后面也做了测试,如果使用高权限账号是没有问题的(坑爹)。然后就开始了痛苦的恢复数据的操作。
MySQL数据恢复
主要还是要根据阿里云的文档来(在本地新建数据库进行备份)
1.恢复到最新的数据备份中(此处需要特别注意版本问题(敲黑板)
)
使用 Percona XtraBackup 2.4 进行备份恢复操作mysql5.7
使用 Percona XtraBackup 2.3(rpm安装,需要说明依赖安装说明依赖) 和(centos的版本也有关系,我是在centos7上执行的) 进行备份恢复mysql5.6
- 从阿里云上复制外网数据备份地址
- 执行
wget -c '<数据备份文件外网下载地址>' -O <自定义文件名>.tar.gz
- 解压
tar -izxvf <数据备份文件名>.tar.gz -C /home/mysql/data
- 查看文件
ls -l /home/mysql/data
innobackupex --defaults-file=/home/mysql/data/backup-my.cnf --apply-log /home/mysql/data
如果出现complete ok则表示恢复成功vi /home/mysql/data/backup-my.cnf
- 修改目录权限
chown -R mysql:mysql /home/mysql/data
- 启动
mysqld_safe --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &
- mysql -uroot -p<数据库密码> 登陆本机数据库查看文件是否恢复成功,如果不成功,建议重装虚拟机更换版本后重试(本人愚钝,装了5次终于成功了)
# 注释参数(innodb)
#innodb_fast_checksum
#innodb_page_size
#innodb_log_block_size
#(以下是MyISAM)
#要注释的参数并添加skip-grant-tables属性
#innodb_log_checksum_algorithm=strict_crc32
#redo_log_version=1
skip-grant-tables
最重要的命令是innobackupex 版本对应上就没有问题
Percona XtraBackup 2.3 恢复mysql数据到自建数据库中
2.根据mysql的binlog文件恢复到指定时间点
恢复到了指定的数据备份后,再恢复binlog日志文件中的数据(指定时间点恢复)
从阿里云上下载binlog文件,然后再服务器上执行操作
tar xvpf mysql-bin.000349.tar
- 分析文件并大致找到恢复的时间点(时间适当往前移,过了某个时间点数据已经被删除了)
- 执行
mysqlbinlog --skip-gtids=true --stop-datetime="2018-08-30 12:30:00" mysql-bin.000349 | mysql -u root
官方文档的操作
mysqlbinlog mysql-bin.000688 mysql-bin.000689 --start-position=531167 --stop-datetime="16-05-16 18:05:03" | mysql -uroot -pyour_password -P3306 -hyour_host_ip
-p 参数和 your_password 间不要有空格, your_password 请自行替换为实际密码
-h 参数后请指定非 127.0.0.1 的主机 IP
mysqlbinlog 命令格式:
mysqlbinlog binlog_file1 binlog_file2 ... binlog_filen --start-position=xxxx --stop-datetime="YY-mm-dd hh:mm:ss" | mysql -uroot -pyour_password -Pmysql_port -hyour_host_ip
mysqlbinlog 其他可以使用的参数
--database db_name 指定仅增量恢复指定数据库 db_name 的数据
--start-position 指定开始恢复的 binlog 位点,该位点应存在于指定的第一个 binlog 文件。
--stop-position 指定恢复到的 binlog 位点,该位点应存在于指定的最后一个 binlog 文件。
--start-datetime 指定开始恢复的时间点(从第一个等于或大于该时间点的 binlog 事件开始)。
以本地时间时区为准,格式为 MySQL 可以接受的时间格式,比如"2016-05-16 08:01:05" 或 "16-05-16 08:01:05"。
虽然过程很坎坷,好在最后恢复了,建议在服务器上执行mysqldump 操作。