Ubuntu 系统系列 | 第 17 天:数据库服务器部署——MySQL/MariaDB/PostgreSQL 安装与调优

第 17/30 天

引言

数据库是现代应用的核心基础设施。无论是小型个人博客还是大型企业系统,都离不开稳定高效的数据库服务。在 Ubuntu 上,最流行的三大关系型数据库——MySQL、MariaDB 和 PostgreSQL——各有特色和适用场景。

今天,我们将深入这三款数据库在 Ubuntu 上的安装配置、基础调优和日常运维,帮助你根据实际需求选择最合适的方案。

一、数据库选型对比

在开始安装之前,先了解三者的核心差异:

特性 MySQL MariaDB PostgreSQL
起源 Oracle 旗下 MySQL 分支(社区维护) 独立开源项目
许可证 GPL/商业双许可 GPL PostgreSQL 许可证
默认存储引擎 InnoDB InnoDB / Aria / MyRocks 内置多存储引擎
ACID 支持 ✅(InnoDB) ✅(原生)
JSON 支持 ✅(5.7+) ✅(10.2+) ✅(原生 JSONB)
并发性能 读密集场景优秀 与 MySQL 接近,略有提升 写密集场景优秀
窗口函数 8.0+ 支持 10.2+ 支持 原生支持
空间数据 ✅(PostGIS 更强大)
适用场景 Web 应用(WordPress、LAMP) Web 应用、替代 MySQL 复杂查询、数据分析、GIS

选择建议:
– 运行 WordPress 等 CMS → MariaDB(兼容 MySQL 且性能略优)
– 需要高并发读取 → MySQL 8.0+
– 复杂查询、数据分析、金融系统 → PostgreSQL

二、MySQL 8.0 安装与配置

2.1 安装 MySQL

# 更新包索引
sudo apt update

# 安装 MySQL 8.0 服务器
sudo apt install -y mysql-server-8.0

# 验证安装版本
mysql --version
# 输出示例: mysql  Ver 8.0.36-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))

# 检查服务状态
sudo systemctl status mysql

2.2 安全初始化

安装完成后,MySQL 默认是”宽松”模式——需要立即执行安全配置:

# 运行安全初始化脚本
sudo mysql_secure_installation

# 交互式回答(建议):
# 1. 设置密码强度策略(建议选择 2 = STRONG)
# 2. 设置 root 密码
# 3. 删除匿名用户 → Y
# 4. 禁止 root 远程登录 → Y
# 5. 删除 test 数据库 → Y
# 6. 重新加载权限表 → Y

非交互式自动化配置(用于脚本部署):

# 使用预配置方式自动设置
sudo mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword123!';"
sudo mysql -e "FLUSH PRIVILEGES;"

2.3 创建数据库和用户

# 登录 MySQL
sudo mysql -u root -p

# 创建数据库
CREATE DATABASE IF NOT EXISTS myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 创建用户并授权
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'SecurePassword123!';
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;

# 创建远程访问用户(仅限安全网络环境)
CREATE USER 'remoteuser'@'192.168.1.%' IDENTIFIED BY 'RemotePassword123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'remoteuser'@'192.168.1.%';
FLUSH PRIVILEGES;

# 退出
EXIT;

2.4 MySQL 性能调优

MySQL 的核心配置文件位于 /etc/mysql/mysql.conf.d/mysqld.cnf

# /etc/mysql/mysql.conf.d/mysqld.cnf 关键调优参数

[mysqld]
# 基本设置
port = 3306
bind-address = 127.0.0.1    # 安全:仅本地连接
max_connections = 200        # 根据服务器内存调整

# InnoDB 引擎调优
innodb_buffer_pool_size = 2G  # 设置为物理内存的 60-70%
innodb_log_file_size = 512M
innodb_flush_log_at_trx_commit = 2  # 写入性能优化(安全折中)
innodb_file_per_table = 1

# 查询缓存(MySQL 8.0 已废弃,仅保留兼容)
# 使用 Performance Schema 替代

# 连接超时设置
wait_timeout = 600
interactive_timeout = 600

应用配置后重启:

# 检查配置语法
sudo mysqld --validate-config

# 重启 MySQL
sudo systemctl restart mysql

# 验证参数生效
sudo mysql -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"

三、MariaDB 安装与配置

MariaDB 是 MySQL 的社区分支,完全兼容 MySQL 协议,但拥有更多存储引擎和性能优化。

3.1 安装 MariaDB

# 通过 Ubuntu 仓库安装
sudo apt update
sudo apt install -y mariadb-server mariadb-client

# 验证版本
mariadb --version
# 输出示例: mysql  Ver 15.1 Distrib 10.6.16-MariaDB

# 查看服务状态
sudo systemctl status mariadb

3.2 MariaDB 的特殊配置

MariaDB 使用与 MySQL 相同的安全初始化脚本:

# 安全配置
sudo mysql_secure_installation

