mysqldump;逻辑备份
mysqldump(完全备份)+二进制日志----就可以实现一次完全+增量备份;
用法:
备份单个数据库或库中的某个表:
mysqldump DB_NAME [tb1] [tb2]
如:[root@localhost ~]# mysqldump -uroot -p runoob > /root/runoob1.sql
这种备份会带来时间点上的不一致,比如有其他人正往数据库里插入数据,因此在真正的备份中不能这么做,应该要锁表,在进行flush
1.mysql>lock tables;或者直接用mysql>flush tables with read lock;//这样别人能查询但是不能对数据库进行写操作
2.[root@localhost ~]# mysqldump -uroot -p runoob>/root/runoob1.sql//备份表
3.unlock tables;//释放锁
若在锁表的过程中,进行了插入操作,那我们备份的数据中就不包括锁表后插入的数据,在还原过程中就无法还原到服务器当前的状态,那我们就要从二进制日志中获取
1.mysql>flush tables with read lock;
2.flush logs;//滚动日志
3.show binary logs;找到所需的日志进行还原
我们也可以直接用以下命令备份(包括锁表,记录二进制日志文件路径位置)
mysqldump -uroot -p --master-data=2 --lock-all-tables --flush-logs runoob>/root/runoob1.sqloot/all.sql
mysqldump参数:
--master-data ={0|1|2}
0:不记录二进制日志文件及路径位置
1:以change master to的方式记录位置,可用于恢复后直接启动从服务器
2:以change master to的方式记录位置,但默认被注释
--lock-all-tables:锁定所有表
--flush-logs 开始转储前刷新MySQL服务器日志文件
如果指定库中的表类型均为InnoDB,可使用--single-transaction启动热备
备份多个库
--all-databases:备份所有库
--databases DB_NAME,DB_NAME,..:备份指定库,会自动创建数据库
--routines在转储的数据库中转储存储程序(函数和程序)
--triggers 为每个转储的表转储触发器。该选项默认启用;用--skip-triggers禁用它。
备份策略:每周完全+每日增量
完全备份:mysqldump
增量备份:备份二进制日志文件(复制文件即可,但在复制前进行flush logs)
手动:mysqldump -uroot -p --master-data=2 --flush-logs --all-databases --lock-all-tables >/root/all.sql
mysql>purge binary logs to 'mysql-bin.000011'
用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
对数据库进行一些写操作后做增量备份:
1.mysql>flush logs;
2.[root@localhost ~]# cd /usr/local/mysql/var //进入MySQL数据目录,不同的安装有不同的路径
3.cp mysql-bin.000011 /root/
也可以使用mysqlbinlog mysql-bin.000011> /root/mon-incremental.sql
不下心删了所有的数据库,二进制日志文件没有删,还原
首先初始化数据库
scripts/mysql_install_db --user=mysql --datadir=/mysql/data/
导入数据库mysql -uroot -p
导入增量备份mysql mysqlbinlog mysql-bin.000012|mysql -uroot -p
mysqldump在做逻辑备份,数据库还原的时候,文件太大时,数据库会进行写的操作,这样就会写入二进制日志文件,而此时是不需要写入的,会占用大量的磁盘空间,导致数据库还原速度变慢,因此,还原时将二进制日志关掉,还原后再打开
show global variables like '%log%'
show master status;当前二进制文件
showbinlog events in 'mysql-bin.00001'查看当前日志文件记录的事件
set sql_log_bin=0;设置二进制文件不被记录1:on 0:off
逻辑备份:缺点:
1.浮点数据丢失精度
2.备份出的数据更占用存储空间,压缩后可大大节省空间
3.不适合对大数据库做完全备份
对于innodb:使用热备
mysql>flush tables with read lock;执行这句时,若有大量事务执行时,加锁过程会等待很长时间,如果锁上了,并不代表数据库就没有写的操作,因为它有事务日志,事务日志中的数据在后台会每隔一段时间,由mysql后台线程自我调度的将事务日志中的数据同步到数据文件中,所以必须等待事务日志中的数据同步到数据文件中,查看innodb存储状态:show engine innodb status;
--single-transiaction 适用于innodb,保证整个备份集的数据一致性。它会自动启动事务
innodb具有MVCC的功能:
MVCC:全称是Multi-Version Concurrent Control,即多版本并发控制
另外一个备份工具:select into outfile 但它备份出的信息是纯文本文件,它比mysqldump速度快,更节约空间,通常用于某一张表的备份;
,也就是表中的信息
用法:select * into outfile '/tmp/runoob.txt' from runoob_tbl;
在这里也可以使用where只备份某种属性的数据
还原 :load data infile '/tmp/runoob' into Table runoob_tbl;//在恢复前要建好表