Mysql备份方案
方案一:mysqldump+binlog: ( 推荐)
完全备份,通过备份二进制日志实现增量备份
方案二: xtrabackup:
对InnoDB:热备,支持完全备份和增量备份
对MyISAM:温备,只支持完全备份
方案三: lvm2快照+binlog:
几乎热备,物理备份
具体操作如下:方案一解析:
mysqldump+binlog
命令的语法格式
mysqldump [OPTIONS] database [tables]:备份单个库,或库指定的一个或多个表
mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2DB3...]:备份一个或多个库
mysqldump [OPTIONS] --all-databases [OPTIONS]:备份所有库
其他选项
-x, --lock-all-tables:锁定所有表
-l, --lock-tables:锁定备份的表
--single-transaction:启动一个大的单一事务实现备份
-C, --compress:压缩传输
-E, --events:备份指定库的事件调度器
-R, --routines:备份存储过程和存储函数
--triggers:备份触发器
--master-data={0|1|2}
0:不记录
1:记录CHANGE MASTER TO语句;此语句未被注释
2:记录为注释语句
-F,--flush-logs:锁定表之后执行flushlogs命令 (刷新日志)
详细过程:
- 关闭防火墙和selinux,启动数据库mariadb
- 准备备份目录:
- 创建目录:mkdir -pv /backup/binlog
- 修改权限:chown -R mysql.mysql /backup/
- 准备备份数据库及表
- 进入数据库:mysql -uroot -p
- 创建数据库:create database magedu 然后使用该数据库:use magedu
- 创建表:create table M26(id int not null,name char(20) );
- 进行完全备份:
- 备份整个库:mysqldump --all-databases --lock-all-tables --flush-log --master-data=2 >/backup/`date +%F_%T` -all.sql
-
备份某一个库:mysqldump -uroot -p123456 --databases magedu --lock-all-tables --flush-log -hlocalhost --master-data=2 >/backup/`date +%F_%T`-magedu.sql;查看一下:ls
/backup/
5.向表里插入数据:
查看一下
6.进行增量备份,备份二进制日志:mysqlbinlog --start-position=315 --stop-position=639 /var/lib/mysql/bin- log.000003 > /backup/binlog-`date +%F_%T`.sql
查看:ls /backup/
继续插入数据,在没备份的情况下删除数据库,模拟误操作
7.数据恢复,由于最后我们没有备份就删除了数据库,所以我们首先需要保护最后的二进制日志,
- 查看删除操作之前的position值:最后的二进制文件:mysqlbinlog /var/lib/mysql/bin-log.000003
8.将最后操作的二进制日志备份 :mysqlbinlog --start-position=639 --stop-position=835 /var/lib/mysql/bin-log.000003 > /backup/binlog-`date +%F_%T`.sql
9.导入之前的备份:
10.查看数据库及数据:
方案二解析:
xtrabackup
Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,是一款开源能够对innodb和xtradb数据库进行热备的工具。
特点:
(1)备份过程快速、可靠
(2)备份过程不会打断正在执行的事务
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动实现备份检验
(5)还原速度快
安装
[[email protected] ~]# yum installpercona-xtrabackup-2.2.3-4982.el6.x86_64.rpm -y
创建最小权限备份用户 : grant reload,lock tables,replicationclient on *.* to 'fulanqi'@'localhost' identified by '123';
完全备份
[[email protected] ~]# innobackupex --user=fulanqi --password=123 /backup/
须知(这一步可以不做):备份的这库可以直接当数据库用:
修改一下权限,就可以启动了:
试一下需要改回来哦
增量备份
每个InnoDB的页面都会包含一个存储信息,每当相关的数据发生改变,相关
的页面的存储就会自动增长。这正是InnoDB表可以进行增量备份的基础,即
innobackupex通过备份上次完全备份之后发生改变的页面来实现
innobackupex命令会在备份目录中创建一个新的以时间命名的目录以存放所
有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其
–incremental-basedir应该指向上一次的增量备份所在的目录
注:增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份
添加数据
增量备份
[[email protected] ~]# innobackupex --user=fulanqi --password=123 --incremental /backup/--incremental-basedir=/backup/2017-11-21_10-52-43
数据恢复准备
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中
可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此
,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交
的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
误操作:不小心把/var/lib/mysql/下的某数据库删了
数据恢复准备
执行操作:
# innobackupex --apply-log --redo-only BASE-DIR
接着执行(增量):
# innobackupex --apply-log --redo-only BASE-DIR--incrementaldir=INCREMENTAL-DIR-1
恢复阶段,还原数据
[[email protected] ~]# innobackupex --copy-back /backup/2017-11-21_10-52-43/
修改权限:[[email protected] ~]# cd /var/lib/mysql chownmysql.mysql . -R
[[email protected] ~]# systemctl restart mariadb
方案三解析:
lvm2快照+binlog
mysql引擎,架构
俩引擎:Innodb支持事物锁机安表,MyISAM不支持事物,锁机按行
引擎作用把表中数据按照特点写进硬盘中,每个引擎的特点不同
- 划分逻辑卷:
- 先添加一块硬盘:
- 扫描一下:echo '- - -' > /sys/class/scsi_host/host2/scan
上面的扫描方法不行的话换成::echo '- - -' > /sys/class/scsi_host/host0/scan
查看一下:fdisk -l
-
划分区:
- 磁盘:fdisk /dev/sdb
改成逻辑卷并保存
- 重读分区表:partprobe
- 让内核读取一下:partx -a /dev/sdb
- 查看一下:fdisk -l
- 添加逻辑卷:pvcreate /dev/sdb1
- 添加卷组:vgcreate myvg /dev/sdb1
- 添加逻辑卷:lvcreate -n mydata -L 5G myvg
- 格式化逻辑卷:mkfs.ext4 /dev/mapper/myvg-mydata
-
挂载:
- 先创建一个目录(用于挂载):mkdir /bak
- 挂载:mount /dev/mapper/myvg-mydata /bak
-
修改Mysql配置, 使得数据文件在逻辑卷上:
- 停掉mariadb服务:systemctl stop mariadb
- 进入存取数据的目录:cd /var/lib/mysql
- 移动数据:mv * /bak
- 修改权限:chown mysql.mysql . -R
- 修改配置文件:vim /etc/my.cnf
- 启动Mysql服务:(7)systemctl start mariadb (6) service mysqld restart
-
创建数据库, 进行操作,
- 进入数据库:mysql -uroot -p
- 锁定表:FLUSH TABLES WITH READ LOCK;
- 现在可以退出数据库了。
- 创建快照卷lvcreate -L 1G -n mydata-snap -p r -s /dev/mapper/myvgmydata
- 再次进入数据库,进行解锁所有表:UNLOCK TABLES;
-
挂载snap:
- 创建目录:mkdir /snap
- 挂载:mount /dev/myvg/mydata-snap /snap
- 查看:(snap里面保存的是元数据)
-
打包物理备份:
- 进入该目录下:cd /snap/
- 打包:tar -cjvf mysql-backup-tar.gz ./*
如果不小心把bak里面所有东西删了,则snap下的所有东西也都没了,可以用刚刚打包的文件恢复:
恢复:
- 先把备份文件移动到/bak目录下:
- 解压:
- 启动数据库:systemctl restart mariadb
可能会出现错误,比如某个日志文件,删了就行
查看二进制文件tail
- 验证数据库数据是否正确恢复
ok 数据库备份方案完成,欧耶!!