# MariaDB 关键配置差异
# - 默认使用 unix_socket 认证(无需密码即可通过 root 系统用户登录)
# - 默认存储引擎仍为 InnoDB
# - 额外支持 Aria(崩溃安全)、MyRocks(压缩)、Spider(分片)等引擎

3.3 MariaDB 的独特优势——Aria 引擎

# 查看可用的存储引擎
sudo mysql -e "SHOW ENGINES;"

# 创建使用 Aria 引擎的表
sudo mysql -e "
CREATE DATABASE IF NOT EXISTS test_aria;
USE test_aria;
CREATE TABLE aria_test (
    id INT AUTO_INCREMENT PRIMARY KEY,
    data VARCHAR(100)
) ENGINE=Aria TRANSACTIONAL=1;
"
# TRANSACTIONAL=1 启用事务支持,0 为高性能非事务模式

3.4 MariaDB 调优建议

MariaDB 的配置文件位于 /etc/mysql/mariadb.conf.d/50-server.cnf

# /etc/mysql/mariadb.conf.d/50-server.cnf 关键调优

[mysqld]
# 基础设置
max_connections = 200
thread_cache_size = 64

# InnoDB 调优
innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M

# MariaDB 特有优化
aria_pagecache_buffer_size = 128M
thread_handling = pool-of-threads  # 线程池模式,适合高并发

# 查询优化
join_buffer_size = 4M
tmp_table_size = 64M
max_heap_table_size = 64M

四、PostgreSQL 16 安装与配置

PostgreSQL 以功能丰富、标准符合度高、适合复杂查询而闻名。

4.1 安装 PostgreSQL

# 安装 PostgreSQL 16(Ubuntu 22.04 默认仓库)
sudo apt update
sudo apt install -y postgresql postgresql-contrib

# 验证版本
psql --version
# 输出示例: psql (PostgreSQL) 16.2 (Ubuntu 16.2-1.pgdg22.04+1)

# 检查服务状态
sudo systemctl status postgresql

4.2 PostgreSQL 的用户体系

PostgreSQL 使用操作系统用户和数据库用户分离的认证体系:

# PostgreSQL 默认创建 postgres 系统用户
# 切换并进入 psql 控制台
sudo -u postgres psql

# 在 psql 中创建数据库和用户
CREATE DATABASE myapp;
CREATE USER appuser WITH PASSWORD 'SecurePassword123!';
GRANT ALL PRIVILEGES ON DATABASE myapp TO appuser;

# 连接到新数据库
c myapp

# 创建表并测试
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

# 插入测试数据
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
INSERT INTO users (name, email) VALUES ('李四', 'lisi@example.com');

# 查询并验证
SELECT * FROM users;

# 退出 psql
q

4.3 配置远程访问

PostgreSQL 默认只监听本地连接,需要修改两个文件:

# 1. 修改 postgresql.conf 监听地址
sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = 'localhost, 192.168.1.100'/" /etc/postgresql/16/main/postgresql.conf

# 2. 修改 pg_hba.conf 添加远程访问规则
echo "host    myapp    appuser    192.168.1.0/24    md5" | sudo tee -a /etc/postgresql/16/main/pg_hba.conf

# 重启生效
sudo systemctl restart postgresql

4.4 PostgreSQL 性能调优

PostgreSQL 的配置文件位于 /etc/postgresql/16/main/postgresql.conf

# /etc/postgresql/16/main/postgresql.conf 关键调优参数

# 连接设置
max_connections = 200
listen_addresses = 'localhost'

# 内存设置(服务器 8GB 内存为例)
shared_buffers = 2GB           # 物理内存的 25%
effective_cache_size = 6GB    # 物理内存的 75%
work_mem = 32MB               # 每个排序操作的内存(谨慎调大)
maintenance_work_mem = 512MB

# 写入优化
wal_buffers = 16MB
wal_level = replica            # 用于流复制
max_wal_size = 2GB
min_wal_size = 512MB

# 查询优化
random_page_cost = 1.1        # SSD 环境下降低此值
effective_io_concurrency = 200 # SSD 环境
default_statistics_target = 100

# 并行查询
max_parallel_workers_per_gather = 4
max_parallel_workers = 8
parallel_tuple_cost = 0.1
parallel_setup_cost = 500

五、数据库日常运维

5.1 备份与恢复

MySQL/MariaDB 备份:

# 使用 mysqldump 备份单个数据库
mysqldump -u root -p --single-transaction --routines --triggers myapp > /backup/myapp_$(date +%Y%m%d).sql

# 压缩备份
mysqldump -u root -p --all-databases --single-transaction | gzip > /backup/all_$(date +%Y%m%d).sql.gz

# 恢复备份
mysql -u root -p myapp < /backup/myapp_20240724.sql
gunzip -c /backup/all_20240724.sql.gz | mysql -u root -p

PostgreSQL 备份:

# 使用 pg_dump
pg_dump -U postgres -h localhost myapp > /backup/myapp_$(date +%Y%m%d).sql

