最近,从阿里云迁移到天翼云,为了保证WordPress查库速度,数据库也要一并迁移,但数据库是很贵的,为了降低个人WordPress网站的成本,我决定自己建数据库。本文是使用Docker镜像建立数据库的方法,数据库文件映射到物理机,支持外部连接,并提供了数据备份和恢复的方法。
首先安装Docker
- sudo apt-get update
- sudo apt-get install ca-certificates curl gnupg
-
- sudo install -m 0755 -d /etc/apt/keyrings
- curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
- sudo chmod a+r /etc/apt/keyrings/docker.gpg
-
- echo \
- "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
- "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
- sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
-
- sudo apt-get update
-
-
- sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
-
-
- # 测试Docker是否成功运行
- sudo docker run hello-world
参考 https://docs.docker.com/engine/install/ubuntu/
安装支持远程连接的mysql
- 在 /opt/ 建立 mysql 文件夹,用于存储启动mysql 容器的相关配置
/opt/mysql/conf.d
,以及mysql相关的文件/opt/mysql/data
- mkdir /opt/mysql
-
- # 存放mysql配置文件
- mkdir /opt/mysql/conf.d
- touch /opt/mysql/conf.d/my.cnf
- 在my.cnf填入以下内容,这里
- [mysqld]
- sql_mode = "NO_ENGINE_SUBSTITUTION"
这个my.cnf配置的目的是确保 MySQL 数据库在遇到存储引擎不可用的情况下,不会自动替换为其他可用的存储引擎,而是返回一个错误。这可以帮助开发人员在出现存储引擎问题时及时发现并解决,而不是在不知情的情况下使用了不同的存储引擎。
- 给my.cnf 设置权限
sudo chmod 644 /opt/mysql/conf.d/my.cnf
- 创建物理机存储mysql数据的映射目录
mkdir /opt/mysql/data
运行以下代码,启动容器
docker run -d -p 3306:3306 --name mysql-8-1 --restart unless-stopped -e MYSQL_ROOT_PASSWORD=****** -v /opt/mysql/conf.d/my.cnf:/etc/mysql/my.cnf -v /opt/mysql/data:/var/lib/mysql mysql:8.1
这里采用了mysql:8.1的镜像, 其中的 ******
为root用户登录密码,用自己的密码替换 ******
即可
在mysql中, root用户默认不允许远程登录, 我们可以登录root用户进入容器,添加一个用户zhaoolee
并赋予zhaoolee所有的权限,密码为accountZhaooleePassword
,请按照需求自行替换
- docker exec -it mysql-8-1 mysql -uroot -p
-
- create user 'zhaoolee' identified with mysql_native_password by 'accountZhaooleePassword';
-
- grant all privileges on *.* to 'zhaoolee';
- FLUSH PRIVILEGES;
如果你需要修改zhaoolee用户的密码,可以运行以下命令修改密码
- # 修改用户密码
- USE mysql;
- ALTER USER 'zhaoolee'@'%' IDENTIFIED WITH mysql_native_password BY 'accountZhaooleeNewPassword';
-
- FLUSH PRIVILEGES;
完成设置后,我们可以通过免费的DBeaver社区版,测试数据库是否连接成功
DBeaver 下载地址: https://dbeaver.io/download/
最后通过
control + p + q
退出mysql容器;
导出数据
创建一个文件夹/opt/mysql/db_back_up
,存储导出的数据
mkdir -p /opt/mysql/db_back_up
比如导出数据库 wp_v2fy 的数据到 /opt/mysql/db_back_up 目录
首先登录数据库
docker exec -it mysql-8-1 mysql -uroot -p
查看wp_v2fy的数据库属性character_set_database 和 collation_database
- USE wp_v2fy;
- SHOW VARIABLES LIKE 'character_set_database';
- SHOW VARIABLES LIKE 'collation_database';
- mysql> USE wp_v2fy;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
-
- Database changed
- mysql> SHOW VARIABLES LIKE 'character_set_database';
- +------------------------+---------+
- | Variable_name | Value |
- +------------------------+---------+
- | character_set_database | utf8mb3 |
- +------------------------+---------+
- 1 row in set (0.00 sec)
-
- mysql> SHOW VARIABLES LIKE 'collation_database';
- +--------------------+--------------------+
- | Variable_name | Value |
- +--------------------+--------------------+
- | collation_database | utf8mb3_general_ci |
- +--------------------+--------------------+
- 1 row in set (0.00 sec)
从输出可知,character_set_database为 utf8mb3
, collation_database 为utf8mb3_general_ci
, 我们后续新建数据库接收数据,指定这两个参数,可以保证接收数据格式的一致性。
通过 control + p + q
退出容器;
- 导出数据备份
通过zhaoolee账户导出数据,shell编程的单双引号意义不同,双引号内的字符串会进行变量和命令替换,而单引号内的字符串则会被视为字面值,不进行任何替换。以下几行命令中的单双引号要格外注意
- DB_NAME="wp_v2fy"
- TIME=$(date +"%Y_%m_%d_%H_%M_%S")
- OUTPUT_FILE="/opt/mysql/db_back_up/${TIME}_${DB_NAME}.sql"
- EXEC_COMMAND="exec mysqldump $DB_NAME -uzhaoolee -p'******'"
-
- docker exec mysql-container sh -c "$EXEC_COMMAND" > "$OUTPUT_FILE"
我们获得了名为 2023_08_12_11_36_56_wp_v2fy.sql
的数据备份文件,这个文件可以恢复到数据库。
通过.sql
恢复数据库数据
如果我们的wp_v2fy数据库数据被污染,或者需要进行数据迁移,想从 2023_08_12_11_36_56_wp_v2fy.sql
恢复数据,我们需要进入容器, 创建同名数据库
- docker exec -it mysql-8-1 mysql -uroot -p
-
- CREATE DATABASE wp_v2fy CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci;
运行以下命令, 将 2023_08_12_11_36_56_wp_v2fy.sql
恢复到名为 wp_v2fy
的数据库, 其中的*****
用root登录密码替代
docker exec -i mysql-8-1 sh -c 'exec mysql -uroot -p"******" wp_v2fy' < /opt/mysql/db_back_up/2023_08_12_11_36_56_wp_v2fy.sql
至此,Docker版Mysql数据库的搭建,备份,迁移详细方法均编写完成。
小结
2023年,Mysql数据库依然是WordPress站长的首选数据库,云服务商低配的Mysql数据库一年也要将近300人民币,自己动手,丰衣足食,如果预算有限,同时服务器性能尚可,使用Docker自建Mysql数据库确实很有性价比。