一.数据库备份的分类

1.物理备份:对数据库操作系统的物理文件(如数据文件、日志文件等)的备份

物理备份又可以分为脱机备份(冷备份)和联机备份(热备份)
(1)冷备份:是在关闭数据库的时候进行的
(2)热备份:数据库处于运行状态,这种备份方法依赖于数据库的日志文件

2.逻辑备份:对数据库逻辑组件(如表等数据库对象)的备份
从数据库的备份策略角度,备份可分为完全备份、差异备份、增量备份

完全备份:每次对数据进行完整的备份
差异备份:备份那些自从上次完全备份之后被修改过的文件
增量备份:只有那些在上次完全备份或者增量备份后被修改的文件才会被备份

MySQL完全备份

完全备份是对整个数据库的备份、数据库结构的文件结构的备份
完全备份保存的是备份完成时刻的数据库
完全被封是增量备份的基础
完全备份的优点

 

MySQL数据库的备份可以采用多种方式

  • 直接打包数据库文件夹,如/usr/local/mysql/data
  • 使用专门备份工具mysqldump
//安装环境依赖包
yum install -y ncurses-devel autoconf cmake gcc gcc-c++

//解压缩包
tar xzvf mysql-5.6.26.tar.gz
cd mysql-5.6.26

//配置过程
cmake  \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \  //定义安装目录
-DDEFAULT_CHARSET=utf8 \                   //安装中文识别的字符集
-DDEFAULT_COLLATION=utf8_general_ci \      //安装中文识别的字符集
-DEXTRA_CHARSETS=all \
-DSYSCONFIDIR=/etc \                       //定义配置文件安装目录
-DMYSQL_DATADIR=/home/mysql/ \             //数据存放位置目录
-DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock   //连接数据库文件

//安装与编译
make && make install

//覆盖原有的主配置文件
cp support-files/my-default.cnf /etc/my.cnf

//复制一份启动脚本文件到service中
cp support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld           //添加权限   
chkconfig --add /etc/init.d/mysqld    //添加,可使用service管理数据库
chkconfig  mysqld --level 35 on       //添加,开机自启动

//设置环境变量,是系统识别mysql数据库内部命令
echo "PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile
source /etc/profile
echo $PATH

//创建管理用户
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql/

//初始化数据库
/usr/local/mysql/scripts/mysql_install_db \
--user=mysql \
--ldata=/var/lib/mysql \
--basedir=/usr/local/mysql \
--datadir=/home/mysql

//建立软连接文件
ln -s /var/lib/mysql/mysql.sock  /home/mysql/mysql.sock

//指向路径
vim  /etc/init.d/mysqld
basedir=/usr/local/mysql   //数据库目录     
datadir=/home/mysql        //数据存放目录

//开启服务
service mysqld start
netstat -anpt | grep 3306

#设置数据库管理员密码
mysqladmin -u root -p password

#登陆数据库
mysql -uroot -p

//创建新数据库
create database info;
Query OK, 1 row affected (0.01 sec)

//进入数据库,创建新表的结构
create table yun (
    -> id int(4) not null primary key auto_increment,
    -> name char(10) not null,
    -> age int(3) not null,
    -> addr varchar(50) default 'nj');
Query OK, 0 rows affected (0.03 sec)

//查询表的结构
desc yun;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(4)      | NO   | PRI | NULL    | auto_increment |
| name  | char(10)    | NO   |     | NULL    |                |
| age   | int(3)      | NO   |     | NULL    |                |
| addr  | varchar(50) | YES  |     | nj      |                |
+-------+-------------+------+-----+---------+----------------+

//插入数据
insert into yun (name,age,addr) values ('zhangsan',18,'bj');
Query OK, 1 row affected (0.01 sec)
insert into yun (name,age,addr) values ('lisi',19,'bj');
Query OK, 1 row affected (0.01 sec)

//查看表中的数据
select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
+----+----------+-----+------+

MySQL备份思路

定期实施备份,制定备份计划或者策略,并严格遵守
除了进行完全备份,开启MySQL服务器的日志功能是很重要的

  • 完全备份加上日志,可以对MySQL进行最大化还原

物理方式备份

//切换到存放数据目录
/home/mysql/info

//备份数据
tar jcvf /opt/mysql-$(date +%F).tar.xz /home/mysql/info/
tar: 从成员名中删除开头的“/”
/home/mysql/info/
/home/mysql/info/db.opt
/home/mysql/info/yun.frm
/home/mysql/info/yun.ibd

//查看备份数据的压缩包
cd /opt/
ls
mysql-2020-01-07.tar.xz

逻辑方式备份

//使用命令进行逻辑备份
mysqldump -u root -p info >/opt/info.sql
Enter password: 

//查看备份文件
cd /opt/
ls
info.sql   //脚本文件

//多个数据库进行逻辑备份
mysqldump -u root -pabc123 --databases mysql yun >/opt/db_mysql_yun.sql

//对数据库所有数据进行逻辑备份
mysqldump -u root -pabc123 --opt --all-databases >/opt/all.sql

//对某个数据库中特定的表进行备份
mysqldump -u root -pabc123 info yun >/opt/info_yun.sql

//对某个数据库中特定表的结构进行备份
mysqldump -u root -pabc123 -d info yun >/opt/info_yun_desc.sql

使用脚本进行备份恢复

