最近,从阿里云迁移到天翼云,为了保证WordPress查库速度,数据库也要一并迁移,但数据库是很贵的,为了降低个人WordPress网站的成本,我决定自己建数据库。本文是使用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
image.png
参考 https://docs.docker.com/engine/install/ubuntu/
/opt/mysql/conf.d
,以及mysql相关的文件/opt/mysql/data
mkdir /opt/mysql
# 存放mysql配置文件
mkdir /opt/mysql/conf.d
touch /opt/mysql/conf.d/my.cnf
[mysqld]
sql_mode = "NO_ENGINE_SUBSTITUTION"
这个my.cnf配置的目的是确保 MySQL 数据库在遇到存储引擎不可用的情况下,不会自动替换为其他可用的存储引擎,而是返回一个错误。这可以帮助开发人员在出现存储引擎问题时及时发现并解决,而不是在不知情的情况下使用了不同的存储引擎。
sudo chmod 644 /opt/mysql/conf.d/my.cnf
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用户登录密码,用自己的密码替换 ******
即可
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/
image.png
image.png
最后通过
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"
image.png
我们获得了名为 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;
image.png
运行以下命令, 将 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
image.png
至此,Docker版Mysql数据库的搭建,备份,迁移详细方法均编写完成。
2023年,Mysql数据库依然是WordPress站长的首选数据库,云服务商低配的Mysql数据库一年也要将近300人民币,自己动手,丰衣足食,如果预算有限,同时服务器性能尚可,使用Docker自建Mysql数据库确实很有性价比。