mysql备份和恢复

mysql备份

mysqldump

1.简介
mysqldump是mysql自带的逻辑备份工具
2.备份原理
通过协议链接到 mysql 数据库,将需要备份的数据查询出来,将查询出的数据转换成对应的insert 语句,当我们需要还原这些数据时,只要执行这些 insert 语句,即可将对应的数据还原。
3.备份命令
mysqldump [选项]数据库名 [表名]> 脚本名
mysqldump [选项]–数据库名 [选项 表名]> 脚本名
mysqldump [选项]–all-databases [选项]> 脚本名
选项说明

参数名缩写含义
–host-h服务器IP地址
–port-P服务器端口号
–user-uMySQL 用户名
–pasword-pMySQL 密码
–databases指定要备份的数据库
–all-databases备份mysql服务器上的所有数据库
–compact压缩模式,产生更少的输出
–comments添加注释信息
–complete-insert输出完成的插入语句
–lock-tables备份前,锁定所有数据库表
–no-create-db/–no-create-info禁止生成创建数据库语句
–force当出现错误时仍然继续备份操作
–default-character-set指定默认字符集
–add-locks备份数据库表时锁定数据库表

4.测试
执行

mysqldump -h 127.0.0.1 -P3306 -uroot -p'root$123' --databases mysql > /app/mysql/data/backup/mysql.sql

查看输出脚本:

