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 --versionCentOS/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_installationmacOS 安装
bash
# 使用 Homebrew 安装
brew install mysql
# 启动服务
brew services start mysql
# 安全初始化
mysql_secure_installationWindows 安装
- 下载安装程序:MySQL 官方下载
- 运行安装向导
- 选择 "Server only" 或 "Full" 安装
- 设置 root 密码
- 保持默认端口 3306
- 完成安装
数据库配置
创建数据库和用户
登录 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 mysqlDNS-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 配置对比
| 配置项 | MySQL | PostgreSQL |
|---|---|---|
| driver | mysql | postgres |
| port | 3306 | 5432 |
| 特定配置段 | [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
| 特性 | MySQL | PostgreSQL |
|---|---|---|
| 性能 | 读操作优秀 | 复杂查询优秀 |
| 功能 | 简单易用 | 功能丰富 |
| SQL 标准 | 较好 | 最符合标准 |
| 扩展性 | 良好 | 优秀 |
| 社区 | 广泛 | 活跃 |
| 推荐场景 | 简单应用、Web | 复杂应用、企业级 |
DNS-Go 推荐使用 PostgreSQL,但 MySQL 也是完全可行的选择。
相关文档
- 环境要求 - 了解部署前的准备工作
- PostgreSQL 配置 - 使用 PostgreSQL(推荐)
- Docker 部署 - 使用 Docker 部署 MySQL