前面我们讲解了 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 集群环境下如何对数据库中的数据进行物理备份。