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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 数据库的备份恢复一直是数据库工作中的重点内容,如何合理有效地进行数据库的备份,并且当数据库环境发生意外时,能够以最快的时间恢复数据,则是衡量一个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 集群环境下如何对数据库中的数据进行物理备份。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
10天前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
57 10
|
3月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
223 36
|
6月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。
|
3月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
157 5
|
3月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
|
5月前
|
关系型数据库 MySQL Linux
在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾
以上就是在Linux环境下备份Docker中的MySQL数据并传输到其他服务器以实现数据级别的容灾的步骤。这个过程就像是一场接力赛,数据从MySQL数据库中接力棒一样传递到备份文件,再从备份文件传递到其他服务器,最后再传递回MySQL数据库。这样,即使在灾难发生时,我们也可以快速恢复数据,保证业务的正常运行。
248 28
|
5月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
119 15
|
10月前
|
关系型数据库 MySQL Linux
Linux环境下MySQL数据库自动定时备份实践
数据库备份是确保数据安全的重要措施。在Linux环境下,实现MySQL数据库的自动定时备份可以通过多种方式完成。本文将介绍如何使用`cron`定时任务和`mysqldump`工具来实现MySQL数据库的每日自动备份。
580 3
|
10月前
|
监控 关系型数据库 MySQL
Linux环境下MySQL数据库自动定时备份策略
在Linux环境下,MySQL数据库的自动定时备份是确保数据安全和可靠性的重要措施。通过设置定时任务,我们可以每天自动执行数据库备份,从而减少人为错误和提高数据恢复的效率。本文将详细介绍如何在Linux下实现MySQL数据库的自动定时备份。
290 3
|
11月前
|
安全 关系型数据库 MySQL
MySQL用户备份
【10月更文挑战第2天】MySQL用户备份
248 3

推荐镜像

更多