探索MySQL-Cluster奥秘系列之逻辑备份(13)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库的备份恢复一直是数据库工作中的重点内容,如何合理有效地进行数据库的备份,并且当数据库环境发生意外时,能够以最快的时间恢复数据,则是衡量一个DBA是否称职的非常重要的指标。接下来这一小节,我们就来重点看下如何对MySQL-Cluster环境进行逻辑备份。

前面我们讲解了 MySQL Cluster 环境的搭建过程以及日常的维护管理,接下来我们将用 3 个小节讲解MySQL Cluster 集群环境的备份恢复,如逻辑备份、物理备份、数据恢复。

MySQL 数据库的备份方式可以采用逻辑备份也可以采用物理备份,二者的区别如下:

  • 逻辑备份是将数据库中的数据以 SQL 脚本的方式进行导出,导出的数据备份文件是以文本文件的形式存在,逻辑备份适用于数据量小、而且易用平台迁移的场景。
  • 物理备份是以物理拷贝的方式备份数据文件,物理备份则适用于数据量大,对数据备份有时效性要求的场景。

这一小节,我们主要来讲解一下对于 MySQL Cluster 环境,如何进行逻辑备份。

我们在使用逻辑备份方式备份 MySQL 数据库时,可以选用多种备份工具,比如我们有 mysqldump 和mysqlpump。这两种逻辑备份方式的区别是什么呢?

mysqlpump 工具是 mysqldump 工具的增强版,对于小数据量的逻辑备份可以采用 mysqldump,对于大数据量的逻辑备份可以采用 mysqlpump。原因在于 mysqldump 只支持单线程的备份任务,备份效率低,而 mysqlpump 命令则可以进行多线程的数据备份,备份效率高。

接下来,我们分别使用 mysqldump 和 mysqlpump 两种方式来演示如何对 MySQL Cluster 集群环境中的数据进行备份。

首先要讲的是,MySQL Cluster 集群环境的逻辑备份是在 SQL 节点发起的,因为对MySQL Cluster集群环境只有 SQL 节点才可以接收和解析具体的 SQL 命令。而且在演示备份之前,我们要先在当前的MySQL Cluster 环境中创建一些模拟数据。

mysql> create table tt1 (id int,name char(10)) engine=ndb;
Query OK, 0 rows affected (0.05 sec)
mysql> insert into tt1(id,name) values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.05 sec)
Records: 3  Duplicates: 0  Warnings: 0
mysql> select * from tt1;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.03 sec)
mysql> create table tt2(emp_id int,emp_name char(10),emp_age int) engine=ndb;
Query OK, 0 rows affected (0.05 sec)
mysql> insert into tt2(emp_id,emp_name,emp_age) values(1,'alex',21),(2,'tom',25);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from tt2;
+--------+----------+---------+
| emp_id | emp_name | emp_age |
+--------+----------+---------+
|      1 | alex     |      21 |
|      2 | tom      |      25 |
+--------+----------+---------+
2 rows in set (0.01 sec)

通过上面的代码,我们创建了两张测试表 tt1 和 tt2,接下来我们对数据进行备份。首先,我们使用 mysqldump 工具来进行数据的备份。

mysqldump 的数据备份

注意,下面的命令是只对 testdb 数据库中的数据信息进行备份,因为我们前面创建的测试表是存放在testdb 数据库下的。

[mysql@mysql04 ~]$ mysqldump  testdb -uroot -p > testdb_1.bak
Enter password: 
[mysql@mysql04 ~]$ ls -l
total 4
-rw-rw-r-- 1 mysql mysql   2051 Mar 10 16:00 testdb_1.bak

接下来,我们查看通过 mysqldump 工具备份的文件内容。

[mysql@mysql04 ~]$ more testdb_1.bak 
-- MySQL dump 10.13  Distrib 5.7.36-ndb-7.6.20, for linux-glibc2.12 (x86_64)
--
-- Host: localhost    Database: testdb
-- ------------------------------------------------------
-- Server version       5.7.36-ndb-7.6.20-cluster-gpl
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `tt1`
--
DROP TABLE IF EXISTS `tt1`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tt1` (
  `id` int(11) DEFAULT NULL,
  `name` char(10) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tt1`
