相关文章推荐
读研的冲锋衣  ·  MySQL循环插入日期递增数据报错:语法问题 ...·  4 周前    · 
一身肌肉的打火机  ·  MySQL中TIMESTAMP因2038年问 ...·  2 周前    · 
私奔的绿豆  ·  8c ...·  2 周前    · 
傻傻的凳子  ·  MySQL ...·  2 周前    · 
考研的冰淇淋  ·  桌面版vscode用免费的微软4核8G服务器 ...·  1 周前    · 
文武双全的荔枝  ·  按住鼠标左键拖动选取单元格。选中的单元格背景 ...·  2 年前    · 
谦虚好学的皮带  ·  HTML中加入视频播放及调节视频大小位置等比 ...·  2 年前    · 
豪气的小摩托  ·  Spring ...·  2 年前    · 
开朗的咖啡  ·  json解析数组nlohmann_json解 ...·  2 年前    · 
Code  ›  分享篇 | MySQL的ibdata1是个啥,为啥越来越大,怎么缩小? - 墨天轮
mysqldump mysql创建数据库 mysql导入sql文件 mysql
https://www.modb.pro/db/89923
踏实的柳树
2 年前
  • 学习
    • 课程中心
      推荐优质内容、热门课程
    • 学习路径
      预设学习计划、达成学习目标
    • 知识图谱
      综合了解技术体系知识点
    • 课程库
      快速筛选、搜索相关课程
    • 视频学习
      专业视频分享技术知识
    • 电子文档
      快速搜索阅览技术文档
  • 文档
  • 工具
    • SQLRUN
      在线数据库即时SQL运行平台
    • 数据库在线实训平台
      实操环境、开箱即用、一键连接
    • Oracle巡检
      简单两步,查看报告分析
    • AWR分析
      上传AWR报告,查看分析结果
    • SQL格式化
      快速格式化绝大多数SQL语句
    • SQL审核
      审核编写规范,提升执行效率
    • PLSQL解密
      解密超4000字符的PL/SQL语句
    • OraC函数
      查询Oracle C 函数的详细描述
    • Bethune X
      数据库智能监控巡检平台,90天试用
  • 暂无图片
    • 数据库
    • 云计算
    • 数据产品
    • 中间件
    • 操作系统
    • 芯片
  • 我的订单
  • 登录后可立即获得以下权益
    免费培训课程
    收藏优质文章
    疑难问题解答
    下载专业文档
    签到免费抽奖
    提升成长等级
    立即登录
    登录 注册
      • 登录 注册
    • 首页
    • 资讯
    • 数说
    • 活动
    • 大会
    • 课程
    • 文档
    • 排行
    • 问答
    • 云市场
    • 我的订单
    暂无图片
    觉得内容不错?
    一键收藏 方便随时查看
    暂无图片
    暂无图片
    微信扫码
    复制链接
    新浪微博
    分享数说
    暂无图片
    采集到收藏夹
    分享到数说
    首页 / 分享篇 | MySQL的ibdata1是个啥,为啥越来越大,怎么缩小?

    分享篇 | MySQL的ibdata1是个啥,为啥越来越大,怎么缩小?

    杨磊 2021-08-03
    5308

    同事的一个问题:
    MySQL的ibdata1文件越来越大,这是为啥、
    看着别扭,怎么搞小它?

    回答这个问题,首先要整明白ibdata1文件是个嘛?
    ibdata1是一个用来构建innodb系统表空间的文件,这个文件包含了innodb表的元数据、undo日志、修改buffer和双写buffer。随着数据库的使用,ibdata1文件会越来越大,innodb_autoextend_increment选项则指定了该文件每次自动增长的步进,默认是8M.
    熟悉Oracle的亲,可以把ibdata理解成redo日志。

    当在MySQL中对InnoDB表进行更改时,这些更改首先存储在InnoDB日志缓冲区的内存中,然后写入通常称为重做日志(redo logs)的InnoDB日志文件中。

    介绍MySQL InnoDB 日志缓冲区(Log Buffer)的文章链接如下:
    知识分享 | MySQL InnoDB 日志缓冲区(Log Buffer)讲解

    这里放张图

    my.cnf中的参数设置形式:
    innodb_data_file_path = ibdata1:256M;ibdata2:128M:autoextend

    什么原因导致ibdata1越来越大?
    上文也说了,ibdata1存放innodb表的元数据、undo日志、修改buffer和双写buffer,是MYSQL的最主要的数据,随着数据库越来越大,表也会越来越大。
    尤其是innodb_file_per_table参数未开启的话,新创建表的数据和索引会存在系统表空间中,增加更加更快。

    该如何处理呢?
    业务数据使用独享表空间,将不用的业务表空间分别单独存放。MySQL开启独享表空间的参数是Innodb_file_per_table,会为每个Innodb表创建一个.ibd的文件。

    没开启,怎么减小ibdata的大小?
    两个操作步骤:
    1.初始参数中修改innodb_data_file_path=1,保证业务数据被单独存放。
    举例:innodb_data_file_path = ibdata1:32M;ibdata2:16M:autoextend
    2.使用mysqldump做下数据的导出和导入

    步骤2实操如下:

  • 导出数据库中所有数据
    # mysqldump -uroot -p --socket=/tmp/mysql.sock --single-transaction --master-data=2 --all-databases -E -R --triggers --set-gtid-purged=off > /tmp/all-database.dump
  • 删除数据库中数据
    mysql> drop database dbname;
  • 停止MySQL
    # /etc/init.d/mysqld stop
    #mysqladmin -uroot -p shutdown
  • 删除ibdata1文件(移动到/tmp下)
    # mv /var/lib/mysql/ibdata1 /tmp
    # mv /var/lib/mysql/ib_logfile0 /tmp
    # mv /var/lib/mysql/ib_logfile1 /tmp
  • my.cnf设定
    # vi /etc/my.cnf
    开启独享表空间,并指定ibdata1大小为256M,ibdata2大小128M,自动扩张。
    innodb_file_per_table = 1
    innodb_data_home_dir = /mysqldata/data
    innodb_data_file_path = ibdata1:256M;ibdata2:128M:autoextend
  • 启动MySQL
    # /etc/init.d/mysqld start
    #mysqld_safe --defaults-file=/etc/my.cnf --user=mysql &
  • # mysql -u root -p < /tmp/all-database.dump

    发问:使用mysqldump缩小ibdata时,mysqldump导出导入太慢,如何减少业务中断时间?

    回答:充分利用主从架构来做,怎么做?

    步骤如下:
    1.主库mysqldump出导出文件,并scp到从库;
    2.从库做逻辑恢复,并使用gtid追平主库数据(注意此刻的从库已经修改了innodb_file_per_table = 1和innodb_data_file_path = ibdata1:256M;ibdata2:128M:autoextend)
    3.为保险起见,可找个业务空闲窗口,切换下高可用至从库(此刻的从库变为新主),并对外恢复业务数据访问
    4.原主做mysqldump恢复,并追平新主数据,此刻原主为新从
    5.搞定。

    具体实操,不再赘述。

    文章结束。

     
    推荐文章
    读研的冲锋衣  ·  MySQL循环插入日期递增数据报错:语法问题排查求助
    4 周前
    一身肌肉的打火机  ·  MySQL中TIMESTAMP因2038年问题报错及DATETIME替代方案-云数据库 RDS-阿里云
    2 周前
    私奔的绿豆  ·  8c 数据库,MySQL数据库5.8以上与以下版本,Oracle数据库实现row_number() over(partition by 分组列 order by 排序列 desc)开发者社区-
    2 周前
    傻傻的凳子  ·  MySQL 单表数据最大不要超过多少行?为什么? - Lafite-1820
    2 周前
    考研的冰淇淋  ·  桌面版vscode用免费的微软4核8G服务器做远程开发(编译运行都在云上,还能自由创建docker服务) - 程序员欣宸
    1 周前
    文武双全的荔枝  ·  按住鼠标左键拖动选取单元格。选中的单元格背景变红色_xiaozaq的博客-CSDN博客
    2 年前
    谦虚好学的皮带  ·  HTML中加入视频播放及调节视频大小位置等比例那些事_html 展示视频的一小部分_superleedev的博客-CSDN博客
    2 年前
    豪气的小摩托  ·  Spring RestTemplate的使用方式_whu_jack的博客-CSDN博客
    2 年前
    开朗的咖啡  ·  json解析数组nlohmann_json解析数组nlohmann_Nlohmannjson学习 - 百度文库
    2 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号