# 压缩备份
pg_dump -U postgres -h localhost myapp | gzip > /backup/myapp_$(date +%Y%m%d).sql.gz

# 恢复备份
createdb -U postgres myapp_restored
psql -U postgres -d myapp_restored < /backup/myapp_20240724.sql
gunzip -c /backup/myapp_20240724.sql.gz | psql -U postgres -d myapp_restored

5.2 监控与诊断

# MySQL/MariaDB 进程列表
sudo mysql -e "SHOW FULL PROCESSLIST;"

# 慢查询分析(需要先在配置中启用 slow_query_log)
sudo mysql -e "SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;"

# PostgreSQL 活动查询
sudo -u postgres psql -c "SELECT pid, state, query, age(now(), query_start) FROM pg_stat_activity WHERE state != 'idle' ORDER BY query_start DESC;"

# 查看数据库大小
sudo -u postgres psql -c "
SELECT datname, pg_size_pretty(pg_database_size(datname)) 
FROM pg_database 
ORDER BY pg_database_size(datname) DESC;
"

5.3 日志管理

# MySQL 错误日志
sudo tail -100 /var/log/mysql/error.log

# MariaDB 错误日志
sudo tail -100 /var/log/mysql/error.log

# PostgreSQL 日志
sudo tail -100 /var/log/postgresql/postgresql-16-main.log

# 查看 MySQL 二进制日志状态
sudo mysql -e "SHOW BINARY LOGS;"

六、常见问题与排错

6.1 无法连接数据库

# 检查服务是否在运行
sudo systemctl status mysql

# 检查端口监听
sudo ss -tlnp | grep -E '3306|5432'

# 检查防火墙
sudo ufw status
sudo ufw allow 3306/tcp  # MySQL
sudo ufw allow 5432/tcp  # PostgreSQL

6.2 密码认证失败

# MySQL/MariaDB 重置 root 密码(免密模式)
sudo systemctl stop mysql
sudo mkdir -p /var/run/mysqld
sudo chown mysql:mysql /var/run/mysqld
sudo mysqld_safe --skip-grant-tables &
sleep 5
sudo mysql -u root -e "FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPassword123!';"
sudo mysqladmin shutdown
sudo systemctl start mysql

6.3 性能问题快速诊断

# MySQL 查询缓存命中率(MySQL 8.0 以下版本)
sudo mysql -e "SHOW STATUS LIKE 'Qcache%';"

# PostgreSQL 缓存命中率
sudo -u postgres psql -c "
SELECT 
    'index hit rate' AS name, 
    (sum(idx_blks_hit)) / nullif(sum(idx_blks_hit + idx_blks_read),0) AS ratio
FROM pg_statio_user_indexes
UNION ALL
SELECT 'table hit rate', 
    sum(heap_blks_hit) / nullif(sum(heap_blks_hit) + sum(heap_blks_read),0)
FROM pg_statio_user_sequences;
"

# 检查数据库连接数
sudo mysql -e "SHOW STATUS LIKE 'Threads_connected';"
sudo -u postgres psql -c "SELECT count(*) FROM pg_stat_activity;"

七、安全最佳实践

# 1. 数据库端口仅在需要时对外开放
# MySQL 默认监听 127.0.0.1:3306,PostgreSQL 默认 127.0.0.1:5432

# 2. 使用强密码策略
sudo mysql -e "SHOW VARIABLES LIKE 'validate_password%';"

# 3. 定期审计用户权限
sudo mysql -e "SELECT user, host, authentication_string FROM mysql.user;"
sudo -u postgres psql -c "du"

# 4. 启用 SSL 连接(MySQL 8.0+)
sudo mysql -e "SHOW VARIABLES LIKE '%ssl%';"

# 5. 限制数据库用户最小权限原则
# 仅授予应用所需的最小权限,而非 ALL PRIVILEGES

总结

今天我们深入探索了 Ubuntu 上三大主流关系型数据库的安装、配置与调优:

  • MySQL 8.0:最适合兼容性要求高的 Web 应用,安装简单,生态成熟
  • MariaDB:MySQL 的社区增强版,提供更多存储引擎选择和性能优化
  • PostgreSQL 16:功能最丰富,适合复杂查询、数据分析和需要高级特性的场景

关键要点:
1. 安装后立即执行安全初始化脚本
2. 根据服务器内存调整 innodb_buffer_pool_size(MySQL/MariaDB)或 shared_buffers(PostgreSQL)
3. 限制数据库监听地址,不要开放到公网
4. 建立定期备份机制,使用 --single-transaction 确保一致性
5. 使用慢查询日志和系统视图监控性能


📚 系列目录


下期预告: 第 18 天,我们将进入容器化时代——Docker 在 Ubuntu 上的安装与容器化管理。从 Docker 引擎安装到镜像管理、容器网络与数据卷,再到 Docker Compose 编排,带你迈入云原生第一步。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容