MYSQLDUMP全备只恢复单库或是单表

一、发现问题

平时使用mysqldump备份时有人喜欢用-A –B参数进行全备,这样备份的时候会简单一点,但是恢复的时候如果直接恢复会把所有库都会恢复,这不是我们想要的结果。

二、分析问题

恢复单库或是单表我们可以通过shell命令从全库备份的SQL文件中截取出我们想要的部分。另外针对单库的恢复MySQL也有一个参数来解决这个问题.

三、解决问题

1、通过MySQL自带的参数恢复单库。

# 全备的数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| WL_TJ56_DICT       |
| mysql              |
| performance_schema |
| test               |
| test01             |
| test02             |
+--------------------+

#执行全备
[[email protected] ~]# mysqldump -uroot -pterjoy2016 -S /data/mysql/mysql_3306/mysql.sock -A -B --events > /opt/fullbackup.sql
Warning: Using a password on the command line interface can be insecure.
[[email protected] ~]# ll /opt/fullbackup.sql 
-rw-r--r--. 1 root root 651037 Dec 20 00:44 /opt/fullbackup.sql

#drop数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| WL_TJ56_DICT       |
| mysql              |
| performance_schema |
| test               |
| test01             |
| test02             |
+--------------------+
7 rows in set (0.00 sec)

mysql> drop database test;
Query OK, 2 rows affected (0.07 sec)

mysql> drop database test01;
Query OK, 1 row affected (0.02 sec)

mysql> drop database test02;
Query OK, 1 row affected (0.02 sec)

mysql> drop database WL_TJ56_DICT;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

# 最后恢复test库

#恢复库的时候报错,找不到test库。
[[email protected] ~]# mysql -uroot -pterjoy2016 -S /data/mysql/mysql_3306/mysql.sock --one-database test < /opt/fullbackup.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1049 (42000): Unknown database ‘test‘

#这时可以通过全备的SQL文件,找到创建库的语句,创建test库
[[email protected] ~]# grep -i "^create database" /opt/fullbackup.sql 
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `WL_TJ56_DICT` /*!40100 DEFAULT CHARACTER SET latin1 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mysql` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test01` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test02` /*!40100 DEFAULT CHARACTER SET utf8 */;

mysql> CREATE DATABASE /*!32312 IF NOT EXISTS*/ `test` /*!40100 DEFAULT CHARACTER SET utf8 */;
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

#test库创建好了,再进行恢复。
#恢复成功没有报错
[[email protected] ~]# mysql -uroot -pterjoy2016 -S /data/mysql/mysql_3306/mysql.sock --one-database test < /opt/fullbackup.sql

#最后来查看有没有恢复出来数据
#奇怪? 这里怎么其它库也出来了,不是只恢复test库吗?
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| WL_TJ56_DICT       |
| mysql              |
| performance_schema |
| test               |
| test01             |
+--------------------+
6 rows in set (0.01 sec)

#赶紧查看test有没有数据,这里可以查看test的数据
mysql> use test;
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 t;
+----+---------+
| id | name    |
+----+---------+
|  1 | xm      |
|  2 | xmj     |
|  3 | xuwu    |
|  4 | chuzan  |
|  5 | chuzan2 |
|  6 | chuzan3 |
+----+---------+
6 rows in set (0.00 sec)

#其它库呢? 这里没有恢复出数据来。在这里我也纠结好久,我明明只恢复test库怎么其它库也恢复出来了呢? 只是其它库没有数据而已。

mysql> use test01
Database changed
mysql> show tables;
Empty set (0.00 sec)

mysql> 

至此,单库通过参数恢复到此为止。

2、通过shell命令截取要恢复库的表结构及数据来进行恢复

#首先我drop掉用户的数据库,全备的数据我还是使用之前的备份。
#现在只有mysql自带的库了

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

#现在还是来恢复test库,其它库不恢复
#在操作系统执行下面的命令
[[email protected] ~]# cat /opt/fullbackup.sql | > sed -n -e ‘/^CREATE DATABASE.*`test`/,/^CREATE DATABASE/ p‘ | > sed -e ‘$d‘ | > mysql -uroot -pterjoy2016 -S /data/mysql/mysql_3306/mysql.sock

#现在来查看test库是否恢复成功
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

mysql> use test
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| Area           |
| t              |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from t;
+----+---------+
| id | name    |
+----+---------+
|  1 | xm      |
|  2 | xmj     |
|  3 | xuwu    |
|  4 | chuzan  |
|  5 | chuzan2 |
|  6 | chuzan3 |
+----+---------+
6 rows in set (0.00 sec)

mysql> 

#从上面结果来看,恢复是成功的。

3、通过shell命令截取要恢复表的表结构及数据来进行恢复

#首先登陆test数据库,删除t表
mysql> use test
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> show tables;
+----------------+
| Tables_in_test |
+----------------+
| Area           |
| t              |
+----------------+
2 rows in set (0.00 sec)

mysql> select * from t;
+----+---------+
| id | name    |
+----+---------+
|  1 | xm      |
|  2 | xmj     |
|  3 | xuwu    |
|  4 | chuzan  |
|  5 | chuzan2 |
|  6 | chuzan3 |
+----+---------+
6 rows in set (0.00 sec)

mysql> drop table t;
Query OK, 0 rows affected (0.01 sec)

mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| Area           |
+----------------+
1 row in set (0.00 sec)

# 在操作系统使用命令截取出表的结构及数据的SQL。

