mysql数据备份

直接拷贝文件

myisam存储引擎

只要对应表的后缀为.frm .MYD .MYI,三个文件拷贝到对应的数据库文件夹就行

innodb存储引擎
  • 先通过SHOW CREATE TABLE table命令,查询出表的创建语句,然后在备份库中执行
  • 执行ALTER TABLE table DISCARD TABLESPACE,丢弃的表空间
  • 拷贝表的后缀为.ibd文件到对应的数据库文件夹,然后授权chown mysql:mysql table.ibd
  • 执行ALTER TABLE table IMPORT TABLESPACE,导入新的表空间

mysqldump + binlog

备份的策略:

完全备份+增量备份+二进制日志

备份前数据库加锁
mysql> flush tables with read lock; 施加锁,表示把位于内存上的表统统都同步到磁盘上去,然后施加读锁
mysql> unlock tables;释放读锁

但对于InnoDB存储引擎来讲,虽然你也能够请求道读锁,但是不代表它的所有数据都已经同步到磁盘上
因此当面对InnoDB的时候,我们要使用
mysql> show engine innodb status;
数据库做完全备份
mysqldump -uroot -p --single-transaction --master-data=2 --databases testdb > /opt/testdb_`date +%F`.sql

--single-transaction: 基于此选项能实现热备InnoDB表;因此,不需要同时使用--lock-all-tables;
--master-data=2  记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的
--databases hellodb 指定备份的数据库然后回到mysql服务器端
--lock-all-tables 是对要备份的数据库的所有表施加读锁
--lock-table 仅对单张表施加读锁,即使是备份整个数据库
查看完全备份文件里边记录的位置
cat hellodb_2013-09-08.sql | less

-- CHANGE MASTER TO MASTER_LOG_FILE='master-bin.000027', MASTER_LOG_POS=6032;

mysql数据备份_第1张图片

修改数据数据,进行增量备份

mysql数据备份_第2张图片

修改数据后,显示此时的二进制日志的位置,从备份文件里边记录的位置6032到我们此时的位置,即为增量的部分

 mysqlbinlog --start-position=6032 --stop-position=7071 /var/lib/mysql/master-bin.000027 > /opt/testdb_`date +%F_%H`.sql
删表,还原数据
mysql> set sql_log_bin=0;  关闭二进制日志
mysql> flush logs; 滚动下日志

删除数据,后还原

 mysql -uroot -p< /opt/testdb_2019-11-14.sql     //导入完全备份文件
 mysql -uroot -p< /opt/testdb_2019-11-14_19.sql   //导入增量备份文件

https://www.cnblogs.com/fengzhongzhuzu/p/9101782.html 其它方法参考

你可能感兴趣的:(mysql,mysql,备份)