MySQL 如何避免克隆失败后再次初始化

本文章讨论了当您没有足够的磁盘空间来存储两个数据集时,使用带有安全选项DATA DIRECTORY 的 CLONE INSTANCE 命令。

作者:Sveta Smirnova,数据库专家。

本文来源:www.percona.com/,爱可生开源社区翻译。

本文约 800 字,预计阅读需要 3 分钟。

在我之前关于 CLONE INSTANCE 命令的博客文章《MySQL 克隆插件不是你的备份》中,我提到使用选项 DATA DIRECTORY 有助于避免在克隆操作失败时需要从头开始重新初始化副本和克隆相关设置的情况。

MySQL 克隆插件简化了新副本的配置,但不会简化失败后的服务器恢复,除非您准备从头开始重新安装 MySQL 实例。

但是,当您克隆一个已经有巨大数据集的复制副本时,您可能没有足够的空间容纳两个数据集:一个来自源服务器,另一个来自复制副本上的数据。

由于您决定从另一台服务器克隆复制副本,因此您同意丢失当前数据。DATA DIRECTORY 选项的唯一需要是在出现故障时保持与克隆相关的权限和设置不变。您可以使用以下策略之一安全地执行克隆操作。

从头开始

要执行此操作,请停止当前服务器,删除数据目录,再次初始化它,进行连接,并设置与克隆相关的权限和选项。这样,您将拥有一个带有小数据目录的新实例,因此您可以使用选项 DATA DIRECTORY ,而不用担心超出可用磁盘空间。

保留现有 MySQL 架构

如果不想重新安装实例,可以从中删除用户数据。

  • 列出所有带查询的非系统数据库。
sql 复制代码
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 
WHERE SCHEMA_NAME NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');
  • 将它们逐一移除。您可以使用以下存储过程来执行此操作。
sql 复制代码
CREATE PROCEDURE p1()
BEGIN
  DECLARE done INT DEFAULT FALSE;
  DECLARE dbname VARCHAR(64);
  DECLARE c1 CURSOR FOR SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema', 'test');
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

  OPEN c1;

  drop_loop: LOOP
    FETCH c1 INTO dbname;
    IF done THEN
      LEAVE drop_loop;
    END IF;
    SET @temp = CONCAT('DROP DATABASE ', dbname);
    PREPARE stmt FROM @temp;
    EXECUTE stmt;
  END LOOP;

  CLOSE c1;
END

如果您将 InnoDB 数据存储在共享表空间中(InnoDB_file_per_table=0),则文件 ibdata 将不会收缩,并且您将无法以这种方式释放磁盘空间。

克隆实例

手动删除数据释放磁盘空间后,可以使用带有选项 DATA DIRECTORYCLONE INSTANCE 命令。

bash 复制代码
CLONE INSTANCE FROM 'clone_user'@'source_host':3306 \
IDENTIFIED BY 'password' DATA DIRECTORY = '/path/to/custom_dir';

如果克隆成功,您需要通过一个额外的步骤来完成它:停止 MySQL 实例,并将数据目录的内容替换为用于克隆操作的目录的内容。之后,启动服务器。

如果克隆操作失败,请删除克隆的数据,修复错误,然后重试。

结论

克隆操作可能会失败,并迫使您通过重新初始化副本上的 MySQL 实例来执行额外的步骤。要避免这种情况,请使用选项 DATA DIRECTORY。如果磁盘空间不足,无法存储两个数据副本,请在克隆之前清理现有数据。

更多技术文章,请访问:opensource.actionsky.com/

相关推荐
雨辰AI1 小时前
SpringBoot3 + 人大金仓读写分离 + 分库分表 + 集群高可用 全栈实战
java·数据库·mysql·政务
长城20242 小时前
关于MySql的ONLY_FULL_GROUP_BY问题
数据库·mysql·聚合列
常常有2 小时前
MySQL 底层执行原理:输入SQL语句到两阶段提交
数据库·sql·mysql
Mr. zhihao2 小时前
深入解析redis基本数据结构
数据结构·数据库·redis
m0_748839492 小时前
利用天正暖通CAD快速掌握风管数量统计的方法
数据库
随身数智备忘录2 小时前
什么是设备管理体系?设备管理体系包含哪些核心模块?
网络·数据库·人工智能
海市公约3 小时前
MySQL更新语句执行全流程:从Buffer Pool修改到二阶段提交
数据库·mysql·binlog·innodb·undo log·二阶段提交·update执行原理
颂love4 小时前
MySQL的执行流程
android·数据库·mysql
程序leo源4 小时前
Qt窗口详解
开发语言·数据库·c++·qt·青少年编程·c#
这个DBA有点耶4 小时前
COUNT进阶:超大表的近似计数与HyperLogLog
数据库·sql·程序人生·学习方法·dba·改行学it