众所周知,MySQL8.0是支持 arm64 架构的,毕竟 M1 的Mac系列也能用这玩意;然而,debian上并没有支持的ppa以供添加,只能自行编译,但用树莓派来编译这玩意属实是在为难它,而交叉编译的流程看得我头都大,所以我找到了另一个曲线救国的办法:Docker
前情
在树莓派的源里,默认用是MySQL的替代之一:MariaDB
SHELL
➜ ~ 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以及后面那些数据库名称改成自己的库名
SHELL
#我放在根目录只是为了后面导入时不用打一大堆路径
mysqldump -uroot -p --databases DB1 [DB2 DB3...] > /backup.sql
- 然后就是删掉全部 MariaDB 的内容,至于要不要删掉
/var/lib/mysql可以随个人喜好,不删留着纪念也可以,但后面就需要找一个新的目录放来自container的文件
SHELL
apt remove mariadb-common && apt autoremove && rm -rf /var/lib/mysql
- 再然后就是拉镜像跑起来,我不会写 docker composer,所以直接跑好了
SHELL
docker pull mysql:latest
可以将原本位于 /etc/mysql/mariadb.conf.d 的那些自定义配置拷贝到 conf.d,然后开跑,其中这个 YOUR_PASSWORD 应该改成自己的密码
SHELL
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 ,然后将内部使用的数据文件夹拷贝到宿主机
SHELL
docker cp mysql:/var/lib/mysql/ /var/lib/
然后就是二选一:
- 直接删掉当前 container,重新执行
SHELL
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字段加上宿主机的目录,改完以后差不多就是这样的
JSON
{
...
"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了,然后把备份导进去,其中这个YOUR_PASSWORD应该改成自己的密码
SHELL
// 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以提高导入效率
SHELL
#my.cnf
[mysqld]
skip-log-bin
- 设置自启动
SHELL
docker update --restart=always mysql # 这里未必是 mysql,也可以用 container 的 id
- 前面忘了,中间忘了,后面忘了,总之需要把各种配置中的
localhost改成127.0.0.1,然后就可以继续喜闻乐见地玩耍了
其实我就是来水文章的,现在水完了