mysql备份与恢复(一)——mysqldump
一、mysqldump介绍及常用参数说明
1.常用参数:
- -u: 指定用户
- -p: 指定密码
- –single-transaction: 确保事务性操作,只对 innodb 有效,保证备份期间没有 DDL 操作
- -l (–lock-table): 对于非 Innodb 引擎的备份进行锁表,只能进行读操作。与 single-transaction 互斥
- -x,–lock-all-table: 给实例下的所有数据库的表进行加锁,保证一致性,该参数会导致在备份过程中数据库只读,不可 写
- -d: 只备份表结构,不备份数据
- –master-data: 有两个值: 1 和 2。1 时只记录change master 语句,为 2 时change master 会注释掉,建议设置为 2
- –all-database: 备份 MySQL 实例下的所有数据库
- –database: 指定对应的数据库进行备份
- -R, -routines: 备份所有的存储过程
- –tiggers: 备份触发器
- -E, –events: 备份数据库中的调度时间
- –hex-blob: 将对 blog/binary 等格式的数据转为 16 进制形式进行保存
- -tab=path: 在指定路径下分别生成结构文件和数据文件,会对每个表分别生成一个记录表结构的 sql 文件和记录数据的 t xt 文件
- -w,–where= 过滤条件,对于单表进行过滤条件的备份
1、备份策略
两台主机,192.168.50.137和192.168.50.135,在137主机上运行mysql,做完全备份,然后做基于二进制日志(会保存导致数据改变或健在数据改变的SQL语句)的增量备份,模拟某个时刻137主机宕机,将数据库服务转到135主机上运行。
2、对137主机上的所有数据库做完全备份
先查看137主机上mysql数据库
[root@www ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Syslog |
| hellodb |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)
对其中的所有数据库做完全备份操作,同时加上--single-transaction实现启动一个大事务,保证事务内的数据保持一致性,但仅对innodb有效,--master-data实现记录CHANGE MASTER TO语句,在二进制文件中记录我们的完全备份开始的位置以及在哪个二进制文件里记录的,--flush-logs实现二进制文件滚动,最后将生产的sql脚本保存在/backup目录下
[root@www ~]# mysqldump --all-database --single-transaction --master-data=2 --flush-logs > /backup/mysqlbkp-$(date +%F).sql
[root@www backup]# ll
总用量 4812
-rw-r--r-- 1 root root 4923837 6月 23 13:34 mysqlbkp-2018-06-23.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000008', MASTER_LOG_POS=245; #我们的备份操作记录在mysql-bin.000008中,开始位置为245
3、做增量备份
从我们做完全备份的时刻起,数据库的操作依然在进行,因此做增量备份保证以后数据库恢复是能有完整数据的一项重要措施。现在我们对137上的数据库进行一些修改
删除Syslog数据库,添加test数据库
MariaDB [(none)]> drop database Syslog;
Query OK, 2 rows affected (0.05 sec)
MariaDB [(none)]> create database test;
Query OK, 1 row affected (0.00 sec)
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
从二进制文件中导出刚才的增量操作,并保存到/backup中
[root@www backup]# mysqlbinlog --start-position 245 /var/lib/mysql/mysql-bin.000008 > /backup/mysqlinsert-$(date +F%).sql #开始位置即为我们记录下来的245。
[root@www backup]# ll
总用量 4844
-rw-r--r-- 1 root root 4923837 6月 23 13:34 mysqlbkp-2018-06-23.sql
-rw-r--r-- 1 root root 32709 6月 23 14:02 mysqlinsert-2018-06-23.sql
假如现在137主机的mysql宕掉了,将/backup中所以内容scp到135主机进行恢复。
[root@www backup]# scp -p /backup/* 192.168.50.135:/tmp/mysql-bkp
mysqlbkp-2018-06-23.sql 100% 4808KB 24.2MB/s 00:00
mysqlinsert-2018-06-23.sql 100% 32KB 14.1MB/s 00:00
先恢复到完全备份时的状态
[root@Eric ~]# mysql < /tmp/mysql-bkp/mysqlbkp-2018-06-23.sql
查看数据库
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| Syslog |
| hellodb |
| mysql |
| performance_schema |
+--------------------+
5 rows in set (0.00 sec)
MariaDB [(none)]>
可以看到此时已经在135主机上恢复出了当时完全备份时的状态,但是还记得我们在完全备份后是删除了Syslog数据库,添加了test数据库,因此我们在导入增量备份,恢复到最新的数据库状态
[root@Eric ~]# mysql < /tmp/mysql-bkp/mysqlinsert-2018-06-23.sql
再次查看数据库
[root@Eric ~]# mysql
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 10
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hellodb |
| mysql |
| performance_schema |
| test |
+--------------------+
5 rows in set (0.00 sec)
此时就恢复到了最新的状态了;
成功!!!