Skip to content

MySQL 配置

MySQL 是 DNS-Go 支持的另一种数据库选择,适合已有 MySQL 基础设施的环境。

安装 MySQL

Linux 安装

Ubuntu/Debian:

bash
# 更新包列表
sudo apt-get update

# 安装 MySQL
sudo apt-get install -y mysql-server mysql-client

# 启动服务
sudo systemctl start mysql
sudo systemctl enable mysql

# 验证安装
mysql --version

CentOS/RHEL:

bash
# 安装 MySQL 仓库
sudo dnf install -y https://dev.mysql.com/get/mysql80-community-release-el8-11.noarch.rpm

# 安装 MySQL
sudo dnf install -y mysql-community-server

# 启动服务
sudo systemctl start mysqld
sudo systemctl enable mysqld

查看临时密码:

bash
sudo grep 'temporary password' /var/log/mysqld.log

安全初始化:

bash
sudo mysql_secure_installation

macOS 安装

bash
# 使用 Homebrew 安装
brew install mysql

# 启动服务
brew services start mysql

# 安全初始化
mysql_secure_installation

Windows 安装

  1. 下载安装程序:MySQL 官方下载
  2. 运行安装向导
  3. 选择 "Server only" 或 "Full" 安装
  4. 设置 root 密码
  5. 保持默认端口 3306
  6. 完成安装

数据库配置

创建数据库和用户

登录 MySQL:

bash
# 使用 root 登录
mysql -u root -p

创建数据库和用户:

sql
-- 创建数据库
CREATE DATABASE dns_go 
CHARACTER SET utf8mb4 
COLLATE utf8mb4_unicode_ci;

-- 创建用户
CREATE USER 'dnsgo'@'localhost' IDENTIFIED BY 'your_secure_password';

-- 授权
GRANT ALL PRIVILEGES ON dns_go.* TO 'dnsgo'@'localhost';

-- 刷新权限
FLUSH PRIVILEGES;

-- 退出
EXIT;

配置远程访问(可选)

如果需要远程访问 MySQL:

sql
-- 创建允许远程访问的用户
CREATE USER 'dnsgo'@'%' IDENTIFIED BY 'your_secure_password';
GRANT ALL PRIVILEGES ON dns_go.* TO 'dnsgo'@'%';
FLUSH PRIVILEGES;

修改 MySQL 配置:

bash
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

修改绑定地址:

conf
# 允许所有 IP 连接
bind-address = 0.0.0.0

# 或指定 IP
bind-address = 192.168.1.100

重启 MySQL:

bash
sudo systemctl restart mysql

DNS-Go 配置

编辑 config/config.toml

toml
[database]
driver = "mysql"
host = "127.0.0.1"       # MySQL 主机地址
port = 3306              # MySQL 端口
username = "dnsgo"       # 数据库用户名
password = "your_secure_password"  # 数据库密码
database = "dns_go"      # 数据库名称

[mysql]
charset = "utf8mb4"      # 字符集
parse_time = true        # 解析时间字段
loc = "Local"            # 时区设置

与 PostgreSQL 配置对比

配置项MySQLPostgreSQL
drivermysqlpostgres
port33065432
特定配置段[mysql][postgres]
sslmode不支持支持

环境变量

bash
export DB_HOST=localhost
export DB_PORT=3306
export DB_USER=dnsgo
export DB_PASSWORD=your_password
export DB_NAME=dns_go

性能优化

MySQL 参数调优

编辑 MySQL 配置文件:

bash
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

推荐配置:

conf
[mysqld]
# 基础配置
user = mysql
datadir = /var/lib/mysql
socket = /var/run/mysqld/mysqld.sock

# 字符集
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# InnoDB 配置
innodb_buffer_pool_size = 512M        # 缓冲池大小(内存的 50-70%)
innodb_log_file_size = 128M           # 日志文件大小
innodb_flush_log_at_trx_commit = 2    # 每秒刷新日志
innodb_flush_method = O_DIRECT        # 直接 IO

# 连接配置
max_connections = 200
wait_timeout = 600
interactive_timeout = 600

