Published on

20240708:博客数据库爆炸纪实

预计阅读时长:7分钟
Authors
  • avatar
    Name
    Roitium

Recently Update

彻底明白为什么会出这样的事了:在移动完docker的data-root目录后,我对移动后的目录执行了chmod 755 -R ./docker,我不知道我为什么要执行这个命令...首先,docker data-root目录的权限应该是711(这仅仅是这个目录的权限,子目录的权限对每个镜像来说都不太一样),但是我手欠添加了 -R(递归)参数,导致把整个data-root目录全部弄乱了。

这个九年前的issue点醒了我,原文:

I was having some issues related to this, I was having permissions problems inside the containers after changing the directory. Namely, a mysql container couldn't run because it didn't have write permissions to the /tmp/ directory.Before moving the /var/lib/docker files, the permissions for /tmp/ (inside the container) were rwxrwxrwx, after moving the files and creating a test container like before, the permissions were rwxr--r--.

移动目录后,/tmp的权限从777变成了744,我不理解为什么移动目录会导致容器内部的权限改变(这里的不理解是真的不理解,我太菜了),但事实确实是这样。这个老哥也给出了一个方法,使用rsync -a命令复制,能保证权限不变。

然而,直接卸载容器和镜像并重装也是可以解决的,freshrss的权限问题我刚才就这么解决了,不清楚为啥mysql当时没成功(我忽然想起来是不是因为我当时忘记删镜像了...额...)

timeline

  • 0408-19:50: 在此之前发现根目录硬盘空间不足,docker 镜像占用大量空间,于是通过修改 daemon.json,把 docker 数据迁移到了 /data 下
  • 0408-20:00: restart 了 docker daemon 后就美美玩逆转裁判去了。好爽,就是逆转姐妹开始我有些地方就要搜攻略了,很多思路根本想不到啊,很多时候就是:“啊?我都不知道我还有证物啊?(掏出律师徽章)被法官臭骂一顿”
  • 0408-23:00: 打通了前两章,决定去博客发下感受,喜提 “Error establishing a database connection”,当时我还没意识到事有多大(其实本来也应该不是啥大事,是我自己作的...),去看了下,发现是 mysql 没跑起来,报错无法创建 /tmp/xxxxx,错误原因是权限不够。这时候有点懵逼了,我要怎么进容器内调整权限啊,只有容器跑起来的时候才能 exec 啊!
  • 0408-23:05: 搜了下,发现有人说重新拉一下镜像就好了。于是我删掉容器和镜像又拉了一次,发现还是不行。
  • 0408-23:10: 我寻思着不是啥大事啊,毕竟我设置了定时任务,每隔半小时就备份一下数据库,只要数据库还在就行。于是打开备份,最近备份日期:2024-03-03...... 多少???????? 多少???????? 多少???????? 差点没两眼一黑倒在地上...冷静地打开备份页,发现 onedrive 的 token 早几百年过期了...但奇怪的是为什么没自动refresh。我设置的本地备份不知道为啥没运行(我怀疑这是个 bug,坑死我了。如果按照我的设置,当远端备份失败时是会 fallback 到本地备份的)
  • 0408-23:10: 先着手恢复 mysql docker 运行。搜了下发现可以通过设置 my.conf 来指定以什么用户运行 mysql,改成 root,一切搞定(等等,如果当时我直接改这个不就没这些事了吗...)这时候意外发现 phpmyadmin 也报权限问题,但现在管不了了,明天再说
  • 0408-23:30: 属实汗流浃背了,不过在 mysql 留下的 /data 文件夹里发现了很多 .ibd 文件,文件名都是数据库的表名,突然感觉还有救,搜了下发现确实能恢复,这个 ibd 文件就是 InnoDB 引擎用于保存表的物理文件。具体到恢复上,需要创建一个新数据库,包含结构相同的表。于是我删了 typecho 的 config.inc.php 文件,重新初始化创建了数据库。
  • 0409-22:36: 接着昨天的进度继续,发现导入表时提示“tablespace is missing for table `blog`.`typecho_contents`.”,搜了下发现是表结构不一致(或者是数据库名不一致,这个坑我后面又踩了一次...),我意识到可能很多插件、主题会修改表结构,增加新表,我慌了,这我到哪里找啊?忽然想到还保存有 3.3 的数据库备份,而这期间我没动过博客配置。下载下来,导入备份,先打开博客确认下没问题,然后继续从头开始...(感谢 chatgpt 给我写了个脚本,不至于我每次还要打那一大坨命令)
  • 0409-22:56: 做完前序步骤,导入时依旧是那个报错,我彻底慌了。但忽然想起来会不会是因为数据库名不一样导致的(原先我数据库名叫 blog,新创建的这个叫 typecho_blog,至于为什么要换个名字,是因为在试图创建blog数据库时 mysql 提醒我 /data/blog 下不是空的,我又懒得去删了,所以换一个...)
  • 0409-23:10: 重新创建数据库,继续从头开始。这次终于成功导入!复活赛打赢了!
  • 0409-23:35: 完成后续工作,并试图找出 1panel 没给我自动刷新 onedrive token 的原因(好吧,刚打开代码就开始打哈欠,没办法,只能先关掉了~)这次吸取教训,多处备份