MySQL增加、缩减InnoDB 系统的表空间大小
  IE5LYMWlmdvL 2023年11月22日 18 0

mysql 8.0 ,建议谨慎操作,在测试环境模拟成功之后生产操作

概述

数据目录中的ibdata1文件是默认的系统表空间。
你可以使用innodb_data_file_path和innodb_data_home_dir配置项来配置ibdata1。
innodb_data_file_path选项用于配置InnoDB系统表空间数据文件。它的值应该是一个或多个数据文件规范的列表。如果指定了两个或多个数据文件,则用分号(;)分隔。

如果你想要表空间中包含一个名为ibdata1的、固定大小为50MB的数据文件,
并且在数据目录中有一个名为ibdata2的50MB的自动扩展文件, 则可以这样配置:

shell>sudo vi /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend

如果ibdata文件变得很大, 特别是当innodbfile_per_table没有被启用且磁盘已满时,你可能需要在另一个磁盘上再添加一个数据文件。

增加InnoDB系统表空间

假设innodb_data_file_path是libdata1:50m:autoextend, 其大小已达到76MB,而你的磁盘仅为100MB,那么可以再加一个磁盘,并在新磁盘上配置,添加另-个表空间。

1.停止MySQL服务器的运行:

shell>sudo systemctl stop mysqld

2.检查已存在的ibdata1文件的大小:

shell>sudols -lhtr /var/lib/mysql/ibdata1
-rw-r-1 mysql mysql 76M 0ct 613:33 /var/lib/mysql/ibdata1

3.挂载新磁盘, 假设它挂载在/var/lib/mysql_extend上, 将所有权归属更改为mysql, 确保此文件尚未创建。
如果你使用的是App Armour或SELinux, 请确保正确设置了别名或环境:

shell>sudo chown mysql:mysql /var/lib/mysql_extend
shell>sudo chmod 750 /var/lib/mysql_extend
shell>sudo ls -lhtr /var/lib/mysql_extend

4.打开my.cnf并添加以下内容:

shell>sudo vi /etc/my.cnf
[mysqld]
innodb_data_home_dir=
innodb_data_file_path=ibdata1:76M;/var/lib/mysql_extend/ibdata2:50M:autoextend

由于现有ibdata1的大小为76MB, 所以你必须选择最大值至少为76MB。
下一个ibdata文件将在挂载在/var/lib/mysql_extend/上的新磁盘中创建。应该指定innodb_data_home_dir选项; 否则, mysqld就会查看另一条路径,并出现错误。

5.重启MySQL服务器:

shell>sudo systemctl start mysql

6.验证新文件。既然已经指定它的大小为50MB,那么这个文件的初始大小将是50MB:

shell>sudo ls-lhtr /var/lib/mysql_extend/
mysql>SHOW VARIABLES LIKE ‘innodb_data_file_path’;

缩小InnoDB系统表空间

如果你使用的不是innodb_file_per_table, 那么所有的表数据都存储在系统表空间中。
如果你删除(drop) 了一个表, 那么该空间不会被回收。你可以缩小系统表空间并回收磁盘空间。
这需要较长的停机时间,因此建议的做法是在一个切换后没有负载的从库上操作,然后提升它为主库。

可以通过查询INFORMATION SCHEMA表来查看可用空间

mysql>SELECT SUM(data_free)/1024/1024 FROM INFORMATION_SCHEMA.TABLES;

1.停止写入数据库。
如果它是主库,mysql>SET @@GLOBAL.READ_ONLY=1;
如果它是从库,则停止复制并保存二进制日志。

mysql>STOP SLAVE;
mysql>SHOW SLAVE STATUS\G;

2.使用mysqldump或mydumper进行完整备份,不包括sys数据库。

shell>mydumper -uroot --password=<password> --trx-consistency-only --kill-long-queries --long-query-guard 500
–regex ‘^(?!sys)’ --output_dir /backups

3.停止MySQL服务器的运行。

shell>sudo systemctl stop mysql

4.删除所有的*.ibd、.ib_log和ib_data文件。
如果只使用了InnoDB表,则可以删除数据目录和存储系统表空间的所有位置(innodb_data_file_path)

shell>sudo rm-rf /var/lib/mysql/ib /var/lib/mysql/ <database directories>
shell>sudo rm-rf /var/lib/mysql_extend/*

5.初始化数据目录。

shell>sudo mysqld --initialize --datadir=/var/lib/mysql
shell>chown -R mysql:mysql /var/lib/mysql/
shell>chown -R mysql:mysql /var/lib/mysql_extend/

6.获取临时密码。

shell>sudo grep “temporary password is generated” /var/log/mysql/error.log|tail -1

7.启动MySQL并更改密码。

shell>sudo systemctl start mysqld
shell>mysql -uroot -p1I-qerr5agpa
mysql>ALTER USER ‘root’@‘localhost’ iDENTIFIED BY ‘xxxx’;
Query OK 0 rows affected(0.01sec)

8.恢复备份。使用临时密码连接到MySQL。

shell>/opt/my dumper/myloader --directory=/backups/ --queries-per-transaction = 50000 --threads= 6 --user=root --password=xxxx --overwrite-tables

9.如果它是一个主库,则通过语句mysql>SET@@GLOBAL.READ_ONLY=0;来启用写。
如果它是一个从库, 则通过执行CHANGE MASTER TO COMMAND和START SLAVE来恢复复制。

  1. 除此之外 有那些方式:
  • innodb_data_file_path 可以指定多个表空间
  • General tablespaces创建,迁移数据等方式
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月22日 0

暂无评论

推荐阅读
IE5LYMWlmdvL
最新推荐 更多

2024-05-17