一、备份sql
(1)中止服务,3306端口关闭
数据库
(2)看下配置文件有没有关键日志存放于其它目录的,检查/etc/my.cnf,再检查下/etc/my.cnf.d/下有没有配置文件放置其余地方,有的话也须要一块儿拷贝归档安全
(1)这里有个不当心输入删重要mysql库的命令,开始还原工具
(2)关闭服务,systemctl stop mariadb性能
(3)必定要注意配置文件和备份前的配置是否同样,拷贝刚才归档文件并解压至库里ui
(4)解压后文件注意权限,务必确保mysql.mysql权限
(4)开启服务,systemctl start mariadb
2、LVM逻辑卷快照实现几乎热备(实质仍是冷备):将数据库内容在很短期用逻辑卷快照备份下,以后先将数据库推上线,再处理快照中的内容,结合二进制日志还原
(1)新加硬盘并创建逻辑卷分区
开机添加硬盘扫描下,echo '- - -' > /sys/class/scsi_host/host0/scan,记得有每一个host都须要扫描下
分区,分区时候记得更改硬盘分区文件系统,代码8e,Linux LVM
lvcreate -n lvdb -L +6G /dev/vgdb ----->创建逻辑卷用来放置数据库数据
lvcreate -n lvdb -L +4G /dev/vgbin ----->创建逻辑卷用来单独放置二进制日志
mkdir -pv /data/{mysql,binlog}
mount /dev/vgdb/lvdb /data/mysql
mount /dev/vgdb/lvbin /data/binlog
(3)数据迁移,须要更改配置文件,开启二进制日志功能,确保权限正确
注:若是重启服务后提示错误没法迁移,将原数据库内mysql库复制到新库中重启便可
lvcreate -p -r -s -n snap_dbbak -L 2G /dev/vgdb/lvdb,设置了只读属性
create table info (name char(10),age tinyint,job varchar(20))
alter table info add id tinyint primary key first
insert into info values (1,'chenux',24,'driver')
(6)作完逻辑卷快照后,对数据的更改会影响服务器性能能,也就是说旧的内容会添加到逻辑卷快照中,所以咱们须要把快照里的数据导出来,对逻辑卷快照挂载
直接挂载mount /dev/vgdb/snap_dbbak /mnt会报错,由于快照snap_dbbak的逻辑卷uuid和lvdb逻辑卷uuid同样,因此挂载输入指令mount -o nouuid,norecovery /dev/vgdb/snap_dbbak /mnt
(7)为确保数据安全性,能够挂载完成后将挂载目录里的数据存放至其它设备中,由于实验环境,依旧在本机上操做
cp -a /mnt/* /backups,此处用cp -a,保留权限,此时至关于备份完成
(10)还原开始,中止服务,拷贝原数据库内容到数据库存放目录,再开放数据库
systemctl stop mariadb;cp -av /backups/* mysql/
(11)此时发现只有逻辑卷快照时的备份,后面的增删改没有了,因此这里须要引入二进制日志。在利用二进制还原时候,要避免其余用户链接数据库产生数据变动,此处须要使用防火墙或者其它策略确保数据库只有本身一我的操做
mysqlbinlog --start-position=328 mysql-bin.000001,能够查看到内容
mysqlbinlog --start-position=328 mysql-bin.000001 > bl.sql
mysqlbinlog mysql-bin.000002 >> bl.sql
(12)还原后记得以前设置的防火墙或者其它拒绝访问策略再取消掉,完成
注意:若是删库用的是drop,不像实验中rm指令删除的,mybinlog BINLOG > *.sql,编辑该sql文件,将drop命令那行注释掉,再mysql < *.sql
三、mysqldump的备份和误删除操做后的还原
(1)准备环境,条件容许状况下,将二进制日志文件和数据库存放目录放到不一样的磁盘中,并且二进制日志文件最好单独放在一个分区中
mysqldump -A -F --single-transacation --master-data=2 | gzip > /backupsq/db.sql.gz
(4)备份完,继续修改点小数据,再删个表以后继续作点修改,此时模仿环境中数据库时时刻刻都有增删改操做,不能说是由于删了某个表就中止了其余增删改
修改:alter table students add job varchar(20);、update students set job='nurse' where stuid=1;
再修改:insert into students values(26,'Yang Guo',28,'M',NULL,NULL,'CEO');
(5)开始还原,还原过程当中利用防火墙不容许其余人访问数据库
进入数据库,先暂时关闭临时会话的二进制日志,避免二进制日志重复记录导入过程
(6)开始还原修改的数据,less /backups/db.sql,查看CHANGE MASTER TO信息
(7)利用工具将该日志导成sql数据库文件,并查找删除关键表的指令
mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql
完成后,若是后续还有其它二进制日志,将其它二进制日志也追加到incr.sql:
mysqlbinlog /data/binlog/mysql-bin.000004 >> /data/incr.sql
mysqlbinlog /data/binlog/mysql-bin.000005 >> /data/incr.sql等等
不过我这里因为增删改很少,就mysqlbinlog /data/binlog/mysql-bin.000003 > /data/incr.sql这一步就够了
(8)导入数据,不过导入以前须要关闭临时会话中的sql_log_bin,避免出现二进制日志重复记录的现象
这下咱们的teachers表回来了,修改的students表也还原了
(9)关闭以前的拒绝用户访问策略,完成