上一篇写了mariadb的几种复制模型,此次就丢几个maraidb的经常使用备份恢复模拟吧。
文中用到的数据库hellodb连接
使用的hellodb.sql文件地址
https://pan.baidu.com/s/1uI3Br-HJ8t5-C-_bfZenPgmysql
备份主要是用来应对如下的状况:灾难恢复,硬件故障,软件故障,天然灾害,×××恶意×××,人为的误操做致使数据的损坏等。
备份时要关注的重点在于能容忍最多丢失多少的数据量,在现在数据基本和金钱等价的现实下,数据仍是能少丢就少丢吧;恢复数据要在多长时间内完成;须要恢复哪些数据。
注意:
单纯作备份是不可行的,作好备份以后还要考虑作的备份是否可用(还原测试);按期作还原演练(在我的机器实验)。sql
彻底备份-整个数据集所有备份。
增量备份-仅仅备份最近一次彻底备份或者增量备份(若存在增量)之后的变化的数据,备份速度相对较快,可是还原比较复杂,须要作整合。
差别备份-仅仅备份一次彻底备份以来变化的数据,备份速度相对增量备份慢,可是还原简单。
部分备份-只备份数据的子集,例如部分库和部分表。数据库
尽量要讲数据文件和二进制日志文件分开存放。vim
冷备:数据库读写操做所有中止直到备份结束。
温备:读操做能够进行,可是没法进行写操做。
热备:读写操做都不受影响,都可正常进行。
MyISAM:温备,不支持热备。
InnoDB:都支持(如今大多都使用,同时还支持事务)
物理备份:直接复制数据文件进行备份,与存储引擎相关,占用空间多,速度快。
逻辑备份:从数据库中导出数据到其余地方存储,与存储引擎无关,占用空间相对较少,速度慢,可能会丢失数据精度。centos
在进行备份以前咱们考虑清楚后才能够进行,毕竟数据无价。
1.作温备时候锁要持续的时间
2.备份过程当中会占用多少系统的资源
3.备份会消耗的时间
4.数据恢复时候消耗的时间
5.咱们该备份什么
数据
二进制日志,InnoDB事务日志文件
程序代码(指的是数据库的)
服务器的配置文件服务器
简单的cp和tar就不作演示了,cp和tar属于物理备份工具,适用于全部的存储引擎,可是仅仅支持冷备;能够彻底备份混合部分备份。ide
centos7.4 mariadb 10.2.15
这里个人数据目录在/data/mysql
二进制文件目录在/data/binlog工具
修改数据库的配置文件将二进制文件和数据文件分开存放而且重启数据库,重读配置文件。测试
#mariadb的高版本配置文件被拆分到几个文件中去了 vim /etc/my.cnf.d/server.cnf [mysqld] #指定数据目录 datadir=/data/mysql #指定二进制文件路径和名称前缀 log_bin=/data/binlog/mysql-bin #将每一个数据库都单独存放 innodb_file_per_table
因为这里实现的是基于LVM的备份所以数据要存放于lvm卷上ui
#建立目录 mkdir /data/{binlog,mysql} -pv #挂载逻辑卷 mount /dev/vg0/lv_data /data/mysql mount /dev/vg0/lv_binlog /data/binlog chown -R mysql:mysql /data/ #重启数据库 systemctl restart mariadb #若是出现下图提示就执行如下命令 #低版本通常不会出现,mariadb在10.2.15包括以上要手动从新初始化数据库才能正常启动 mysql_install_db --datadir=/data/mysql --user=mysql systemctl restart mariadb
既然要作备份实验那么就先在数据库中导入一些数据,
mysql <hellodb_innodb.sql
1.在数据库添加读锁,限制其余用户写入数据
#进入数据库,我这里没有设密码能够直接登入 mysql #添加读锁 mysql>flush tables with read lock; #查看二进制日志文件,记录文件名和pos编号 mysql>show master logs;
2.建立快照,这里要新打开一个终端
lvcreate -n lv_mysql_snap -L 1G -s -p r /dev/vg0/lv_data
3.数据库解锁
mysql>unlock tables;
4.挂载快照并备份数据文件
mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt #复制文件,因为是作演示因此就进备份到本地了 cp -a /mnt/ /backup/
5.删除快照
#卸载 umount /mnt #删除快照(快照存在会影响数据的写入) lvremove /dev/vg0/lv_mysql_snap
到这里备份基本完成
1.模拟损坏
#模拟在损坏前有用户写入了其余数据信息 mysql> create database db1; mysql> create database db2; #删除数据库数据 rm -rf /data/mysql/* #中止数据库 systemctl stop mariadb
2.还原备份的数据文件
cp -av /backup/* /data/mysql/
3.禁止外部用户链接
vim /etc/my.cnf.d/server.cnf #加入如下字段到mysqld skip_networking #重启数据库 systemctl start maraidb
4.恢复binlog中最新日志到数据库中,要先登陆数据库查看如下master logs
cd /data/binlog/ mysqlbinlog --start-position=8960 mysql-bin.000002 > /backup/bin.sql mysqlbinlog mysql-bin.000003 >> /backup/bin.sql mysqlbinlog mysql-bin.000004 >> /backup/bin.sql mysqlbinlog mysql-bin.000005 >> /backup/bin.sql mysql < /backup/bin.sql
5.恢复用户访问
vim /etc/my.cnf.d/server.cnf #删除字段 skip_networking systemctl restart mariadb
6.查看数据信息,发现后续添加的信息也恢复了
这里是还原了新环境的虚拟机
这里的前提是要求有着彻底备份,并且能够正常获取最新从二进制日志文件
1.彻底备份数据库
mysqldump -A -F --single-transaction --master-data=2 > /backup/full.sql
2.修改数据库后破坏数据信息
rm -rf /data/mysql/*
3.重启数据库并恢复备份
systemctl stop mariadb mysql_install_db --datadir=/data/mysql --user=mysql # 编辑配置文件并禁止其余用户访问 vim /etc/my.cnf.d/server.cnf innodb_file_per_table systemctl start mariadb #将二进制文件生成sql文件 #查看全备份的sql文件能够看到备份时候的二进制文件和起始位置(若是是恢复失误删除的表能够在整合完二进制文件生成的sql文件后,找到误删除表的语句,删除该语句便可) mysqlbinlog --start-position=385 mysql-bin.000005 >bin.sql # 恢复彻底备份数据 mysql < /backup/full.sql mysql < bin.sql
4.修改配置文件删除innodb_file_per_table字段重启便可
单表恢复(涉及表之间的关联问题)
备份
mysqldump hellodb students > /backup/stu_bak.sql
还原备份
mysql hellodb < /backup/stu_bak.sql