1、利用select into outfile实现数据的备份与还原

select * from students where Age > 30 into outfile ‘/tmp/stud.txt' ;  
  • 备份
select * into outfile 'tmp/t1.txt' 
fields terminated by ',' optionally enclosed by '*'
lines terminated by '\n'
from test.t1;
  • 恢复
load data infile '/tmp/t1.txt'
into table test.t1
fields terminated by ',' optionally enclosed by '*'
lines terminated by '\n'

2、利用mysqldump工具对数据进行备份和还原

mysqldump 常用来做温备,所以我们首先需要对想备份的数据施加读锁,
2.1 施加读锁的方式:

1.直接在备份的时候添加选项

--lock-all-tables 是对要备份的数据库的所有表施加读锁
--lock-table 仅对单张表施加读锁,即使是备份整个数据库,它也是在我们备份某张表的时候才对该表施加读锁,因此适用于备份单张表。

2、在服务器端书写命令,

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

但这对于InnoDB存储引擎来讲,虽然你也能够请求道读锁,但是不代表它的所有数据都已经同步到磁盘上,
因此当面对InnoDB的时候,我们要使用
mysql> show engine innodb status; 
看看InnoDB所有的数据都已经同步到磁盘上去了,才进行备份操作。

2.2备份的策略:
完全备份+增量备份+二进制日志

  • 完全备份
mysqldump -uroot --single-transaction --master-data=2 --databases xxx > /backup/xxx_`date +%F`.sql
  1. –single-transaction: 基于此选项能实现热备InnoDB表;因此,不需要同时使用–lock-all-tables;
  2. –master-data=2 记录备份那一时刻的二进制日志的位置,并且注释掉,1是不注释的
  3. –databases xx 指定备份的数据库
  • 增量备份
  1. 查看完全备份的二进制日志的位置
cat xxx.sql | less
  1. 查看最新的二进制日志的位置
mysql> show master status;

显示此时的二进制日志的位置,从备份文件里边记录的位置到我们此时的位置,即为增量的部分。
3. 增量备份

mysqlbinlog --start-position=15694 --stop-position=15982
/mydata/data/mysql-bin.000012 > /backup/hellodb_`date +$F_%H`.sql
  1. 导出本次操作的二进制日志
  • 二进制日志
mysqlbinlog --start-position=15982 /mydata/data/mysql-bin.000013 
# 查看删除操作时二进制日志的位置
# mysqlbinlog --start-position=15982 --stop-position=16176 /mydata/data/mysql-bin.000013 > /tmp/hellodb.sql
//导出二进制日志 
  1. mysql离线
mysql> set sql_log_bin=0;  关闭二进制日志
mysql> flush logs; 滚动下日志

注意:
1、在生产环境中,我们应该导出的是整个mysql服务器中的数据,而不是单个库,因此应该使用–all-databases
2、在导出二进制日志的时候,可以直接复制文件即可,但是要注意的是,备份之前滚动下日志(flush logs;)。
3、利用lvm快照实现几乎热备的数据备份与恢复。

Logo

更多推荐