详解MySQL如何避免克隆失败后再次初始化
作者:爱可生开源社区
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
。如果磁盘空间不足,无法存储两个数据副本,请在克隆之前清理现有数据。
以上就是详解MySQL如何避免克隆失败后再次初始化的详细内容,更多关于MySQL避免克隆失败后初始化的资料请关注脚本之家其它相关文章!