逻辑卷备份
首先先做一个lvm逻辑卷,然后把mysql的目录文件和二进制文件放在其中(备注:生产环境中,我们一定要把他们放在两个磁盘上避免有一块坏掉二全部数据损坏)
基于lvm2的备份:
1)请求锁定所有表
mysql>flush tables with read lock;
2)记录二进制日志文件及事件位置
mysql>flush logs;
mysql>show master status;
3)创建快照
lvcreate -L 500M -s -n Name -p r /dev/vg0/lv0
4)释放锁
unlock tables;
5)挂载快照卷,执行数据备份
6)备份完成,删除快照卷
7)通过原卷备份二进制日志
8)导出备份文件
9)恢复备份,恢复二进制
xtrabackup:
备注需要启用,innodb_file_table (配置文件里地址反解也要跳过)
完全备份:
innobacpupex是对xtrabackup封装过得perl脚本.相当于简装版的xtrabackup. 也就是说innobackupex是xtrabachup的前端工具
使用格式1:备份
1) innobackpuex --user=User --password=Passeord /PATH/TO/BACKUP_dir
(不需要指定datadir在哪只需要指定需要备份的位置,它会自动搜索数据的位置)
2)innobackpuex --user=User --password=Passeord
--stream=tar ./ |bzip2 -
注意:备份完的文件有可能比原来的文件多出一些文件
文件有:
1)xtrabackup_checkpoints :指明备份类型(完全或者增量)、备份状态 lsn范围(日志序列号范围)
2)xtrabackup_binlog_info: mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置
3)xtrabackup_binlog_pos_innodb:二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position
4)xtrabackup_binary:备份中用到的xtrabackup的可 执行文件
5)backup-my.cnf:备份命令用到的配置选项信息 在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录;innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据
选项说明:
.--user:该选项表示备份账号
.--password:该选项表示备份的密码
.--host:该选项表示备份数据库的地址
.--databases:该选项接受的参数为数据名,如果要指定多个数据库,彼此间需要以空格隔开;如:"xtra_test dba_test",同时,在指定某数据库时,也可以只指定其中的某张表。如:"mydatabase.mytable"。该选项对innodb引擎表无效,还是会备份所有innodb表
.--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置
.--incremental:该选项表示创建一个增量备份,需要指定--incremental-basedir
.--incremental-basedir:该选项表示接受了一个字符串参数指定含有full backup的目录为增量备份的base目录,与--incremental同时使用
.--incremental-d ir:该选项表示增量备份的目录
.--include=name:指定表名,格式:databasename.tablename
使用格式2:整理
innobackupex --apply-log [option] BACKUP-DIR (整理数据文件)
备注:当我们对数据备份时我们不止要备份数据文件,我们还要备份事务日志(有可能我们备份时别人有在处理的事务并未提交 或者已经提交但并未同步到数据中的等 现象 )。
我们还原数据之前如果此数据只有完全备份,需要把已经提交的事务日志信息手动提交到数据中,未提交的给他回滚。然后这个文件才能拿来做还原 当然如果有完全备份和增量备份那么,还原之前我们要把增量和完全备份合并,然后在执行上面的
选项说明:
.--use-memory:该选项表示和--apply-log选项一起使用,prepare 备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),推荐1G
.--defaults-file:该选项指定了从哪个文件读取MySQL配置,必须放在命令行第一个选项的位置
.--export:表示开启可导出单独的表之后再导入其他Mysql中
.--redo-only:这个选项在prepare base full backup,往其中merge增量备份时候使用
我们使用xtrabacup时需要确认innodb_file_per_table:开启
使用格式3:还原
innobackupex --copy-back /Path/to/backup_dir
还原时,我们不需要打开mysql 只需要指定好文件目录,和配置文件位置即可,同时我们最好用mysql用户执行,这样我们就不会在产生权限和属性的问题了
使用格式4:增量备份
innobackupex --incremental /backup(增量结果备份的位置) --incemental-basedir=Basedir(基于谁做增量)
一旦我们做了增量备份我们的还原就变成了:
还原第一个增量
innobackupex --apply-log --redo-only BASE-DIR --INCREMENTAL-SIR=Dir1
还原第二个增量
innobackupex --apply-log --redo-only BASE-DIR --INCREMENTAL-SIR=Dir1
使用格式5:导入或导出单张表
前提:启用innodb_file_per_table
导出:
导出表是在完全备份的基础上操作的
innobackupex --apply-log --export /Path/to/backup(对哪个文件进行导出exp文件)
备注:这个命令会为没有个表空间创建一个.exp结尾的文件,这些表文件可用于导入其他服务器中做还原单张表操作
导入:
在mysql服务器上导入其他服务器的表,需要在当前服务器中创建一个跟原来表结构一样的表才能进行导入
mysql> create table Tb_name (...) engine= innodb;
将此表空间删除:
alter table Database_name.TB_name discard tablespace;
然后导入exp文件
alter table Database_name.TB_name import tablespace
备注:说是exp文件,实际上我们需要把exp和ibd文件一起复制过来,表的名字就是exp和ibd前缀的名字。
备注:注意权限
mysql主从:
我们的目标是让不同的节点拥有相同的数据集。
复制的功用
1)数据分布:一个数据可以存多份
2)负载均衡:针对读操作均衡(因为同步数据需要在从节点执行和主节点相同的写操作)
3)备份
4)实现高可用(编写脚本,实现故障切换)
5)升级测试
复制的实现:
主节点必须开启二进制日志文件
1)从节点会把自己扮演成客户端,通过mysql协议请求读取主节点上的二进制日志中的事件
2)服务器端会查看对方请求的事件位置(如果不指定则从第一个文件的最开始处),然后发送给从节点
3)从节点收到以后,先保存在中继日志中,然后用一个文件记录起来(记录收到的位置,以便下次请求)
4)再本地replay一遍
5)继续发送新的请求,然后主服务器开启一个新的dump线程响应客户端。
总结:
从节点
I/O线程:从master请求二进制日志时间,保存在中继日志中
SQL线程:从中继日志中读取时间,并在本地完成重放
主节点:
dump线程:为每个从节点的I/O 线程启动一个dump先后才能,用于向其发送二进制时间。
主主复制:
互为主从
可能产生的问题:
1)数据不一致,因此需要慎用
2)写入时有可能造成自动增长的节点号产生冲突
为了避免这种事情发生,我们最好两个节点,其中一个节点使用奇数ID一个使用偶数ID
其中一个节点设置: aotu_increment_offset=1
aotu_increment_offset_increment=2
另一个节点设置
aotu_increment_offset=2
aotu_increment_offset_increment=2
配置步骤:
1)各节点选择一个唯一的server_id
2)都启用bin_log和relay log
3)创建拥有复制权限的用户账号
grant replication slave,repliaction client *.* to 'repluser'@'172.20.%.%' identified by 'password'
然后 双机都进行 flush privileges
权限同步
备注:万一需要用到千万不要使用%.%这种命令。
4)定义自动增长ID字段的数值增长范围为奇偶
5)均把对方设置为主节点,并启动复制线程
首先show master status
在对面的机器上change master to master_host='172.#.#.#',master_user='repluser',master_password='Passwd',master_log_file=master-bin.0000#,master_log_pos='###'(后面这两个文件是从show tsatus 得到的),
同理再来一次,从另一台机器show master statys
另一台机器设置命令。
查看从服务器信息
show slave status
如果从服务器没有问题我们可以
start slave
主从复制:
主节点:
1)开启二进制文件
编辑my.cnf 在其中加入log_bin=mysql-bin(他会自动分开,按照滚动的方式新建0000#的新日志文件名字就叫做mysql-bin0000#)
server-id=#(设置主服务器ID)
innodb_file_per_table=ON
skip_name_resolve=ON
这样主服务器就配置好了
2)对主服务器创建一个有复制权限的用户账号
grant replication slave,repliaction client *.* to 'repluser'@'172.20.%.%' identified by 'password'
plush privileges同步权限
3)配置从服务器
编辑my.cnf
relay_log=relay-log
relay_log_index=relay-log.index
server-id=#(主从ID不一致)
innodb_file_per_table=ON
skip_name_reslove=ON
4)查看主服务器状态
show master status
找出bin0000# 和position
5)在从服务器指明主服务器
这步我们可以查看用help change master to来查看格式
change master to
master_host='172.#.#.#'
,master_user='repluser'
,master_password='Passwd'
,master_log_file='master-bin.0000#''
,master_log_pos=###(备注最后一位置数字不需要加引号)
6) 启动复制线程
start slave
主从架构中应该注意的问题:
1、应该限制从服务器为只读模式
show global variables like 'read_only'(查看)
为了长期生效我们把它写在配置文件中
如果我们需要阻止包括管理员的所有用户我们可以用
flush tables with read lock;
备注:这是两种方式我们要根据自己需求选择
2、保证主从复制的事务安全
主节点:
在master节点启用参数
sync_binlog=on
innodb_flush_logs_at_trx_commit=ON
(刷写日志:在事务提交时,立即将内存中与事务相关的缓冲区中的事务提交至事务日志中
)
innodb_support_xa=ON
(是否支持分布式事务)
sync_master_info(这个是变量,我们最好把它设置为1表示是否立即同步至从节点)
从节点:
1)skip_slave_start=ON(开机时跳过自动启动复制线程 我们应该检测无误后手动启动)
2)master.info:
记录的主节点的信息,从节点复制的位置等等
3)relay-log.info: 自己记录的中继日志,以及复制到了哪个位置
变量:
sync_relay_log_info:【1|0】
sync_relay_log:【1|0】
这两个变量开启会保证数据的安全性,但是会降低服务器的读写性能,如何选择需要我们权衡生产环境
为了实现高可用,我们为避免主机宕机产生的问题,我们可以在从服务器上也执行上面这步
同时在配置文件中启用log_slave_updates(在配置文件中写,不需要写on直接写这个句子就可以了)
半同步复制
6)对主服务器和从服务器安装各自插件
主服务器:
install plugin rpl_semi_sync_master soname 'semisync_master.so' (插件如果是yum安装的我们用rpm直接看就可以)
show plugins
可以查看所有插件是否启用情况
从服务器:
install plugin rpl_semi_sync_slave
soname 'semisync_slave.so'
7)设置为主从同步数据变量 on
主服务器
set global rpl_semi_sync_master_enabled=on
从服务器
set global rpl_semi_sync_slave_enabled=on
然后确认:show global variables like '%semi%
'
show global status like '%semi%