mysqldump 备份与恢复操作记录

 一,参数详解

[root@bug ~]# ? mysqldump

--master-data[=#] 

mysqldump导出数据时,当这个参数的值为1的时候,mysqldump出来的文件就会包括CHANGE MASTER TO这个语句,CHANGE MASTER TO后面紧接着就是file和position的记录,在slave上导入数据时就会执行这个语句,salve就会根据指定这个文件位置从master端复制binlog。

--master-data=2表示在dump过程中记录主库的binlog和pos点,并在dump文件中注释掉这一行;

--master-data=1表示在dump过程中记录主库的binlog和pos点,并在dump文件中不注释掉这一行,即恢复时会执行;

 默认情况下这个值是1。

 

 --lock-tables   #Lock all tables for read.这样在flush tables with read lock后,直到整个dump过程结束,断开线程后才会unlock tables释放锁,整个dump过程其他线程不可写,从而保证数据的一致性,适用于MyISAM存储引擎, 因为MyISAM存储引擎不支持事物。

 

 --single-transaction #设置事务的隔离级别,适用于innodb存储引擎。

 --dump-slave=2表示在dump过程中,在从库dump,mysqldump进程也要在从库执行,记录当时主库的binlog和pos点,并在dump文件中注释掉这一行;

--dump-slave=1表示在dump过程中,在从库dump,mysqldump进程也要在从库执行,记录当时主库的binlog和pos点,并在dump文件中不注释掉这一行;

注意,在从库上执行备份时,即--dump-slave=2,这时整个dump过程都是stop io_thread的状态

详细信息,引用一位大牛的文章:

https://blog.csdn.net/rewiner120/article/details/70598828

 

 ,操作记录

 适用于innodb引擎,mysql5.7,编译安装

2.1构造测试数据

mysql> create database test;
Query OK, 1 row affected (0.00 sec)

mysql> use test
Database changed


mysql> create table a(x int(255) not null auto_increment primary key);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into a values(1);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(),(),(),(),(),(),(),(),(),();
Query OK, 10 rows affected (0.00 sec)
Records: 10  Duplicates: 0  Warnings: 0


mysql> select count(*) from a;
+----------+
| count(*) |
+----------+
|       11 |
+----------+
1 row in set (0.00 sec)

 

2.2备份数据

[root@bug ~]# mysqldump --single-transaction\
>   --flush-logs --master-data=2\
>   --set-gtid-purged=off --all-databases\
>  -uroot -porange -S/mysqldb/d_red/mysql.sock\
>  >/mysqldb/backup/`date "+%Y_%m_%d_%H_%M"`.dump

[root@bug ~]# cd /mysqldb/backup/
[root@bug backup]# ll
总用量 2364
-rw-r--r-- 1 root root 806434 8月  31 20:01 2018_08_31_20_01.dump

2.3,模拟业务,误删数据

mysql> drop table a;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from a;
ERROR 1146 (42S02): Table 'test.a' doesn't exist

  

2.4,使用mysqldump恢复数据

[root@bug ~]# mysql -uroot -porange -S/mysqldb/d_red/mysql.sock< /mysqldb/backup/2018_08_31_20_01.dump

mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 3161 (HY000) at line 70: Storage engine MyISAM is disabled (Table creation is disallowed).

  

2.5恢复失败,排查错误

[root@bug log]# more general.log

2018-08-31T20:01:50.058290+08:00           22 Query     DROP TABLE IF EXISTS `columns_priv`
2018-08-31T20:01:50.060213+08:00           22 Query     /*!40101 SET @saved_cs_client     = @@character_set_client */
2018-08-31T20:01:50.060407+08:00           22 Query     /*!40101 SET character_set_client = utf8 */
2018-08-31T20:01:50.060973+08:00           22 Query     CREATE TABLE `columns_priv` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges'
2018-08-31T20:01:50.062082+08:00           22 Quit
2018-08-31T20:01:50.102468+08:00           21 Query     show engine MyISAM status

#日志文件到此停止输出,初步判断因为出现show engine MyISAM status语句,导致mysqldump脚本执行过程报错跳出.
#查看备份集文件,重点检查存储引擎部分,
[root@bug backup]# more 2018_08_31_20_01.dump

-- Table structure for table `columns_priv`
--

DROP TABLE IF EXISTS `columns_priv`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `columns_priv` (
  `Host` char(60) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Db` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `User` char(32) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Table_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Column_name` char(64) COLLATE utf8_bin NOT NULL DEFAULT '',
  `Timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `Column_priv` set('Select','Insert','Update','References') CHARACTER SET utf8 NOT NULL DEFAULT '',
  PRIMARY KEY (`Host`,`Db`,`User`,`Table_name`,`Column_name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Column privileges';
/*!40101 SET character_set_client = @saved_cs_client */;

#果然,在备份的过程中,创建权限表的时候,mysqldump使用了MyISAM引擎,而数据库设置的默认存储引擎是innodb;
#到数据库内,进行进一步确认

mysql> show variables like '%engine%'; +----------------------------------+------------------+ | Variable_name | Value | +----------------------------------+------------------+ | default_storage_engine | InnoDB | | default_tmp_storage_engine | InnoDB | | disabled_storage_engines | MyISAM,FEDERATED | | internal_tmp_disk_storage_engine | InnoDB | +----------------------------------+------------------+ 4 rows in set (0.01 sec)


#问题锁定无误,MyISAM引擎被禁用,导致恢复时,无法创建权限表

  

2.5故障排除

mysql> set disabled_storage_engines=FEDERATED;
ERROR 1238 (HY000): Variable 'disabled_storage_engines' is a read only variable

#在数据库内修改失败,此参数为只读,只能去配置文件内修改,因为我采用的是个性化编译安装,所以默认配置文件为自定义的/mysqldb/d_red/conf/red.cnf.

[root@bug ~]# vi /mysqldb/d_red/conf/red.cnf

disabled_storage_engines ="FEDERATED"

#找到disabled_storage_engines参数,修改赋值.

#因为修改的是静态参数,所以需要重启数据库才能生效,

[root@bug bin]# mysql -uroot -p
Enter password: 
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/mysqldb/d_red/mysql.sock' (2)

#关闭数据库进程后,发现无法登陆

[root@bug bin]# ps -ef|grep mysql
root     19400  7903  0 20:36 pts/1    00:00:00 grep --color=auto mysql

#发现没有mysqld进程,也没有mysqld_safe进程,判断为启动失败

#查看错误日志

[root@bug log]# more mysql.err

2018-08-31T20:33:38.990846+08:00 0 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
2018-08-31T20:33:38.991415+08:00 0 [ERROR] unknown variable 'rpl_semi_sync_master_enabled=ON'

#提示权限表故障,原因很简单,当在使用mysqldump恢复时,默认情况下,恢复某表前,mysqldump会先删除同名的表,但权限表删除后,又没能恢复成功,导致数据库无法启动.

#解决思路,既然手里有备份的数据文件,只要构造全部的系统表的表结构就行了

#进行数据库的初始化,就能解决表构造表结构的问题.

[root@bug base]# mysqld --defaults-file=/mysqldb/d_red/conf/red.cnf --initialize-insecure --user=mysql --datadir=/mysqldb/d_red/data/ 

#因为使用了--initialize-insecure参数,所以初始化后的数据库密码为空

#使用mysqldump恢复数据,只能在数据库启动的情况下进行

#mysqldump默认会将数据恢复到同名的库下

#所以要先启动数据库,登陆,创建同名的库

[root@bug d_red]# mysql -uroot  -S/mysqldb/d_red/mysql.sock

mysql> alter user 'root'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.01 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

mysql> create database a;
Query OK, 1 row affected (0.01 sec)


#应用备份文件,进行数据恢复

[root@bug data]# mysql -uroot -p123456 -S/mysqldb/d_red/mysql.sock< /mysqldb/backup/2018_08_31_20_01.dump
mysql: [Warning] Using a password on the command line interface can be insecure.

#登陆数据库,进行验证
mysql> use test
Database changed
mysql>  select * from a;
+----+
| x  |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
| 11 |
+----+
11 rows in set (0.00 sec)

#被误删的数据已经全部找回

  

 

转载于:https://www.cnblogs.com/shc336/p/9564701.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值