前言:随着办公自动化和电子商务的飞速发展,企业对信息系统的依赖性越来越高,数据库作为信息系统的核心担当着重要的角色。数据库备份,是在数据丢失的情况下,能及时恢复重要数据,防止数据丢失的一种重要手段。一个合理的数据库备份方案,应该能够在数据丢失时,有效地恢复数据,同时需要考虑技术实现难度和有效地利用资源
备份方式分很多种,从物理与逻辑的角度,备份分为以下几类
MySQL数据库的备份可以采用两种方式,因为数据库实际上都是文件,直接打包数据库文件夹,或者是使用专用备份工具mysqldump都可以进行备份工作
MySQL的数据库文件默认都是保存在安装目录的data文件夹下面,可以直接保存data文件夹,但是占用的空间较大,可以使用tar打包压缩进行保存
[root@localhost data]# yum install xz -y //安装xz压缩格式工具
[root@localhost data]# tar Jcvf /opt/mysql-$(date +%F).tar.xz /usr/local/mysql/data/ 对数据库文件夹进行打包
[root@localhost data]# ls /opt //查看已经生成了备份文件
mysql-2020-01-24.tar.xz rh
[root@localhost data]# du -sh /opt/mysql-2020-01-24.tar.xz
676K /opt/mysql-2020-01-24.tar.xz
[root@localhost data]# du -sh /usr/local/mysql/data/
134M /usr/local/mysql/data/
//对比打包前后的文件大小,可以看到压缩的备份文件占用空间很小
[root@localhost data]# tar Jxvf /opt/mysql-2020-01-24.tar.xz /usr/local/mysql/data/
//如果数据库文件损坏数据丢失,可以解压缩备份文件,相当于做了数据恢复
使用mysqldump可以更加灵活地控制备份的内容,比如某几个表或库都可以单独备份
mysqldump -u 用户名 -p[密码][选项][数据库名][数据表名]>/备份路径/备份文件名
mysqldump -u 用户名 -p [密码][选项][数据库名]>/备份路径/备份文件名
mysqldump -u 用户名 -p [密码][选项] --databases 库名1[库名2]...>/备份路径/备份文件名
mysqldump -u 用户名 -p [密码][选项] --all-databases >/备份路径/备份文件名
mysqldump -u 用户名 -p [密码] -d 数据库名 表名 >/备份路径/备份文件名
备份的本质就是保存数据库当前表结构的创建语句和现有数据的插入语句,有了它们可以方便地恢复数据库的状态
前面介绍了数据库的完全备份,使用mysqldump工具可以把数据库的创建语句保存在备份脚本文件中,当数据出现错误时,可以使用以下几种方式对它进行恢复操作
当需要恢复整库的时候,可以使用source命令和mysql命令
登录MySQL后,可以使用source命令进行整库恢复,命令格式如下
source 备份脚本路径
[root@localhost ~]# mysqldump -uroot -p1234 school >/opt/school.sql //先做备份
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# mysql -uroot -p1234 //进入数据库
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> drop database school; //删除库
Query OK, 1 row affected (0.01 sec)
mysql> show databases; //查看school已经删除
+--------------------+
| Database |
+--------------------+
| information_schema |
| chartest |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> source /opt/school.sql
。。。。省略内容
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school |
| sys |
+--------------------+
5 rows in set (0.01 sec)
mysql>use school; //进入库
Database changed
mysql> describe biao; //用describe命令查看表结构
+---------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+---------------+------+-----+---------+-------+
| id | int(4) | NO | PRI | NULL | |
| name | char(10) | NO | | NULL | |
| address | varchar(50) | YES | | nj | |
| score | decimal(10,0) | YES | | NULL | |
+---------+---------------+------+-----+---------+-------+
4 rows in set (0.02 sec)
//使用source恢复整库后,库school重新可以使用,表里的数据也恢复了
在不登录MySQL的情况下,可以使用mysql命令直接恢复整库
[root@localhost ~]# mysqldump -uroot -p1234 school >/opt/school.sql //先做备份
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# mysql -uroot -p1234 //进入数据库
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> drop database school; //删除库
Query OK, 1 row affected (0.01 sec)
mysql> show databases; //查看school已经删除
+--------------------+
| Database |
+--------------------+
| information_schema |
| chartest |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql -u 用户名 -p[密码] <库备份脚本的路径
此时库school已经被删除了,需要先创建再进行恢复操作,否则会报错
[root@localhost ~]# mysql -uroot -p1234
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> create database school;
mysql> exit
Bye
[root@localhost ~]# mysql -uroot -p1234 school< /opt/school.sql
[root@localhost ~]# mysql -uroot -p1234
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| school | //库school恢复成功
| sys |
+--------------------+
5 rows in set (0.00 sec)
mysql> use school; //进入数据库
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| biao | //表也恢复成功
+------------------+
1 row in set (0.00 sec)
mysql> select * from biao; //查询‘biao‘中的所有内容
+----+-------+---------+-------+
| id | name | address | score |
+----+-------+---------+-------+
| 1 | stu01 | bj | 87 |
| 2 | stu02 | sh | 79 |
| 3 | stu03 | nj | 90 |
| 4 | stu04 | | 68 |
+----+-------+---------+-------+
4 rows in set (0.00 sec)
//结果显示恢复成功
恢复数据表同样可以使用source和mysql命令操作
使用scource命令恢复表的操作与恢复库的操作方式相同
[root@localhost ~]# mysqldump -uroot -p1234 school biao > /opt/biao.sql //给表做备份
[root@localhost ~]# mysql -uroot -p1234
mysql> use school;
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| biao |
+------------------+
1 row in set (0.00 sec)
mysql> select * from biao;
+----+-------+
| id | name |
+----+-------+
| 1 | stu01 |
| 2 | stu02 |
+----+-------+
2 rows in set (0.00 sec)
mysql> drop table biao; //删除表
Query OK, 0 rows affected (0.04 sec)
mysql> use school; //进入库
Database changed
mysql> source /opt/biao.sql //恢复
Query OK, 0 rows affected (0.00 sec)
。。。省略内容
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| biao |
+------------------+
1 row in set (0.00 sec)
mysql> select * from biao;
+----+-------+
| id | name |
+----+-------+
| 1 | stu01 |
| 2 | stu02 |
+----+-------+
2 rows in set (0.01 sec)
使用source命令恢复表后,表里的数据也恢复了,说明恢复是成功的
使用mysql命令恢复表的操作时,当备份文件只包含表的备份,而不包括创建库的语句时,必须指定库名,且目标库必须存在。
[root@localhost ~]# mysqldump -uroot -p1234 school biao > /opt/biao.sql //给表做备份
[root@localhost ~]# mysql -uroot -p1234
mysql> use school;
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| biao |
+------------------+
1 row in set (0.00 sec)
mysql> select * from biao;
+----+-------+
| id | name |
+----+-------+
| 1 | stu01 |
| 2 | stu02 |
+----+-------+
2 rows in set (0.00 sec)
mysql> drop table biao; //删除表
Query OK, 0 rows affected (0.04 sec)
不登陆MySQL,使用mysql命令恢复表,命令格式如下
mysql -u 用户名 -p [密码] 库名 < 库备份脚本的路径
[root@localhost ~]# mysql -uroot -p1234 school < /opt/biao.sql
[root@localhost ~]# mysql -uroot -p1234
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> use school;
Database changed
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| biao |
+------------------+
1 row in set (0.00 sec)
mysql> select * from biao;
+----+-------+
| id | name |
+----+-------+
| 1 | stu01 |
| 2 | stu02 |
+----+-------+
2 rows in set (0.00 sec)
需要具体指定是哪个库,使用mysql命令恢复表后,表中的数据也恢复了,说明恢复成功了
MySQL需要定期实施备份,制定合适的备份计划或者策略,并严格遵守。除了进行完全备份,开启MySQL服务器的日志功能也很重要,完全备份加上日志,可以对MySQL进行最大化还原
备份文件的名字需要使用统一和易理解的名称,不要使用backup1等这样没有意义的名字,推荐使用库名或者表名加上时间的命名规则,在需要恢复数据库的时候很容易定位到相应的备份文件