保定的网站建设,网站策划需求,黄河勘测规划设计公司,龙之外贸向导☘️博主介绍☘️#xff1a; ✨又是一天没白过#xff0c;我是奈斯#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章#xff0c;并且也会默默的点赞收藏加关注❣… ☘️博主介绍☘️ ✨又是一天没白过我是奈斯DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章并且也会默默的点赞收藏加关注❣️❣️❣️ 哈喽小伙伴们今天我们来聊一聊如何快速应对MySQL存储数据路径空间不足的问题。当我们发现数据目录所在路径空间不足时并且发现当前目录并非逻辑卷的时候如何快速地将数据目录迁移到新的路径。接下来我会详细介绍如何进行这种同机迁移操作。 在本文中我将介绍两种方式对数据目录进行迁移的方法通过clone本地克隆数据的方式和直接使用mv命令的方式。对于想要了解clone插件原理的同学可以参考我之前发布的文章。现在让我们深入探讨这两种迁移方法。 大佬们都喜欢静静的看文章并且也会默默的点赞收藏加关注。 目录
方式一通过mv方式完成新路径的迁移适用于各个版本
方式二通过clone本地克隆数据的方式完成同机目录迁移只适用于8.0.17以上版本 方式一通过mv方式完成新路径的迁移适用于各个版本 MySQL异机迁移一般采用mysqldump、mysqlpump、xtrabackup、clone等工具这些工具都会记录当时实例的gtid方便进行主从搭建等操作。为了减少停机时间使用直接mv数据文件并且修改datadir参数即可快速完成目录更换当然也可以采用异机迁移的方式完成。
注意对于Oracle而言不能直接mv数据文件完成同机迁移因为Oracle在启动的三个步骤中的第二步打开控制文件就会验证数据文件的路径那么只是直接mv是不会通知控制文件的所以需要在sqlplus中执行命令来告知数据文件路径发生变化。
1查看当前数据库的数据文件路径并关闭实例
mysql show variables like %datadir%; [rootmgr1 3306]# service mysqld stop ---通过service的方式关闭MySQL
2修改数据文件路径参数指向新的逻辑卷目录
[rootmgr1 3306]# mkdir /mysql_data/
[rootmgr1 3306]# chown -R mysql:mysql /mysql_data/[rootmgr1 3306]# mv /mysql/data/3306/data /mysql_data/ ---mv移动数据文件目录到新的逻辑卷目录[rootmgr1 3306]# vi /mysql/data/3306/my.cnf3如果是通过linux服务启动service还需要修改服务启动脚本 [rootmgr1 3306]# vi /etc/init.d/mysqld 修改一目录和数据存储目录 修改二相关目录和数据存储目录 修改三不用修改调用的变量 4启动实例验证相关目录
[rootmgr1 3306]# service mysqld startmysql show variables like %datadir%; 验证
mysql show databases;
mysql select table_name from information_schema.tables;
mysql select * from ded.bak11;
mysql select * from it.emp;
mysql select * from it.yg; ---能查询到数据表示数据恢复的没问题。可能存在表不能查询的情况那么就是数据字典没有记录表的问题需要多验证几张 方式二通过clone本地克隆数据的方式完成同机目录迁移只适用于8.0.17以上版本 想要了解clone插件原理的同学可以参考我之前发布的文章。 本地克隆数据的用途 1、备份实例到本地 2、对数据目录进行迁移本地克隆进行迁移一般情况下是为了当前目录没有规划好大小并且不是逻辑卷而进行的同机迁移今天主要介绍这种 本地克隆数据语法 本地克隆操作从MySQL服务器实例中克隆数据其中克隆操作启动到MySQL服务器实例运行的同一服务器或节点上的目录。 语法 CLONE LOCAL DATA DIRECTORY [] clone_dir; ---用户需要有BACKUP_ADMIN权限 如何停止本地克隆 SQL select * from performance_schema.clone_status\G; ---克隆操作的状态 PIDProcesslist ID。对应show processlist中的Id如果要终止当前的克隆操作执行kill processlist_id命令即可。 SQL Killid号; 本地克隆相关视图 SQL select * from performance_schema.clone_status\G; ---克隆操作的状态 PIDProcesslist ID。对应show processlist中的Id如果要终止当前的克隆操作执行kill processlist_id命令即可。 STATE克隆操作的状态Not Started克隆尚未开始In Progress克隆中Completed克隆成功Failed克隆失败。如果是Failed状态ERROR_NOERROR_MESSAGE会给出具体的错误编码和错误信息。 BEGIN_TIME克隆操作开始 END_TIME克隆结束时间。 SOURCEDonor源库实例的地址。 DESTINATION克隆目录。“LOCAL INSTANCE”代表当前实例的数据目录。 BINLOG_FILE克隆完成后的file号 BINLOG_POSITIONfile的pos点 GTID_EXECUTED克隆的gtid点可利用这些信息来搭建从库。 SQL select stage, state, cast(begin_time as DATETIME) as START TIME, cast(end_time as DATETIME) as FINISH TIME, lpad(sys.format_time(power(10,12) * (unix_timestamp(end_time) - unix_timestamp(begin_time))), 10, ) as DURATION, lpad(concat(format(round(estimate/1024/1024,0), 0), MB), 16, ) as Estimate, case when begin_time is NULL then LPAD(%0, 7, ) when estimate 0 then lpad(concat(round(data*100/estimate, 0), %), 7, ) when end_time is NULL then lpad(0%, 7, ) else lpad(100%, 7, ) end as Done(%) from performance_schema.clone_progress; STAGE一个克隆操作可依次细分为DROP DATAFILE COPYPAGE COPYREDO COPYFILE SYNCRESTARTRECOVERY等7个阶段。当前阶段结束了才会开始下一个阶段。本地克隆只涉及到前五个阶段完成DROP DATAFILE COPYPAGE COPYREDO COPYFILE SYNC远程克隆涉及到七个阶段 STATE当前阶段的状态。有三种状态Not StartedIn ProgressCompleted。 BEGIN_TIME当前阶段的开始时间和结束时间。 END_TIME当前阶段的开始时间和结束时间。 THREADS当前阶段使用的并发线程数。并发线程数一般由clone_autotune_concurrency参数自动调节。默认为ON此时该参数最大线程数受clone_max_concurrency参数控制。若设置为OFF则并发线程数的数量将是固定的同clone_max_concurrency参数保持一致。clone_max_concurrency参数的默认值为16。 ESTIMATE预估的数据量。 DATA已经拷贝的数据量。 NETWORK通过网络传输的数据量。如果是本地克隆该列的值为0。 DATA_SPEED当前数据拷贝的速率。注意是当前值。 NETWORK_SPEED当前网络传输的速率。注意是当前值。 案例开始通过本地克隆对数据目录进行迁移
(1)首先先安装Clone数据克隆插件插件安装 mysql INSTALL PLUGIN clone SONAME mysql_clone.so; ---这种是手动在线安装插件不需要重启并且重启后也不会失效。 (2)查看插件状态是否active mysql show plugins; (3)在实例上创建克隆用户 mysql create user donor_clone_user% identified by 123456; mysql grant backup_admin on *.* to donor_clone_user%; (4)创建clone目录也就是迁移的目录 [rootmysql8 ~]# mkdir /clone_dir [rootmysql8 ~]# chown -R mysql:mysql /clone_dir (5)了解本地克隆数据对DDL的影响 DML不影响 mysql insert into tb values (23); Query OK, 1 row affected (0.81 sec) DDL长期不返回需要等到克隆完成不过可以通过设置clone_ddl_timeout参数在克隆期间允许DDL不过会导致克隆失败在8.0.27版本新增clone_block_ddl参数在克隆期间允许DDL同时不会导致克隆失败 mysql create table itdwd (id int); 无响应 6设置克隆期间允许DDL为了在克隆期间允许DDL设置clone_ddl_timeout参数为0虽然会导致克隆失败但要保证DDL不受影响。8.0.27版本新增clone_block_ddl参数在克隆期间允许DDL同时不会导致克隆失败。这个设置可选 mysql set global clone_ddl_timeout0; ---设置为0意味着克隆操作不会等待备份锁。在这种情况下执行并发DDL操作可能导致克隆操作失败设置为其他数值发现还是需要等到克隆完成只有设置为0。 (7)Clone数据克隆发起克隆命令 [rootslave ~]# mysql -udonor_clone_user -p123456 -S /var/lib/mysql/mysql.sock mysql clone local data directory/clone_dir/3306; 其中/clone_dir/3306是克隆目录其需满足以下几点要求 1、克隆目录必须是绝对路径。 2、/clone_dir必须存在且MySQL对其有可写权限。 3、3306不能存在。 注本地克隆只涉及到五个阶段完成DROP DATAFILE COPYPAGE COPYREDO COPYFILE SYNC远程克隆涉及到七个阶段也是就说本地克隆完成不会重启数据库(RESTART)和数据一致性效验(RECOVERY) (8)查看克隆操作 mysql select * from performance_schema.clone_status\G; ---克隆操作的状态 mysql select stage, state, cast(begin_time as DATETIME) as START TIME, cast(end_time as DATETIME) as FINISH TIME, lpad(sys.format_time(power(10,12) * (unix_timestamp(end_time) - unix_timestamp(begin_time))), 10, ) as DURATION, lpad(concat(format(round(estimate/1024/1024,0), 0), MB), 16, ) as Estimate, case when begin_time is NULL then LPAD(%0, 7, ) when estimate 0 then lpad(concat(round(data*100/estimate, 0), %), 7, ) when end_time is NULL then lpad(0%, 7, ) else lpad(100%, 7, ) end as Done(%) from performance_schema.clone_progress; ---克隆的进度信息。本地克隆只涉及到五个阶段完成DROP DATAFILE COPYPAGE COPYREDO COPYFILE SYNC远程克隆涉及到七个阶段也是就说本地克隆完成不会重启数据库(RESTART)和数据一致性效验(RECOVERY) (9)查看当前数据库的数据文件路径并关闭实例 mysql show variables like %datadir%; [rootmgr1 3306]# service mysqld stop ---通过service的方式关闭MySQL (10)修改数据文件路径参数指向新的逻辑卷目录 [rootmgr1 3306]# vi /mysql/data/3306/my.cnf (11)如果是通过linux服务启动service还需要修改服务启动脚本 [rootmgr1 3306]# vi /etc/init.d/mysqld 修改一目录和数据存储目录 修改二相关目录和数据存储目录 修改三不用修改调用的变量 (12)启动实例验证相关目录 [rootmgr1 3306]# service mysqld start mysql show variables like %datadir%; 验证 mysql show databases; mysql select table_name from information_schema.tables; mysql select * from ded.bak11; mysql select * from it.emp; mysql select * from it.yg; ---能查询到数据表示数据恢复的没问题。可能存在表不能查询的情况那么就是数据字典没有记录表的问题需要多验证几张