Blog

在树莓派上使用mysql

2022-11-04

#Docker
#MySQL
#水

众所周知,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,然后就可以继续喜闻乐见地玩耍了

其实我就是来水文章的,现在水完了


评论区