//进入数据库
show tables;
+----------------+
| Tables_in_info |
+----------------+
| yun            |
+----------------+
1 row in set (0.00 sec)

//模拟删除yun这张表
drop table yun;
Query OK, 0 rows affected (0.04 sec)

//查看是否删除
show tables;
Empty set (0.00 sec)

//使用命令恢复yun这张表
source /opt/info.sql

//查看yun这张表中的数据
select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
+----+----------+-----+------+
2 rows in set (0.00 sec)

使用mysql命令恢复

//删除yun这张表
drop table yun;
Query OK, 0 rows affected (0.00 sec)

//删除成功
show tables;
Empty set (0.00 sec)

//使用命令恢复
 mysql -u root -pabc123 info < /opt/info.sql 

//进入数据库查看是否恢复成功
mysql -uroot -p
Enter password:   //输入密码进入

use info;         //进入此数据库

select * from yun; 
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
+----+----------+-----+------+
2 rows in set (0.00 sec)

根据时间节点进行增量数据恢复

//开启二进制日志文件功能
vim /etc/my.cnf
log-bin=mysql-bin

//重启mysql服务
service mysqld restart
Shutting down MySQL.. SUCCESS! 
Starting MySQL.. SUCCESS! 

//查看二进制日志文件
cd /home/mysql/
ls
mysql-bin.000001    //日志文件

//先执行一次完整型备份
mysqldump -u root -pabc123 info > /opt/info.sql
ls /opt/
info.sql

//进行增量备份,生成增量备份二进制文件
mysqladmin -u root -pabc123 flush-logs
mysql-bin.000002

//进入数据库,查看表的数据
mysql -u root -pabc123
use info;
select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
+----+----------+-----+------+

//插入新的数据,并模拟误操作
insert into yun (name,age,addr) values ('wangwu',23,default); //正常插入数据
Query OK, 1 row affected (0.00 sec)

delete from yun where name='lisi';                 //误删除lisi的数据
Query OK, 1 row affected (0.00 sec)

insert into yun (name,age,addr) values ('zhaoliu',33,default);
Query OK, 1 row affected (0.00 sec)

//查看表的数据
select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  3 | wangwu   |  23 | nj   |
|  4 | zhaoliu  |  33 | nj   |
+----+----------+-----+------+

//进行增量备份,生成新的日志文件
mysqladmin -u root -pabc123 flush-logs
mysql-bin.000003

//将误操作的日志文件mysql-bin.000002中的数据导出,查看该信息
mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000002 >/opt/bak.txt
vim /opt/bak.txt //查找误操作的信息
insert into yun (name,age,addr) values ('wangwu',23,default)  //正常操作
delete from yun where name='lisi'                             //误操作
insert into yun (name,age,addr) values ('zhaoliu',33,default) //正常操作

//删除表
drop table yun;
Query OK, 0 rows affected (0.02 sec)

//查看是否删除
select * from yun;
ERROR 1146 (42S02): Table 'info.yun' doesn't exist

//先进行完全备份恢复
source /opt/info.sql
Query OK, 0 rows affected (0.01 sec)

select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
+----+----------+-----+------+

//按照日志文件中的误操作的时间节点进行增量备份恢复,跳节点,不恢复误操作
quit
Bye
mysqlbinlog --no-defaults --stop-datetime='2020-01-07 17:23:42' /home/mysql/mysql-bin.000002 | mysql -u root -p
Enter password:        //输入密码

//进入数据库,查看wangwu用户数据是否恢复
select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
|  3 | wangwu   |  23 | nj   |
+----+----------+-----+------+
3 rows in set (0.00 sec)

//按照日志文件的时间节点,恢复zhaoliu用户数据
mysqlbinlog --no-defaults --start-datetime='2020-01-07 17:24:25' /home/mysql/mysql-bin.000002 | mysql -u root -pabc123

//进入数据库查看zhaoliu用户数据是否恢复
mysql> select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
|  3 | wangwu   |  23 | nj   |
|  4 | zhaoliu  |  33 | nj   |
+----+----------+-----+------+
4 rows in set (0.00 sec)

根据atID号进行增量数据恢复

//删除表的数据
drop table yun;
Query OK, 0 rows affected (0.00 sec)
select * from yun;
ERROR 1146 (42S02): Table 'info.yun' doesn't exist

//进行完全备份恢复
source /opt/info.sql
Query OK, 0 rows affected (0.00 sec)
select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
+----+----------+-----+------+
2 rows in set (0.00 sec)

//查看日志文件,按照atID号进行增量恢复
mysqlbinlog --no-defaults --stop-position='475' /home/mysql/mysql-bin.000002 | mysql -u root -pabc123      //恢复wangwu用户数据
mysqlbinlog --no-defaults --start-position='613' /home/mysql/mysql-bin.000002 | mysql -u root -pabc123      //恢复zhaoliu用户数据


//进入数据库,查看wangwu和zhaoliu用户数据是否恢复
 select * from yun;
+----+----------+-----+------+
| id | name     | age | addr |
+----+----------+-----+------+
|  1 | zhangsan |  18 | bj   |
|  2 | lisi     |  19 | bj   |
|  3 | wangwu   |  23 | nj   |
|  4 | zhaoliu  |  33 | nj   |
+----+----------+-----+------+
4 rows in set (0.00 sec)