Blog

在树莓派上使用mysql

2022-11-04

#Docker
#MySQL
#水

众所周知,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 了,然后把备份导进去,其中这个 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,然后就可以继续喜闻乐见地玩耍了

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


评论区