# 查询缓存(MySQL 8.0 已移除)
# query_cache_type = 1
# query_cache_size = 64M

# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1

# 临时表配置
tmp_table_size = 64M
max_heap_table_size = 64M

重启 MySQL:

bash
sudo systemctl restart mysql

连接池配置

在 DNS-Go 配置中:

toml
[mysql]
# DNS-Go 使用 GORM,连接池在 [database] 段配置
# 或通过代码中的 SetMaxOpenConns 设置

注意:MySQL 的特定配置段 [mysql] 只包含字符集和时区设置,连接池配置在 [database] 段或程序代码中。

备份与恢复

自动备份脚本

创建备份脚本:

bash
sudo tee /opt/backup/backup-mysql.sh > /dev/null <<'EOF'
#!/bin/bash

# 配置
DB_NAME="dns_go"
DB_USER="dnsgo"
DB_PASSWORD="your_password"
BACKUP_DIR="/opt/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30

# 创建备份目录
mkdir -p ${BACKUP_DIR}

# 执行备份
mysqldump -u ${DB_USER} -p${DB_PASSWORD} \
  --single-transaction \
  --routines \
  --triggers \
  ${DB_NAME} > ${BACKUP_DIR}/dns_go_${DATE}.sql

# 压缩备份文件
gzip ${BACKUP_DIR}/dns_go_${DATE}.sql

# 删除旧备份
find ${BACKUP_DIR} -name "dns_go_*.sql.gz" -mtime +${RETENTION_DAYS} -delete

# 记录日志
echo "[$(date)] MySQL backup completed: dns_go_${DATE}.sql.gz" >> ${BACKUP_DIR}/backup.log
EOF

chmod +x /opt/backup/backup-mysql.sh

配置定时任务:

bash
crontab -e

# 每天凌晨 2 点备份
0 2 * * * /opt/backup/backup-mysql.sh

手动备份

bash
# 使用 mysqldump 备份
mysqldump -u dnsgo -p dns_go > dns_go_backup.sql

# 压缩备份
gzip dns_go_backup.sql

恢复数据

bash
# 解压备份文件
gunzip dns_go_backup.sql.gz

# 恢复数据
mysql -u dnsgo -p dns_go < dns_go_backup.sql

监控与维护

查看数据库状态

bash
# 登录 MySQL
mysql -u root -p

# 查看状态
SHOW STATUS;

# 查看进程列表
SHOW PROCESSLIST;

# 查看数据库大小
SELECT 
  table_schema AS 'Database',
  ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'dns_go'
GROUP BY table_schema;

# 查看表状态
USE dns_go;
SHOW TABLE STATUS;

定期维护

bash
# 优化表
mysql -u dnsgo -p -e "OPTIMIZE TABLE table_name;" dns_go

# 分析表
mysql -u dnsgo -p -e "ANALYZE TABLE table_name;" dns_go

# 修复表(如有损坏)
mysql -u dnsgo -p -e "REPAIR TABLE table_name;" dns_go

故障排查

连接失败

bash
# 检查 MySQL 状态
sudo systemctl status mysql

# 检查端口监听
sudo netstat -tlnp | grep 3306

# 查看错误日志
sudo tail -f /var/log/mysql/error.log

性能问题

bash
# 查看慢查询日志
sudo tail -f /var/log/mysql/slow.log

# 查看当前执行的查询
mysql -u root -p -e "SHOW FULL PROCESSLIST;"

# 查看锁等待
mysql -u root -p -e "
SELECT 
  r.trx_id waiting_trx_id,
  r.trx_mysql_thread_id waiting_thread,
  b.trx_id blocking_trx_id,
  b.trx_mysql_thread_id blocking_thread
FROM information_schema.innodb_lock_waits w
JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id
JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
"

MySQL vs PostgreSQL

特性MySQLPostgreSQL
性能读操作优秀复杂查询优秀
功能简单易用功能丰富
SQL 标准较好最符合标准
扩展性良好优秀
社区广泛活跃
推荐场景简单应用、Web复杂应用、企业级

DNS-Go 推荐使用 PostgreSQL,但 MySQL 也是完全可行的选择。

相关文档

基于 MIT 许可发布