备份的目的
做灾难恢复:对损坏的数据进行恢复和还原
需求改变:因需求改变而需要把数据还原到改变以前
测试:测试新功能是否可用
备份需要考虑的问题
可以容忍丢失多长时间的数据;
恢复数据要在多长时间内完;
恢复的时候是否需要持续提供服务;
恢复的对象,是整个库,多个表,还是单个库,单个表。
备份的类型
1、根据是否需要数据库离线
冷备(cold backup):需要关mysql服务,读写请求均不允许状态下进行;
温备(warm backup): 服务在线,但仅支持读请求,不允许写请求;
热备(hot backup):备份的同时,业务不受影响。
注:
1、这种类型的备份,取决于业务的需求,而不是备份工具
2、MyISAM不支持热备,InnoDB支持热备,但是需要专门的工具
2、根据要备份的数据集合的范围
完全备份:full backup,备份全部字符集。
增量备份: incremental backup 上次完全备份或增量备份以来改变了的数据,不能单独使用,要借助完全备份,备份的频率取决于数据的更新频率。
差异备份:differential backup 上次完全备份以来改变了的数据。
建议的恢复策略:
完全+增量+二进制日志
完全+差异+二进制日志
备份的对象
1、 数据;
2、配置文件;
3、代码:存储过程、存储函数、触发器
4、os相关的配置文件
5、复制相关的配置
6、二进制日志
mysqldump基本语法
mysqldump -u username -p dbname table1 table2 ...-> BackupName.sql使用root用户备份test数据库下的person表 mysqldump -u root -p test person > D:\backup.sql
mysqlimport
mysqlimport [options] db_name textfile1 [textfile2 ...] --同时导入两个文件 mysqlimport --use-threads=2 test /home/mysql/t.txt /home/mysql/s.txt
select into , load data, source
SELECT ... FROM TABLE_A INTO OUTFILE "/path/to/file" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'; LOAD DATA INFILE "/path/to/file" INTO TABLE table_name; 注意:如果导出时用到了FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\n'语句,那么LODA时也要加上同样的分隔限制语句。还要注意编码问题。 mysql>use dbtest; mysql>set names utf8; mysql>source D:/www/sql/back.sql;
mysqlbinlog
mysqlbinlog [options] log_file ... --将xxx.binlog.000001 导入到c盘 mysqlbinlog --start-position=4 --stop-position=106 xxx_binglog.000001 > c:\\test1.txt
热备工具
ibbackup
XtraBackup
其他
LVM快照备份,通过文件系统的快照来备份
replication备份
replication+LVM备份
复制replication是MySql提供的一种高可用解决方案,复制的原理
1.主服务器master把数据更改近路到二进制日志binlog中
2.从服务器slave把主服务器的二进制日志复制到自己的中继日志relay log中
3.从服务器重做中继日志中的日志,把更改应用到自己的数据库上,以达到数据的最终一致性
需要注意的是因为延迟复制不能达到实时同步
如果在主服务器上DBA做了一些误删除操作,那么从服务器也一样会同步这些操作,这样错误的操作也会被同步就达不到备份的目的了,所以用复制+快照来实现更好的备份
性能优化
OLTP在线事务处理对CPU要求不高但要更多内存
OLAP在线分析处理需要更多的查询和连接对CPU要求高
当内存超过了数据量总大小时,性能会直线上升,但继续增加内存效果就不明显了
inodb_read相关参数
SHOW GLOBAL STATUS LIKE 'innodb%read%';
innodb_buffer_pool_reads 表示从物理磁盘读取页的次数
innodb_buffer_pool_read_ahead 预读的次数
innodb_buffer_pool_read_ahead_evicted 预读的页,但是没有被读取就从缓冲池中被替换的页的数量,一般用来判断预读取的效率
innodb_buffer_pool_read_requests 从缓冲池中读取页的次数
innodb_data_read 总共读入的字节数
innodb_data_reads 发起读取请求的次数,每次读取可能需要读取多少页
可以将多块盘组成RAID来提供性能和高可用,也可以用SSD提供性能
RAID-0性能最好,但是安全性最低
RAID-1 安全性最好,但是利用率最低
RAID-5综合了RAID-0和RAID-1的特点,加入了奇偶校验,将盘的校验数据放入其他盘,这样即使坏掉已坏盘也不怕
RAID10和RAID01则综合了RAID1和RAID0的特点
RAID10有更好的读取速度,RAID01比RAID10有更好的写入速度,但是安全性要差一点,现在一般用的是
RAID10比较多,此外还有RAID50
RAID卡 write-through和write-back模式
Write-Through 模式:
1. DB向Cell发送一个写请求, cellsrv进行验证确认其请求有效;
2. cellsrv将发送指令将其写入到物理磁盘;
3. 写完成以后,给DB确认已经写成功;
4. cellsrv判断次数据是否适合缓存到cache中,如果满足条件则缓存,否则不缓存。
Write-Back 模式:
1. DB向Cell发送一个写请求, cellsrv进行验证确认其请求有效;
2. cellsrv将发送指令将其写入到磁盘Cache;
3. 将此数据的状态置为dirty的状态。(直到下次临界条件将脏数据刷新到磁盘,并判断此数据是否适合缓存,如果不适合,刷新完成以后会丢弃,刷新和缓存过程是异步的,并不在步骤3来完成)
4. 写完成以后,给DB确认已经写成功;
这两种模式相比,明显write-back效率要高很多,因为每次都是写入到RAID卡的缓存中,再异步刷新到磁盘上,RAID卡也带了备用电池,所以当开启电池后可以安全的使用这种模式,当电池在充电或者没电的时候就会使用write-through模式
不同的操作系统,文件系统对性能影响并不大
两个基准测试工具
sysbench
mysql-tpcc
参考
[InnoDB系列] -- 实测ibbackup vs mysqldump
MySQL实验室DMB数据库监控及灾备系统 之 [备份模式的选择]
Cache写策略——write-through与write-back
基于keepalived 实现VIP转移,lvs,nginx的高可用