--
LOCK TABLES `tt1` WRITE;
/*!40000 ALTER TABLE `tt1` DISABLE KEYS */;
INSERT INTO `tt1` VALUES (1,'a'),(3,'c'),(2,'b');
/*!40000 ALTER TABLE `tt1` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Table structure for table `tt2`
--
DROP TABLE IF EXISTS `tt2`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tt2` (
  `emp_id` int(11) DEFAULT NULL,
  `emp_name` char(10) DEFAULT NULL,
  `emp_age` int(11) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `tt2`
--
LOCK TABLES `tt2` WRITE;
/*!40000 ALTER TABLE `tt2` DISABLE KEYS */;
INSERT INTO `tt2` VALUES (1,'alex',21),(2,'tom',25);
/*!40000 ALTER TABLE `tt2` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2022-03-10 21:14:40

这样我们就实现了对数据库 testdb 的逻辑备份。当然了,我们其实可以对 MySQL Cluster 集群下的全部数据库进行数据的备份,这个时候只是需要将 -d 参数替换为 --all-databases 即可,具体操作如下所示:

[mysql@mysql04 ~]$ mysqldump  --all-databases -uroot -p > all_db_1.bak
Enter password:

那么以上就是关于使用 mysqldump 工具来对 MySQL Cluster 集群环境下数据信息的备份。

mysqlpump 的数据备份

使用 mysqlpump 工具来对 MySQL Cluster 集群环境中数据进行备份的操作和 mysqldump 非常类似,具体的操作命令如下所示:

[mysql@mysql04 ~]$ mysqlpump testdb -uroot -p > testdb_2.bak
Enter password: 
Dump progress: 1/2 tables, 0/5 rows
Dump completed in 58 milliseconds
[mysql@mysql04 ~]$ ll
total 4
-rw-rw-r-- 1 mysql mysql 1360 Mar 10 16:02 testdb_2.bak

接下来,我们查看通过 mysqlpump 工具备份好的文件内容。

[mysql@mysql04 ~]$ more  testdb_2.bak
-- Dump created by MySQL pump utility, version: 5.7.36-ndb-7.6.20, linux-glibc2.12 (x86_64)
-- Dump start time: Thu Mar 10 21:17:17 2022
-- Server version: 5.7.36
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE;
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET @@SESSION.SQL_LOG_BIN= 0;
SET @OLD_TIME_ZONE=@@TIME_ZONE;
SET TIME_ZONE='+00:00';
SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT;
SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS;
SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION;
SET NAMES utf8;
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `testdb` /*!40100 DEFAULT CHARACTER SET utf8 */;
CREATE TABLE `testdb`.`tt1` (
`id` int(11) DEFAULT NULL,
`name` char(10) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=utf8
;
INSERT INTO `testdb`.`tt1` VALUES (1,"a"),(3,"c"),(2,"b");
CREATE TABLE `testdb`.`tt2` (
`emp_id` int(11) DEFAULT NULL,
`emp_name` char(10) DEFAULT NULL,
`emp_age` int(11) DEFAULT NULL
) ENGINE=ndbcluster DEFAULT CHARSET=utf8
;
INSERT INTO `testdb`.`tt2` VALUES (2,"tom",25),(1,"alex",21);
SET TIME_ZONE=@OLD_TIME_ZONE;
SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT;
SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS;
SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
SET SQL_MODE=@OLD_SQL_MODE;
-- Dump end time: Thu Mar 10 21:17:17 2022

mysqlpump 工具备份全部数据库的操作命令如下:

[mysql@mysql04 ~]$ mysqlpump --all-databases -uroot -p > all_db_2.bak
Enter password: 
Dump completed in 444 milliseconds

我们可以看到,使用 mysqlpump 工具和使用 mysqldump 工具备份好的文件内容基本上是一样的。

以上就是关于在 MySQL Cluster 集群环境下对于数据备份方面的讲解和演示,你在 MySQL Cluster 集群环境下进行逻辑备份时,一定要注意,必须在 SQL 节点执行相应的备份命令,或者在其他的客户端服务器上,执行的备份命令中的连接地址必须为 SQL 节点的地址。

好了,关于 MySQL Cluster 集群环境下的数据备份方面的内容就讲解到这里。下一小节我们来讲解在MySQL Cluster 集群环境下如何对数据库中的数据进行物理备份。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 关系型数据库 MySQL
mysql数据库备份与恢复
MySQL数据库的备份与恢复是确保数据安全性和业务连续性的关键操作。
139 4
|
1月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
114 3
|
1月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
51 3
|
2月前
|
安全 关系型数据库 MySQL
MySQL用户备份
【10月更文挑战第2天】MySQL用户备份
69 3
|
2月前
|
存储 关系型数据库 MySQL
MySQL如何备份?
【10月更文挑战第2天】MySQL如何备份?
185 3
|
4月前
|
SQL 关系型数据库 MySQL
在Linux中,如何备份和恢复MySQL数据库?
在Linux中,如何备份和恢复MySQL数据库?
|
4月前
|
SQL 数据可视化 关系型数据库
MySQL 备份可视化巡检系统
MySQL 备份可视化巡检系统
|
4月前
|
存储 关系型数据库 MySQL
MySQL备份与恢复
MySQL备份与恢复
70 0
|
4月前
|
关系型数据库 MySQL Shell
分享一篇mysql数据库备份脚本
分享一篇mysql数据库备份脚本
39 0
|
4月前
|
关系型数据库 MySQL Shell
MySQL 备份:从mysqldump全备中 匹配出某几个表
MySQL 备份:从mysqldump全备中 匹配出某几个表