MySQL数据库的完全备份可以采用多种方式,物理冷备份一般用tar命令直接打包数据库文件夹(数据目录),而在备份前需要先停库。
1、直接打包数据库文件夹,源码包的位置/usr/local/mysql/data/,rpm包的位置 /var/lib/mariadb/
示例:
[root@localhost ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| class |
| client |
| li |
| mysql |
| performance_schema |
| sys |
+--------------------+
mysql> exit
Bye
[root@localhost ~]# systemctl stop mysqld.service
[root@localhost ~]# ls /usr/local/mysql/data/
auto.cnf ibdata1 localhost.localdomain.err sys
class ib_logfile0 mysql
client ib_logfile1 mysql.log
ib_buffer_pool li performance_schema
[root@localhost ~]# ls /usr/local/mysql/data/class/
db.opt users.frm users.ibd
[root@localhost ~]# rpm -q xz
xz-5.1.2-9alpha.el7.x86_64
[root@localhost ~]# tar jcf backup/mysql_all-$(date +%F).tar.xz /usr/local/mysql/data/
tar: 从成员名中删除开头的“/”
[root@localhost ~]# ls backup/
client.user_info-20191012.sql mysql_all-2019-10-14.tar.xz
[root@localhost ~]# rm -rf /usr/local/mysql/data/class/
[root@localhost ~]# ls /usr/local/mysql/data/
auto.cnf ibdata1 li mysql.log
client ib_logfile0 localhost.localdomain.err performance_schema
ib_buffer_pool ib_logfile1 mysql sys
[root@localhost ~]# systemctl start mysqld.service
[root@localhost ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| client |
| li |
| mysql |
| performance_schema |
| sys |
+--------------------+
6 rows in set (0.00 sec)
mysql> exit
Bye
[root@localhost ~]# mkdir /news
[root@localhost ~]# mv backup/mysql_all-2019-10-14.tar.xz /news/
[root@localhost ~]# cd /news/
[root@localhost news]# ls
mysql_all-2019-10-14.tar.xz
[root@localhost news]# tar xf mysql_all-2019-10-14.tar.xz
[root@localhost news]# ls
mysql_all-2019-10-14.tar.xz usr
[root@localhost news]# ls usr/local/mysql/data/class/
db.opt users.frm users.ibd
[root@localhost news]# mv usr/local/mysql/data/class /usr/local/mysql/data/
[root@localhost news]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| class |
| client |
| li |
| mysql |
| performance_schema |
| sys |
+--------------------+
7 rows in set (0.00 sec)
mysql> use class;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from users;
+-----------+-------------------------------------------+
| user_name | user_passwd |
+-----------+-------------------------------------------+
| lisi | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
| wangwu | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| zhangsan | *E56A114692FE0DE073F9A1DD68A00EEB9703F3F1 |
+-----------+-------------------------------------------+
3 rows in set (0.00 sec)
mysql> exit
2、使用专用备份工具mysqldump
MySQL自带的备份工具mysqldump,可以很方便的对MySQL进行备份。通过该命令工具可以将数据库、数据表或全部的库导出为SQL脚本,便于该命令在不同版本的MySQL服务器上使用。例如,当需要升级MySQL服务器时,可以先使用mysqldump命令将原有库信息到导出,然后直接在升级后的MySQL服务器中导入即可。
(1)对单个库进行完全备份
格式:mysqldump -u用户名 -p[密码] [选项] --databases [数据库名] > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p123456 --databases auth > backup/auth-$(date +%Y%m%d).sql
mysqldump: [Warning] Using a password on the command line interface can be insecure.
[root@localhost ~]# cat backup/auth-20181214.sql
(2)对多个库进行完全备份
格式:mysqldump -u用户名 -p [密码] [选项] --databases 库名1 [库名2]… > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p123456 --events --databases mysql auth > backup/mysql+auth-$(date +%Y%m%d).sql
[root@localhost ~]# cat backup/mysql+auth-20181214.sql
(3)对所有库进行完全备份
格式:mysqldump -u用户名 -p [密码] [选项] --opt --all-databases > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p123456 --events --opt --all-databases > backup/mysql_all.$(date +%Y%m%d).sql
[root@localhost ~]# cat backup/mysql_all.20181214.sql
//--opt 加快备份速度,当备份数据量大时使用
[root@localhost ~]# cat backup/mysql_all.20160505.sql
(4)对表进行完全备份
格式:mysqldump -u用户名 -p [密码] [选项] 数据库名 表名 > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p123456 auth user > backup/auth_user-$(date +%Y%m%d).sql
[root@localhost ~]# cat backup/auth_user-20181214.sql
(5)对表结构的备份
格式:mysqldump -u用户名 -p [密码] -d 数据库名 表名 > /备份路径/备份文件名
示例:
[root@localhost ~]# mysqldump -uroot -p123456 -d mysql user > backup/desc_mysql_user-$(date +%Y%m%d).sql
[root@localhost ~]# cat backup/desc_mysql_user-20181214.sql
使用mysqldump备份后,恢复数据库
1、source命令
登录到MySQL数据库,执行source 备份sql脚本路径
示例:
[root@localhost ~]# mysql -uroot -p123456
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| mysql |
| performance_schema |
| test |
| usr |
+--------------------+
6 rows in set (0.00 sec)
mysql> drop database auth;
Query OK, 1 row affected (0.12 sec)
mysql> source backup/mysql_all.20181214.sql
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| mysql |
| performance_schema |
| test |
| usr |
+--------------------+
6 rows in set (0.00 sec)
2、mysql命令
格式:mysql -u用户名 -p [密码] < 库备份脚本的路径
mysql -u用户名 -p [密码] 库名 < 表备份脚本的路径
示例:
[root@localhost ~]# mysql -uroot -p123456 -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| mysql |
| performance_schema |
| test |
| usr |
+--------------------+
[root@localhost ~]# mysql -uroot -p123456 -e 'drop database auth;'
[root@localhost ~]# mysql -uroot -p123456 < backup/mysql_all.20181214.sql
[root@localhost ~]# mysql -uroot -p123456 -e 'show databases;'
+--------------------+
| Database |
+--------------------+
| information_schema |
| auth |
| mysql |
| performance_schema |
| test |
| usr |
+--------------------+
[root@localhost ~]# mysql -uroot -p123456 -e 'drop table auth.user;'
[root@localhost ~]# mysql -uroot -p123456 auth< backup/auth_user-20181214.sql
[root@localhost ~]# mysql -uroot -p123456 -e 'select * from auth.user;'
+------------+------+
| name | ID |
+------------+------+
| crushlinux | 123 |
+------------+------+