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

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

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

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

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

从头开始

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

保留现有 MySQL 架构

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

  • 列出所有带查询的非系统数据库。
SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA 
WHERE SCHEMA_NAME NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');
  • 将它们逐一移除。您可以使用以下存储过程来执行此操作。
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 DIRECTORY 的 CLONE INSTANCE 命令。

CLONE INSTANCE FROM ‘clone_user'@'source_host':3306 \
IDENTIFIED BY 'password' DATA DIRECTORY = '/path/to/custom_dir';

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

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

结论

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

文章来源:https://www.cnaaa.net,转载请注明出处:https://www.cnaaa.net/archives/9884

(0)
凯影的头像凯影
上一篇 2023年10月20日 下午4:58
下一篇 2023年10月23日 下午5:24

相关推荐

  • Oracle用户密码过期的处理方法

    受影响版本:Oracle11g以上版本。 导致密码消失的原因:Oracle 11g中默认的DEFAULT概要文件中口令有效期PASSWORD_LIFE_TIME默认值为180天。 当以客户端登陆Oracle提示ORA-28002,则基本可以确定登陆帐号已过有效期,使用具有DBA权限的帐号重置该帐号密码即可。 解决方法: 以下步骤以具有DBA权限用户操作 1.…

    2024年5月9日
    1.6K00
  • MySQL的备份与还原

    关于删库跑路的事故现在已经屡见不鲜了,数据备份的必要性是企业数据管理极其重要的一项工作。关于数据备份、恢复也有很多场景及方法,本系列也会将主要的方法进行演示。 方式一:通过cmd命令备份 备份 数据表结构+数据 db1为要备份的数据库名,db2.sql为输出备份文件名称备份后输出一个sql文件,存在指定的/root/mysql_bak/目录下 备份数据库的表…

    2022年6月10日
    1.7K00
  • 内存耗尽后Redis会发生什么

    前言 作为一台服务器来说,内存并不是无限的,所以总会存在内存耗尽的情况,那么当 Redis 服务器的内存耗尽后,如果继续执行请求命令,Redis 会如何处理呢? 内存回收 使用Redis 服务时,很多情况下某些键值对只会在特定的时间内有效,为了防止这种类型的数据一直占有内存,我们可以给键值对设置有效期。Redis 中可以通过 4 个独立的命令来给一个键设置过…

    2023年7月17日
    1.2K00
  • 1558 -Column count ot mysql.proc 1s wrong.Expected 20,found 16.Created with MySQL50096, now running 50525. Please use mysql_upgrade to fix this error.

    我在MySQL版本5.5上面创建存储过程的时候就出现了上面的错误。甚至使用show procedure status 查看存储过程都会报上面的错误。 注意操作前先备份!!! 错误原因:是由于你曾经升级过MySQL,或用不同的MySQL版本进行备份迁移恢复。升级和迁移完后未使用mysql_upgrade升级数据结构造成的。 mysql.proc:是MySQL的…

    2023年12月21日
    1.4K00
  • MySQL常见错误代码

    MySQL常见错误代码及代码说明 1005:创建表失败 1006:创建数据库失败 1007:数据库已存在,创建数据库失败<=================可以忽略 1008:数据库不存在,删除数据库失败<=================可以忽略 1009:不能删除数据库文件导致删除数据库失败 1010:不能删除数据目录导致删除数据库失败 10…

    2023年3月28日
    1.3K00

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

在线咨询: QQ交谈

邮件:712342017@qq.com

工作时间:周一至周五,8:30-17:30,节假日休息

关注微信