众所周知,MySQL8.0是支持 arm64 架构的,毕竟 M1 的Mac系列也能用这玩意;然而,debian上并没有支持的ppa以供添加,只能自行编译,但用树莓派来编译这玩意属实是在为难它,而交叉编译的流程看得我头都大,所以我找到了另一个曲线救国的办法:Docker
前情
在树莓派的源里,默认用是MySQL的替代之一:MariaDB
➜ ~ apt search ^mysql-common$
Sorting... Done
Full Text Search... Done
mysql-common/unknown,unknown,now 1:10.6.10+maria~deb11 all [residual-config]
MariaDB database common files (e.g. /etc/mysql/my.cnf)
毕竟 MariaDB 是从 MySQL 5.x时代 fork 出来的产品,不少 MySQL8.0 的新特性就没了,比如 Twitter Monitor 用到的的函数 ANY_VALUE()
,又或者是用于全文搜索的解析器 ngram
……MariaDB与MySQL之间在大的方向上是兼容的,但在一些细节上的不兼容让我在开发 Twitter Monitor 时还是挺难受的
过程
- 首先当然是备份了所有库啦,我刚好在用 phpmyadmin 所以点点点就把库下载回来了,大伙也可以用命令,其中这里的
DB1
以及后面那些数据库名称改成自己的库名#我放在根目录只是为了后面导入时不用打一大堆路径 mysqldump -uroot -p --databases DB1 [DB2 DB3...] > /backup.sql
- 然后就是删掉全部 MariaDB 的内容,至于要不要删掉
/var/lib/mysql
可以随个人喜好,不删留着纪念也可以,但后面就需要找一个新的目录放来自container
的文件apt remove mariadb-common && apt autoremove && rm -rf /var/lib/mysql
- 再然后就是拉镜像跑起来,我不会写 docker composer,所以直接跑好了
docker pull mysql:latest
可以将原本位于/etc/mysql/mariadb.conf.d
的那些自定义配置拷贝到conf.d
,然后开跑,其中这个YOUR_PASSWORD
应该改成自己的密码docker run -p 127.0.0.1:3306:3306 --name mysql -v /etc/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=YOUR_PASSWORD -d mysql
等一会就可以停掉 container ,然后将内部使用的数据文件夹拷贝到宿主机docker cp mysql:/var/lib/mysql/ /var/lib/
然后就是二选一:- 直接删掉当前 container,重新执行
docker run -p 127.0.0.1:3306:3306 --name mysql -v /etc/mysql/conf.d:/etc/mysql/conf.d -v /var/lib/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_PASSWORD -d mysql
- 打开container所在的目录,编辑
config.v2.json
,往MountPoints
字段加上宿主机的目录,改完以后差不多就是这样的{ ... "MountPoints": { "/etc/mysql/conf.d": { "Source": "/etc/mysql/conf.d", "Destination": "/etc/mysql/conf.d", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/etc/mysql/conf.d", "Target": "/etc/mysql/conf.d" }, "SkipMountpointCreation": false }, "/var/lib/mysql": { "Source": "/var/lib/mysql", "Destination": "/var/lib/mysql", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/var/lib/mysql", "Target": "/var/lib/mysql" }, "SkipMountpointCreation": false } } ... }
- 直接删掉当前 container,重新执行
- 保存以后就可以重新启动了
container
了,然后把备份导进去,其中这个YOUR_PASSWORD
应该改成自己的密码// databases docker exec -i mysql mysql -uroot -p <YOUR_PASSWORD> < /backup.sql // tables docker exec -i mysql mysql -uroot -p <YOUR_PASSWORD> <DATABASE_NAME> < /backup.sql
启动前建议关掉binlog以提高导入效率#my.cnf [mysqld] skip-log-bin
- 设置自启动
docker update --restart=always mysql # 这里未必是 mysql,也可以用 container 的 id
- 前面忘了,中间忘了,后面忘了,总之需要把各种配置中的
localhost
改成127.0.0.1
,然后就可以继续喜闻乐见地玩耍了
其实我就是来水文章的,现在水完了