DROP TABLE IF EXISTS `help_category`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `help_category` (
  `help_category_id` smallint(5) unsigned NOT NULL,
  `name` char(64) NOT NULL,
  `parent_category_id` smallint(5) unsigned DEFAULT NULL,
  `url` text NOT NULL,
  PRIMARY KEY (`help_category_id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 STATS_PERSISTENT=0 COMMENT='help categories';
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `help_category`
--

LOCK TABLES `help_category` WRITE;
/*!40000 ALTER TABLE `help_category` DISABLE KEYS */;
INSERT INTO `help_category` VALUES (0,'Contents',0,''),(1,'Help Metadata',0,''),(2,'Data Types',0,''),(3,'Administration',0,''),(4,'Procedures',0,''),(5,'Language Structure',0,''),(6,'Geographic Features',0,''),(7,'MBR',6,''),(8,'WKT',6,''),(9,'Functions',0,''),(10,'Comparison Operators',9,''),(11,'Logical Operators',9,''),(12,'Control Flow Functions',9,''),(13,'Numeric Functions',9,''),(14,'Date and Time Functions',9,''),(15,'String Functions',9,''),(16,'Bit Functions',9,''),(17,'Encryption Functions',9,''),(18,'Locking Functions',9,''),(19,'Information Functions',9,''),(20,'Spatial Functions',9,''),(21,'WKT Functions',20,''),(22,'WKB Functions',20,''),(23,'Geometry Constructors',20,''),(24,'Geometry Property Functions',20,''),(25,'Point Property Functions',20,''),(26,'LineString Property Functions',20,''),(27,'Polygon Property Functions',20,''),(28,'GeometryCollection Property Functions',20,''),(29,'Geometry Relation Functions',20,''),(30,'MBR Functions',20,''),(31,'GROUP BY Functions and Modifiers',9,''),(32,'Miscellaneous Functions',9,''),(33,'Data Definition',0,''),(34,'Data Manipulation',0,''),(35,'Transactions',0,''),(36,'Compound Statements',0,''),(37,'Account Management',0,''),(38,'Table Maintenance',0,''),(39,'User-Defined Functions',0,''),(40,'Plugins',0,''),(41,'Utility',0,''),(42,'Storage Engines',0,'');
/*!40000 ALTER TABLE `help_category` ENABLE KEYS */;
UNLOCK TABLES;

5.限制条件:
①mysqldump的默认模式不转储 INFORMATION_SCHEMA, performance_schema或sys。要转储其中任何一个,请在命令行上明确指定它们。您也可以使用--databases选项指定 。对于 INFORMATION_SCHEMA和 performance_schema,还使用--skip-lock-tables 选项。

②mysqldump不会转储NDB群集 ndbinfo信息数据库。

③mysqldump不转储 InnoDB CREATE TABLESPACE语句。

④mysqldump包含重新创建数据库转储的general_log和 slow_query_log表的 语句 mysql。日志表的内容不转储。
6.结论
mysqldump通过建表——锁表——插入的方式备份。

mydumper

1.简介
Mydumper是一个针对MySQL和Drizzle的高性能多线程备份和恢复工具。
2.Mydumper主要特性
轻量级C语言写的
比mysqldump快十倍
多线程备份,备份后会生成多个备份文件
事务性和非事务性表一致的快照(适用于0.2.2以上版本)
快速的文件压缩
支持导出binlog
多线程恢复(适用于0.2.1以上版本)
以守护进程的工作方式,定时快照和连续二进制日志(适用于0.5.0以上版本)
开源 (GNU GPLv3)

3.备份方法
mydumper [OPTION] multi-threaded MySQL dumping
选项说明

参数名缩写含义
–database-B备份数据库
–tables-list-T需要备份的表,名字用逗号隔开 (不排除regex选项)
–omit-from-file-OFile containing a list of database.table entries to skip, one per line (skips before applying regex option)
–outputdir-o输出目录
–statement-size-s生成的insert语句的字节数,默认1000000
–rows-r将表按行分块时,指定的块行数,指定这个选项会关闭–chunk-filesize
–chunk-filesize-F将表按大小分块时,指定的块大小,单位是 MB
–compress-c压缩输出文件
–build-empty-files-e如果表数据是空,还是产生一个空文件(默认无数据则只有表结构文件)
–regex-x是同正则表达式匹配 ‘db.table’
–ignore-engines-i忽略的存储引擎,用逗号分割
–insert-ignore-NDump rows with INSERT IGNORE
–no-schemas-m不备份表结构
–no-data-d不备份表数据
–triggers-G备份触发器
–events-E备份事件
–routines-R备份存储过程和函数
–no-views-W不备份视图
–no-locks-k不使用临时共享只读锁,使用这个选项会造成数据不一致
–no-backup-locks不使用percona备份锁
–less-locking减少对InnoDB表的锁施加时间
–long-query-guard-l设定阻塞备份的长查询超时时间,单位是秒,默认是60秒(超时后默认mydumper将会退出)
–kill-long-queries-K杀掉长查询 (不退出)
–daemon-D启用守护进程模式,守护进程模式以某个间隔不间断对数据库进行备份
–snapshot-interval-I快照间隔时间,默认60s,需要在daemon模式下
–logfile-L使用的日志文件名(mydumper所产生的日志), 默认使用标准输出
–tz-utcSET TIME_ZONE=’+00:00’ at top of dump to allow dumping of TIMESTAMP data when a server has data in different time zones or data is being moved between servers with different time zones, defaults to on use --skip-tz-utc to disable.
–skip-tz-utc同上
–use-savepoints使用savepoints来减少采集metadata所造成的锁时间,需要 SUPER 权限
–success-on-1146Not increment error count and Warning instead of Critical in case of table doesn’t exist
–lock-all-tables锁住实例上所有表,而不是给实例施加 FTWRL
–updated-since-U使用 update_time 来备份最近 U 天内有过更新记录 的表
–trx-consistency-onlyTransactional consistency only
–complete-insert包含列名的完整 INSERT 语句
–host-h连接的主机名
–user-u备份所使用的用户
–password-p密码
–ask-passwordPrompt For User password
–port-P端口
–socket-S使用socket通信时的socket文件
–threads-t开启的备份线程数,默认是4
–compress-protocol-C压缩与mysql通信的数据
–version-V显示版本号
–verbose-v输出信息模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默认为 2

3.备份原理
备份pcloud_test库到/home/hhxsy/backup
mydumper -u root -p 'root$123' -P 3306 -h 127.0.0.1 -B pcloud_test -o /home/hhxsy/backup/

查看备份数据:

总用量 36  
-rw-r--r--. 1 root root  470 9月  14 10:47 metadata
-rw-r--r--. 1 root root  342 9月  14 10:47 pcloud_test.p_hospital-schema.sql
-rw-r--r--. 1 root root 1074 9月  14 10:47 pcloud_test.p_hospital.sql
-rw-r--r--. 1 root root  507 9月  14 10:47 pcloud_test.p_medical_detail-schema.sql
-rw-r--r--. 1 root root  690 9月  14 10:47 pcloud_test.p_medical-schema.sql
-rw-r--r--. 1 root root  340 9月  14 10:47 pcloud_test.p_person-schema.sql
-rw-r--r--. 1 root root 8032 9月  14 10:47 pcloud_test.p_person.sql
-rw-r--r--. 1 root root   70 9月  14 10:47 pcloud_test-schema-create.sql

查看metadata:保存了起始日志和偏移量以及gtid

Started dump at: 2020-09-14 10:47:24
SHOW MASTER STATUS:
        Log: mysql-bin.000058
        Pos: 2230
        GTID:5b9728c1-aed4-11ea-ba44-000c29f5d996:1-1978,
a81dba10-e1b8-11ea-89d0-000c29ae4d20:1,
e965d951-ab22-11ea-ba71-000c29a62bc6:1-3

SHOW SLAVE STATUS:
        Host: 192.168.77.130
        Log: mysql-bin.000002
        Pos: 1024
        GTID:5b9728c1-aed4-11ea-ba44-000c29f5d996:1-1978,
a81dba10-e1b8-11ea-89d0-000c29ae4d20:1,
e965d951-ab22-11ea-ba71-000c29a62bc6:1-3

Finished dump at: 2020-09-14 10:47:24

schema文件保存了表结构,普通的保存了批量插入的sql语句

/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;

/*!40103 SET TIME_ZONE='+00:00' */;
CREATE TABLE `p_hospital` (
  `id` varchar(32) NOT NULL COMMENT '医院Id',
  `name` varchar(50) NOT NULL COMMENT '医院名称',
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='医院表';
/*!40101 SET NAMES binary*/;
/*!40014 SET FOREIGN_KEY_CHECKS=0*/;
/*!40103 SET TIME_ZONE='+00:00' */;
INSERT INTO `p_hospital` VALUES
("422640eecbb04e9f8389676154fb1b2b","湖南省人民医院422640eecbb04e9f8389676154fb1b2b"),
("5f88cb9fb72f4a028edc3317d079cf3e","湖南省人民医院5f88cb9fb72f4a028edc3317d079cf3e"),
("60478795a1654144b7f89eb80d67bacf","湖南省人民医院60478795a1654144b7f89eb80d67bacf"),
("614c5bd6247a4ad18ac454525ea5202e","湖南省人民医院614c5bd6247a4ad18ac454525ea5202e"),
("646f27d62d954fef9f3023106e4a8fe6","湖南省人民医院646f27d62d954fef9f3023106e4a8fe6"),
("6fb9975ede5347f89a7807d9ecfe552e","湖南省人民医院6fb9975ede5347f89a7807d9ecfe552e"),
("836119c1ce794b60a92af51ef033b7a0","湖南省人民医院836119c1ce794b60a92af51ef033b7a0"),
("afb9a7591a1c43e78ef3d5c5ed53e522","湖南省人民医院afb9a7591a1c43e78ef3d5c5ed53e522"),
("affe3ad177974f0f8e7a829f66acb968","湖南省人民医院affe3ad177974f0f8e7a829f66acb968"),
("dad7e3a46d63406b9e47d12483a6a88a","湖南省人民医院dad7e3a46d63406b9e47d12483a6a88a");

4.查看备份过程
查看general_log是否开启:

mysql> show variables like'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log   | OFF   |
+---------------+-------+
1 row in set (0.00 sec)

开启genral_log

mysql> set @@global.general_log=1;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like'general_log';
+------------------+-------------------------------+
| Variable_name    | Value                         |
+------------------+-------------------------------+
| general_log      | ON                            |
| general_log_file | /app/mysql/data/localhost.log |
+------------------+-------------------------------+
2 rows in set (0.01 sec)

备份pcloud_test:
mydumper -u root -p 'root$123' -P 3306 -h 127.0.0.1 -B pcloud_test -o /home/hhxsy/backup/
查看localhost.log:
tail -f /mysql/data/localhost.log

/app/mysql/bin/mysqld, Version: 5.7.30-log (MySQL Community Server (GPL)). started with:
Tcp port: 3306  Unix socket: /app/mysql/data/mysql.sock
Time                                    Id Command      Argument
2020-09-14T10:55:28.696549+08:00        46589 Query     show variables like'general_log'
2020-09-14T11:05:17.429139+08:00        46589 Quit
2020-09-14T11:05:28.475703+08:00        47302 Connect   root@127.0.0.1 on pcloud_test using SSL/TLS
2020-09-14T11:05:28.475894+08:00        47302 Query     SET SESSION wait_timeout = 2147483
2020-09-14T11:05:28.476005+08:00        47302 Query     SET SESSION net_write_timeout = 2147483
2020-09-14T11:05:28.476206+08:00        47302 Query     SHOW PROCESSLIST
2020-09-14T11:05:28.476407+08:00        47302 Query     FLUSH TABLES WITH READ LOCK
2020-09-14T11:05:28.477170+08:00        47302 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
2020-09-14T11:05:28.477294+08:00        47302 Query     /*!40101 SET NAMES binary*/
2020-09-14T11:05:28.477391+08:00        47302 Query     SHOW MASTER STATUS
2020-09-14T11:05:28.477550+08:00        47302 Query     SHOW SLAVE STATUS
2020-09-14T11:05:28.504368+08:00        47303 Connect   root@127.0.0.1 on  using SSL/TLS
2020-09-14T11:05:28.504535+08:00        47303 Query     SET SESSION wait_timeout = 2147483
2020-09-14T11:05:28.504649+08:00        47303 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2020-09-14T11:05:28.504801+08:00        47303 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
2020-09-14T11:05:28.504912+08:00        47303 Query     /*!40103 SET TIME_ZONE='+00:00' */
2020-09-14T11:05:28.505019+08:00        47303 Query     /*!40101 SET NAMES binary*/
2020-09-14T11:05:28.521761+08:00        47304 Connect   root@127.0.0.1 on  using SSL/TLS
2020-09-14T11:05:28.521919+08:00        47304 Query     SET SESSION wait_timeout = 2147483
2020-09-14T11:05:28.522026+08:00        47304 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2020-09-14T11:05:28.522105+08:00        47304 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
2020-09-14T11:05:28.522199+08:00        47304 Query     /*!40103 SET TIME_ZONE='+00:00' */
2020-09-14T11:05:28.522358+08:00        47304 Query     /*!40101 SET NAMES binary*/
2020-09-14T11:05:28.552917+08:00        47305 Connect   root@127.0.0.1 on  using SSL/TLS
2020-09-14T11:05:28.553079+08:00        47305 Query     SET SESSION wait_timeout = 2147483
2020-09-14T11:05:28.553190+08:00        47305 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2020-09-14T11:05:28.553267+08:00        47305 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
2020-09-14T11:05:28.553406+08:00        47305 Query     /*!40103 SET TIME_ZONE='+00:00' */
2020-09-14T11:05:28.553497+08:00        47305 Query     /*!40101 SET NAMES binary*/
2020-09-14T11:05:28.574362+08:00        47306 Connect   root@127.0.0.1 on  using SSL/TLS
2020-09-14T11:05:28.574511+08:00        47306 Query     SET SESSION wait_timeout = 2147483
2020-09-14T11:05:28.574625+08:00        47306 Query     SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ
2020-09-14T11:05:28.574708+08:00        47306 Query     START TRANSACTION /*!40108 WITH CONSISTENT SNAPSHOT */
2020-09-14T11:05:28.574805+08:00        47306 Query     /*!40103 SET TIME_ZONE='+00:00' */
2020-09-14T11:05:28.574893+08:00        47306 Query     /*!40101 SET NAMES binary*/
2020-09-14T11:05:28.575014+08:00        47302 Init DB   pcloud_test
2020-09-14T11:05:28.575100+08:00        47302 Query     SHOW TABLE STATUS
2020-09-14T11:05:28.576268+08:00        47302 Query     SHOW CREATE DATABASE `pcloud_test`
2020-09-14T11:05:28.576946+08:00        47303 Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='pcloud_test' and TABLE_NAME='p_hospital' and extra like '%GENERATED%'
2020-09-14T11:05:28.578000+08:00        47304 Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='pcloud_test' and TABLE_NAME='p_medical' and extra like '%GENERATED%'
2020-09-14T11:05:28.578244+08:00        47305 Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='pcloud_test' and TABLE_NAME='p_medical_detail' and extra like '%GENERATED%'
2020-09-14T11:05:28.578823+08:00        47305 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `pcloud_test`.`p_medical_detail`
2020-09-14T11:05:28.579179+08:00        47304 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `pcloud_test`.`p_medical`
2020-09-14T11:05:28.579452+08:00        47304 Query     SHOW CREATE TABLE `pcloud_test`.`p_hospital`
2020-09-14T11:05:28.579912+08:00        47305 Query     select COLUMN_NAME from information_schema.COLUMNS where TABLE_SCHEMA='pcloud_test' and TABLE_NAME='p_person' and extra like '%GENERATED%'
2020-09-14T11:05:28.580242+08:00        47304 Query     SHOW CREATE TABLE `pcloud_test`.`p_medical`
2020-09-14T11:05:28.580559+08:00        47304 Query     SHOW CREATE TABLE `pcloud_test`.`p_medical_detail`
2020-09-14T11:05:28.580666+08:00        47305 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `pcloud_test`.`p_person`
2020-09-14T11:05:28.581854+08:00        47305 Query     SHOW CREATE TABLE `pcloud_test`.`p_person`
2020-09-14T11:05:28.581996+08:00        47303 Query     SELECT /*!40001 SQL_NO_CACHE */ * FROM `pcloud_test`.`p_hospital`
2020-09-14T11:05:28.582428+08:00        47302 Query     UNLOCK TABLES /* FTWRL */
2020-09-14T11:05:28.584802+08:00        47304 Quit
2020-09-14T11:05:28.584922+08:00        47303 Quit
2020-09-14T11:05:28.584987+08:00        47302 Quit
2020-09-14T11:05:28.585974+08:00        47305 Quit
2020-09-14T11:05:28.588356+08:00        47306 Quit
2020-09-14T11:06:45.241784+08:00        47384 Connect   root@localhost on  using Socket
2020-09-14T11:06:45.242034+08:00        47384 Query     select @@version_comment limit 1
2020-09-14T11:06:53.684167+08:00        47384 Query     show variables like'general%'
2020-09-14T11:07:26.437131+08:00        47384 Quit

47302为主线程,47303,47304,47305,47306四个线程链接数据库
五个线程并行执行,完毕后退出。

5.结论
1、主线程 FLUSH TABLES WITH READ LOCK, 施加全局只读锁,保证数据的一致性
2、读取当前时间点的二进制日志文件名和日志写入的位置并记录在metadata文件中,以供即使点恢复使用
3、N个(线程数可以指定,默认是4)dump线程把事务隔离级别改为可重复读(SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ) 并开启读一致的事物
4、dump non-InnoDB tables, 首先导出非事物引擎的表
5、主线程UNLOCK TABLES:非事物引擎备份完后,释放全局只读锁
6、dump InnoDB tables, 基于事物导出InnoDB表
7、事物结束

mysql恢复

myloader

1.简介
与mydumper相配套的恢复工具则是myloader,主要用于将dump出来的sql以并行的方式进行恢复。
2.主要流程
①首先由myloader主线程完成建库建表,依次将备份目录下建库和建表文件执行应用到目标数据库实例中;
②接着myloader主线程会生成多个工作线程,由这些工作线程将所有database.table.\*.sql文件中的记录导入到对应表中,这个阶段是并行的,并行粒度为文件,工作线程完成所有database.table.\*.sql文件数据导入后销毁;
③最后主线程将创建函数、存储进程、事件,以及创建表视图、触发器的文件执行导入对应数据库和表中。

3.备份方法
myloader [OPTION...]multi-threaded MySQL loader
选项说明

参数名缩写含义
–directory-dDirectory of the dump to import之前备份好的现在需要导入的文件夹
–queries-per-transaction-qNumber of queries per transaction, default 1000每次事物执行的查询数量,默认是1000
–overwrite-tables-oDrop tables if they already exist如果要恢复的表存在,则先drop掉该表,使用该参数,需要备份时候要备份表结构
–database-BAn alternative database to restore into还原到指定的数据库
–source-db-sDatabase to restore选择被还原的数据库,将这个数据库数据还原到–database指定的数据库里
–enable-binlog-eEnable binary logging of the restore data启用还原数据的二进制日志
–host-h连接的主机名
–user-u备份所使用的用户
–password-p密码
–ask-passwordPrompt For User password
–port-P端口
–socket-S使用socket通信时的socket文件
–threads-t开启的备份线程数,默认是4
–compress-protocol-C压缩与mysql通信的数据
–version-V显示版本号
–verbose-v输出信息模式, 0 = silent, 1 = errors, 2 = warnings, 3 = info, 默认为 2

source

导入方法
mysql> source /app/mysql/aaa.sql

mysqlimport

导入方法
mysqlimport [OPTIONS]database textfile

选项说明

参数名缩写含义
–delete-d新数据导入数据表中之前删除数据数据表中的所有信息
–force-f不管是否遇到错误,mysqlimport将强制继续插入数据
–ignore-imysqlimport跳过或者忽略那些有相同唯一 关键字的行, 导入文件中的数据将被忽略。
-lock-tables-l数据被插入之前锁住表,这样就防止了, 你在更新数据库时,用户的查询和更新受到影响。
-replace-r这个选项与-i选项的作用相反;此选项将替代 表中有相同唯一关键字的记录。
–fields-enclosed-by= char指定文本文件中数据的记录时以什么括起的, 很多情况下 数据以双引号括起。 默认的情况下数据是没有被字符括起的。
–fields-terminated-by=char指定各个数据的值之间的分隔符,在句号分隔的文件中, 分隔符是句号。您可以用此选项指定数据之间的分隔符。 默认的分隔符是跳格符(Tab)
–lines-terminated-by=str此选项指定文本文件中行与行之间数据的分隔字符串 或者字符。 默认的情况下mysqlimport以newline为行分隔符。 您可以选择用一个字符串来替代一个单个的字符: 一个新行或者一个回车。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值