[[email protected] ~]# cat /opt/fullbackup.sql | sed -n -e ‘/^CREATE DATABASE.*`test`/,/^CREATE DATABASE/ p‘ | sed -e ‘$d‘ | sed -n ‘/-- Table structure for table `t`/,/UNLOCK TABLES;/p‘ > create_t.sql 

#查看生成的SQL语句。

[[email protected] ~]# cat create_t.sql 
-- Table structure for table `t`
--

DROP TABLE IF EXISTS `t`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `t` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT ‘‘,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `t`
--

LOCK TABLES `t` WRITE;
/*!40000 ALTER TABLE `t` DISABLE KEYS */;
INSERT INTO `t` VALUES (1,‘xm‘),(2,‘xmj‘),(3,‘xuwu‘),(4,‘chuzan‘),(5,‘chuzan2‘),(6,‘chuzan3‘);
/*!40000 ALTER TABLE `t` ENABLE KEYS */;
UNLOCK TABLES;

#重新登录并切换到test库,使用source 命令执行之前生成的SQL语句。
mysql> use test
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

mysql> source create_t.sql
Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.09 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

Query OK, 0 rows affected, 1 warning (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

#查看数据t表恢复成功
mysql> select  * from t;
+----+---------+
| id | name    |
+----+---------+
|  1 | xm      |
|  2 | xmj     |
|  3 | xuwu    |
|  4 | chuzan  |
|  5 | chuzan2 |
|  6 | chuzan3 |
+----+---------+
6 rows in set (0.00 sec)

至此单表的恢复成功了。

时间: 2024-10-25 06:04:39

MYSQLDUMP全备只恢复单库或是单表的相关文章

MySQL 备份脚本(单库/分库分表)

目录 MySQL数据库分库备份 MySQL数据库分库分表备份 MySQL数据库分库备份 数据库密码保存在/etc/my.cnf文件中,所以在执行与mysql相关的命令不需要输入密码 分库备份思路: mysqldump db1 >db1.sql.gz mysqldump db2 >db2.sql.gz 拿到库名 mysql -e 'show databases' |sed '1d' |grep -v "_schema" 1.注释版 #!/bin/bash # author:

mysql恢复单库、单表

从全备份中,还原某一个库(假如要还原的库叫做hellodb)内容: # mysqldump -uroot -proot --all-databases --master-data=2 > all.sql # mysql -uroot -proot -e 'create database hellodb;'  还原之前,首先要确保这个库的已经存在了,不然下面的命令会提示失败] # mysql -uroot -proot hellodb --one-database < all.sql   # -

如何用Percona XtraBackup进行MySQL从库的单表备份和恢复【转】

前提 应该确定采用的是单表一个表空间,否则不支持单表的备份与恢复. 在配置文件里边的mysqld段加上 innodb_file_per_table = 1 环境说明: 主库:192.168.0.1 从库1:192.168.0.2 从库2:192.168.0.3 备份工具 : Percona xtrabackup version 2.4.8 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 97330f7) 在主库上创建chenfe

Sharding-JDBC实现水平拆分-单库分表

参考资料:猿天地   https://mp.weixin.qq.com/s/901rNhc4WhLCQ023zujRVQ 作者:尹吉欢 当单表的数量急剧上升,超过了1千万以上,这个时候就要对表进行水平拆分. 表的水平拆分是什么? 就是将一个表拆分成N个表,就像一块大石头,搬不动,然后切割成10块,这样就能搬的动了.原理是一样的. 除了能够分担数量的压力,同时也能分散读写请求的压力,当然这个得看你的分片算法了,合理的算法才能够让数据分配均匀并提升性能. 今天我们主要讲单库中进行表的拆分,也就是不分

从MySQL全库备份中恢复某个库和某张表【转】

从MySQL全库备份中恢复某个库和某张表 一.全库备份-A [[email protected] backup]#mysqldump -uroot -p123456 --default-character-set=utf8 --single-transaction --extended-insert=false --hex-blob --master-data=2 --log-error=/tmp/test.err --routines --triggers --events --quick -

xtrabackup单库全备&增量

xtrabackup 介绍: xtrabackup有两个主要的工具:innobackupex和xtrabackup,xtrabackup只能备份InnoDB和XtraDB数据表,innobackupex封装了xtrabackup,可以备份MyISAM数据表. 第一步安装: 1.1.下载xtackbackup 地址:http://www.percona.com/downloads/XtraBackup/ 1.2.安装: tar -zxf percona-xtrabackup-2.0.8-587.t

xtrabackup备份工具两种命令单库增量备份还原

Innobackupex 参数解释: --defaults-file=[MY.CNF]该选项传递给xtrabackup子进程,从指定文件读取缺省选项 --apply-log 从备份恢复. --redo-only 该选项强制跳过rollback阶段,只进行redo.这是有必要使用的,如果备份后,要使用增量改变的. --copy-back 从备份目录拷贝数据和索引文件到datadir目录 --remote-host=HOSTNAME备份到远程主机上,使用ssh --stream=[tar|cpio(

(七)boost库之单例类

(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源.如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案. 单例,通常在一个大型项目中单例是非常常见的,boost库没有提供专门的单例类,但可以在其它库中找到他的实现 #include <boost/serializat

[运维笔记] Mysql单库备份脚本

工作中用到的Mysql单库备份Shell脚本,压缩备份,并在Crontab中添加计划任务,最多保存60天的备份 #!/bin/bash . /etc/profile USERNAME=zabbix PASSWORD=xxxxx DBHOST=127.0.0.1 DATABASES=zabbix BACKUPDIR=/data/mysqlback/zabbix/fulldb DATE=`date +%Y-%m-%d_%H_%M` rm -fv ${BACKUPDIR}/*$(date +%Y-%m