1.数据备份的重要性
2.造成数据丢失的原因
程序错误
人为操作错误
运算错误
磁盘故障
灾难(如火灾、地震)和盗窃
3.数据库备份类型
一、按照数据库的运行状态分类:
(1)热备:在数据库运行时,直接进行备份,对运行的数据库没有影响
(2)冷备:在数据库停止运行的时候进行备份,这种备份方式最为简单,只需要拷贝数据库物理文件即可。
(3)温备:同样是在数据库运行的时候进行备份的,但对当前数据库的操作会产生影响。(只可以读操作,不可以写操作)
数据库热备与冷备的优缺点:
热备份的优点:
1.可在表空间或数据文件级备份,备份时间短。
2.备份时数据库依然可以使用。
3.可达到秒级恢复,能够恢复到某一个时间点上。
4.恢复的速度很快,在大多数情况下在数据库工作时就可恢复。
5.几乎所有的数据库实体都可以进行恢复。
热备份的缺点:
1.尽量不要出错,否则后果会很严重。
2.如果热备份不成功,所得结果不可用于时间点的数据恢复。
3.维护的工作比较困难。
冷备份的优点:
1.是非常快速的备份方法,因为只需要拷贝文件即可
2.容易归档,容易恢复到某个时间点上(只需将文件再拷贝回去即可)
3.能与归档方法相结合,作数据库(最新状态)的恢复。
4.容易维护,且比较安全。
冷备份的缺点:
1.单独使用时,只能提供到"某一时间点的上"的恢复。
2.再实施备份的全过程中,数据库必须是关闭状态。
3.不能按表或按用户恢复。
物理备份:
直接复制数据文件进行的备份
优点:不需要其他的工具,直接复制就好,恢复直接复制备份文件即可
缺点:与存储引擎有关,跨平台能力较弱
逻辑备份:
从数据库中导出数据另存而进行的备份
优点:能使用编辑器处理,恢复简单,能基于网络恢复,有助于避免数据损坏
缺点:备份文件较大,备份较慢,无法保证浮点数的精度,使用逻辑备份数据恢复后,还需要手动重建索引,十分消耗cpu资源。
(1)完全备份
即对整个数据库的数据和数据结构进行备份。
(2)增量备份
每次备份的数据只是相当于上一次备份后增加的和修改过的数据。
(3)差异备份
每次备份的数据是相对于上一次全备份之后新增加的和修改过的数据。
关闭mysql服务—创建备份数据存储路径—使用tar创建备份文件–模拟故障–恢复数据
关闭mysql服务—创建备份数据存储路径—使用tar创建备份文件
[root@www ~]# systemctl stop mysqld
[root@www ~]# netstat -anput | grep mysqld
[root@www ~]# mkdir /backup
归档时最好切换到目标目录路径
[root@www ~]# cd /usr/local/mysql/
[root@www ~]# tar zcf /backup/mysql_all-$(date +%F).tar.gz data/
模拟故障—将数据全部迁移,查看是否能够启动
[root@www ~]# mkdir bak
[root@www ~]# mv /usr/local/mysql/data/ bak/
[root@www ~]# systemctl start mysqld
恢复数据
[root@www ~]# mkdir restore
[root@localhost ~]# tar xf /backup/mysql_all-2020-10-10.tar.gz -C restore/
[root@localhost ~]# mv restore/data/ /usr/local/mysql/
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# netstat -anput | grep mysqld
tcp6 0 0 :::3306 :: LISTEN 31957/mysqld
2.mysqldump备份与恢复—常用于温备份
将指定的库导出为SQL脚本
备份数据库auth
[root@www ~]# mysqldump -u root -p123 --databases mysql >mysql.sql
模拟故障:删除数据库auth
[root@www ~]# mysql -u root -p123 -e ‘drop database mysql;’
查看数据库是否删除
[root@www ~]# mysql -u root -p123 -e ‘show databases;’
恢复数据库mysql
[root@www ~]# mysql -u root -p123 < mysql.sql
查看是否已恢复
[root@www ~]# mysql -u root -p123 -e ‘show databases;’
增量备份的优点是没有重复数据,备份量不大,时间短。缺点也很明显,需要上次完全备份及完全备份之后所有的增量备份才能恢复,反推恢复,操作较为繁琐。
Mysql没有提供增量备份的方法,但是可以通过二进制日志间接实现增量备份。
二进制日志对备份的意义如下:
1)二进制日志保存了所有更新或者可能更新数据库的日志文件
2)二进制日志在启动Mysql服务器后开始记录,并在文件达到max_binlog_size 所设置的大小或者接收到的flush logs命令后重新创建新的日志文件。
3)只需要定时执行flush logs 方法重新创建新的日志,生成二进制文件序列,并及时把这些日志保存到安全的地方就完成了一个时间段的增量备份。
开启数据库二进制日志功能
编辑主配置文件
[root@www ~]# vim /usr/local/mysql/my.cnf
[mysqld]
log_bin=/usr/local/mysql/mysql-bin
重启服务
[root@www ~]# systemctl restart mysqld
查看生成的日志文件
[root@www ~]# ls -l /usr/local/mysql/mysql-bin.*
一般恢复
添加数据–进行完全备份—录入新的数据—进行增量备份–模拟故障–恢复操作
进入MySQL
mysql> create database client;
mysql> use client;
创建表user_info
mysql> create table user_info(身份证 char(20) not null,姓名 char(20) not null, 性别 char(4), 用户ID号 char(10) not null, 资费 int(10));
写入数据到表user_info
mysql> insert into user_info values(‘000006’,‘张’,‘男’,‘016’,‘10’);
mysql> insert into user_info values(‘000007’,‘李’,‘女’,‘017’,‘91’);
mysql> insert into user_info values(‘000008’,‘王’,‘女’,‘018’,‘23’);
mysql> select * from client.user_info;
备份表user_info
[root@www ~]# mkdir /mysql_bak
[root@www ~]# mysqldump -uroot -p123 client user_info > /mysql_bak/client_userinfo-$(date +%F).sql
mysql> insert into user_info values(‘000009’,‘赵’,‘男’,‘019’,‘37’);
mysql> insert into user_info values(‘000009’,‘孙’,‘男’,‘020’,‘36’);
mysql> select * from client.user_info;
刷新生成新的日志文件
[root@www ~]# mysqladmin -uroot -p123 flush-logs
模拟故障:删除表user_info
[root@www ~]# mysql -uroot -p -e’drop table client.user_info;’
[root@www ~]# mysql -uroot -p123 -e’select * from client.user_info;’
[root@localhost ~]# mysql -uroot -p123 client < /mysql_bak/client_userinfo-2020-10-10.sql
[root@localhost ~]# mysql -uroot -p123 -e’select * from client.user_info;‘
[root@localhost ~]# mysqlbinlog --no-defaults /usr/local/mysql/mysql-bin.000001 | mysql -uroot -p123
[root@www ~]# mysql -uroot -p123 -e’select * from client.user_info;’
基于位置恢复
模拟删除
[root@www ~]# mysql -uroot -p -e’drop table client.user_info;’
[root@www ~]# mysql -uroot -p123 -e’select * from client.user_info;’
[root@www ~]# mysql -uroot -p123 client < /mysql_bak/client_userinfo-2019-03-25.sql
查看二进制日志文件确定恢复的位置或时间。
mysqlbinlog --no-defaults /usr/local/mysql/mysql-bin.000001
指定‘停止位置’,即不恢复‘孙’的用户数据
[root@localhost ~]# mysqlbinlog --no-defaults --stop-position=‘456’ /usr/local/mysql/mysql-bin.000003 | mysql -u root -p123
[root@localhost ~]# mysql -uroot -p123 -e’select * from client.user_info;’
基于时间点恢复
[root@localhost ~]# mysqlbinlog --no-defaults --start-datetime=‘2020-10-10 10:07:49’ /usr/local/mysql/mysql-bin.000003 | mysql -u root -p123
mysql -uroot -p123 -e’select * from client.user_info;’