Skip to Content

数据库

Note

本文已按 Ubuntu 26.04 LTS 2026 年 4 月发布说明做初步复核,数据库版本和升级注意事项仍需逐项验证。

数据库是几乎所有 Web 应用和服务的核心组件。Ubuntu 官方仓库提供了多种主流数据库的安装包,本文将介绍如何在 Ubuntu 26.04 上安装和配置最常用的数据库:MySQL/MariaDB、PostgreSQL、Redis 和 SQLite。

MySQL / MariaDB

MySQL 是世界上最流行的开源关系型数据库之一,而 MariaDB 是 MySQL 的一个社区分支,由 MySQL 的原始开发者维护,两者在使用上高度兼容。

Tip

Ubuntu 26.04 官方仓库同时提供 MySQL 和 MariaDB。MariaDB 是 MySQL 的完全兼容替代品,提供了更好的性能优化和更开放的社区治理。如果你没有特殊需求,推荐使用 MariaDB。两者的命令行工具和 SQL 语法几乎完全一致。

安装 MySQL

# 安装 MySQL Server sudo apt update sudo apt install mysql-server # 检查服务状态 sudo systemctl status mysql # 设置开机自启 sudo systemctl enable mysql

安装 MariaDB

# 安装 MariaDB Server sudo apt update sudo apt install mariadb-server # 检查服务状态 sudo systemctl status mariadb # 设置开机自启 sudo systemctl enable mariadb

安全初始化

安装完成后,务必运行安全初始化脚本来加固数据库:

# MySQL 和 MariaDB 都使用相同的命令 sudo mysql_secure_installation

脚本会引导你完成以下操作:

  1. 设置 root 密码(如果还没有设置)
  2. 删除匿名用户(强烈建议删除)
  3. 禁止 root 远程登录(强烈建议禁止)
  4. 删除测试数据库(建议删除)
  5. 重新加载权限表

基本操作

# 登录 MySQL/MariaDB(Ubuntu 默认使用 unix_socket 认证) sudo mysql # 或者使用密码登录 mysql -u root -p

以下是常用的 SQL 操作:

-- 查看所有数据库 SHOW DATABASES; -- 创建数据库 CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 使用数据库 USE myapp; -- 创建用户并设置密码 CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPassword123!'; -- 授予权限(仅限指定数据库) GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES; -- 查看用户权限 SHOW GRANTS FOR 'appuser'@'localhost'; -- 创建表 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, email VARCHAR(100) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 插入数据 INSERT INTO users (username, email) VALUES ('zhang', 'zhang@example.com'); -- 查询数据 SELECT * FROM users; -- 查看表结构 DESCRIBE users; -- 删除用户 DROP USER 'appuser'@'localhost'; -- 删除数据库 DROP DATABASE myapp; -- 退出 EXIT;

远程访问配置

默认情况下,MySQL/MariaDB 只监听本地连接(127.0.0.1)。如果需要远程访问:

# 编辑 MySQL 配置 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf # 或 MariaDB 配置 sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

找到 bind-address 行,修改为:

# 允许所有 IP 连接(生产环境建议绑定具体 IP) bind-address = 0.0.0.0

然后创建允许远程连接的用户:

-- 创建允许从任意 IP 连接的用户 CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON myapp.* TO 'remoteuser'@'%'; FLUSH PRIVILEGES; -- 或者限制为特定 IP CREATE USER 'remoteuser'@'192.168.1.100' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON myapp.* TO 'remoteuser'@'192.168.1.100'; FLUSH PRIVILEGES;
# 重启服务使配置生效 sudo systemctl restart mysql # 或 sudo systemctl restart mariadb # 如果启用了防火墙,需要放行端口 sudo ufw allow 3306/tcp
Warning

将数据库暴露到公网(0.0.0.0)是非常危险的操作。如果必须远程访问,请务必:使用强密码、限制允许连接的 IP 地址、配置防火墙规则、考虑使用 SSH 隧道或 VPN 代替直接暴露端口。

常用配置优化

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf(或对应的 MariaDB 配置文件):

[mysqld] # 字符集(推荐 utf8mb4 以支持 emoji 等字符) character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci # InnoDB 缓冲池(建议设为物理内存的 50%-70%) innodb_buffer_pool_size = 1G # 最大连接数 max_connections = 200 # 慢查询日志 slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2
# 修改后重启服务 sudo systemctl restart mysql

PostgreSQL

PostgreSQL(简称 PG)是一个功能强大的开源对象关系型数据库,以其严格的 SQL 标准遵从性、丰富的数据类型和强大的扩展能力著称。它是处理复杂查询、地理空间数据(PostGIS)和 JSON 数据的理想选择。

安装 PostgreSQL

# 安装 PostgreSQL sudo apt update sudo apt install postgresql postgresql-client # 检查服务状态 sudo systemctl status postgresql # 查看安装的版本 psql --version

用户和数据库创建

PostgreSQL 使用独立的用户认证系统。安装后会自动创建一个名为 postgres 的系统用户和数据库超级用户。

# 切换到 postgres 用户 sudo -u postgres psql
-- 创建新的数据库用户 CREATE USER appuser WITH PASSWORD 'StrongPassword123!'; -- 创建数据库并指定所有者 CREATE DATABASE myapp OWNER appuser; -- 授予连接权限 GRANT ALL PRIVILEGES ON DATABASE myapp TO appuser; -- 查看所有数据库 \l -- 查看所有用户 \du -- 切换数据库 \c myapp -- 退出 \q

也可以使用命令行工具:

# 使用 postgres 用户创建新用户 sudo -u postgres createuser --interactive appuser # 创建数据库 sudo -u postgres createdb -O appuser myapp # 使用新用户连接 psql -U appuser -d myapp -h localhost

基本操作

# 连接到数据库 psql -U appuser -d myapp -h localhost
-- 创建表 CREATE TABLE articles ( id SERIAL PRIMARY KEY, title VARCHAR(200) NOT NULL, content TEXT, tags TEXT[], metadata JSONB, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- 插入数据(注意 PostgreSQL 支持数组和 JSON 类型) INSERT INTO articles (title, content, tags, metadata) VALUES ( 'Ubuntu 26.04 发布', '新版本带来了许多改进...', ARRAY['ubuntu', 'linux', 'release'], '{"author": "admin", "views": 0}'::jsonb ); -- 查询数据 SELECT * FROM articles; -- JSON 查询 SELECT title FROM articles WHERE metadata->>'author' = 'admin'; -- 数组查询 SELECT title FROM articles WHERE 'ubuntu' = ANY(tags); -- 查看表结构 \d articles -- 查看所有表 \dt -- 查看表大小 \dt+

PostgreSQL 常用 psql 命令

命令说明
\l列出所有数据库
\c dbname切换到指定数据库
\dt列出当前数据库的所有表
\d tablename查看表结构
\du列出所有用户/角色
\di列出所有索引
\df列出所有函数
\timing开启/关闭查询计时
\x切换扩展显示模式
\q退出

远程访问配置

# 编辑主配置文件 sudo nano /etc/postgresql/18/main/postgresql.conf
# 修改监听地址 listen_addresses = '*'
# 编辑客户端认证配置 sudo nano /etc/postgresql/18/main/pg_hba.conf

在文件末尾添加:

# 允许特定网段通过密码认证连接 host all all 192.168.1.0/24 scram-sha-256 # 或允许所有 IP(不推荐用于生产环境) host all all 0.0.0.0/0 scram-sha-256
# 重启 PostgreSQL sudo systemctl restart postgresql # 放行防火墙端口 sudo ufw allow 5432/tcp

Redis / Valkey

Redis / Valkey 是开源的内存数据结构存储系统,可以用作数据库、缓存和消息代理。它们支持多种数据结构,如字符串、哈希、列表、集合等,以极快的读写速度著称。

Note

Ubuntu 26.04 的官方仓库主推 Valkey 9.0(Redis 的社区分叉,兼容 Redis 协议),并已进入 main 组件。推荐使用 Valkey;Redis 仍可单独安装,valkey-server 与 redis-server 在仓库中并存。本文示例以 Valkey 为主,使用 valkey-server / valkey-cli 命令;旧的 redis-cli 仍作为兼容别名可用。

安装 Valkey

# 安装 Valkey(26.04 推荐) sudo apt update sudo apt install valkey-server # 如需 Redis,也可单独安装(与 Valkey 并存,命令前缀换成 redis) # sudo apt install redis-server # 检查服务状态 sudo systemctl status valkey-server # 验证是否正常工作 valkey-cli ping # 应输出:PONG

基本操作

# 连接 Valkey CLI(redis-cli 作为兼容别名也可用) valkey-cli
# 字符串操作 SET name "Ubuntu Fan" GET name # 设置带过期时间的键(60 秒) SET session:abc123 "user_data" EX 60 # 查看剩余过期时间 TTL session:abc123 # 哈希操作(类似对象) HSET user:1 name "张三" email "zhang@example.com" age "30" HGET user:1 name HGETALL user:1 # 列表操作 LPUSH tasks "task1" "task2" "task3" LRANGE tasks 0 -1 RPOP tasks # 集合操作 SADD online_users "user1" "user2" "user3" SMEMBERS online_users SISMEMBER online_users "user1" # 有序集合(排行榜场景) ZADD leaderboard 100 "player1" 200 "player2" 150 "player3" ZREVRANGE leaderboard 0 -1 WITHSCORES # 查看所有键 KEYS * # 删除键 DEL name # 查看键的类型 TYPE user:1 # 查看服务器信息 INFO # 查看内存使用 INFO memory # 退出 QUIT

持久化配置

数据默认存储在内存中,重启后会丢失。Valkey 提供两种持久化方式:

RDB(快照)——定期将内存数据保存为快照文件:

# 编辑 Valkey 配置(Redis 兼容包对应 /etc/redis/redis.conf) sudo nano /etc/valkey/valkey.conf
# RDB 持久化规则(默认已启用) # 3600 秒内至少 1 次修改则保存 save 3600 1 # 300 秒内至少 100 次修改则保存 save 300 100 # 60 秒内至少 10000 次修改则保存 save 60 10000 # RDB 文件位置 dir /var/lib/valkey dbfilename dump.rdb

AOF(追加日志)——记录每次写操作:

# 启用 AOF appendonly yes # AOF 同步策略 # always: 每次写操作都同步(最安全,但最慢) # everysec: 每秒同步一次(推荐,兼顾安全和性能) # no: 由操作系统决定(最快,但可能丢失数据) appendfsync everysec # AOF 文件名 appendfilename "appendonly.aof"
# 重启 Valkey 使配置生效 sudo systemctl restart valkey-server

Valkey 安全配置

sudo nano /etc/valkey/valkey.conf
# 设置密码 requirepass YourStrongRedisPassword # 绑定地址(默认仅本地访问) bind 127.0.0.1 ::1 # 禁用危险命令 rename-command FLUSHDB "" rename-command FLUSHALL "" rename-command CONFIG ""
# 使用密码连接 valkey-cli -a YourStrongRedisPassword # 或者连接后认证 valkey-cli AUTH YourStrongRedisPassword

SQLite

SQLite 是一个轻量级的嵌入式关系型数据库。它不需要独立的服务器进程,所有数据存储在一个文件中。SQLite 非常适合小型应用、原型开发、移动应用和嵌入式系统。

安装和使用

# 安装 SQLite sudo apt install sqlite3 # 创建/打开数据库文件 sqlite3 mydb.sqlite # 在 SQLite 提示符中操作
-- 创建表 CREATE TABLE notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); -- 插入数据 INSERT INTO notes (title, content) VALUES ('测试笔记', '这是一条测试内容'); -- 查询 SELECT * FROM notes; -- 查看所有表 .tables -- 查看表结构 .schema notes -- 以列名模式显示结果 .headers on .mode column -- 导出为 SQL .dump -- 导出为 CSV .mode csv .output notes.csv SELECT * FROM notes; .output stdout -- 退出 .quit

SQLite 的优势在于零配置、零维护,适合以下场景:

  • 小型 Web 应用(如个人博客)
  • 开发和测试环境
  • 桌面应用的本地数据存储
  • 数据分析(配合 Python 的 sqlite3 模块)

数据库备份策略

数据备份是数据库管理中最重要的工作之一。以下是各数据库的备份方法:

MySQL / MariaDB 备份

# 备份单个数据库 mysqldump -u root -p myapp > myapp_backup_$(date +%Y%m%d).sql # 备份所有数据库 mysqldump -u root -p --all-databases > all_databases_$(date +%Y%m%d).sql # 压缩备份 mysqldump -u root -p myapp | gzip > myapp_backup_$(date +%Y%m%d).sql.gz # 恢复数据库 mysql -u root -p myapp < myapp_backup_20260324.sql # 恢复压缩备份 gunzip < myapp_backup_20260324.sql.gz | mysql -u root -p myapp

PostgreSQL 备份

# 备份单个数据库 sudo -u postgres pg_dump myapp > myapp_backup_$(date +%Y%m%d).sql # 备份所有数据库 sudo -u postgres pg_dumpall > all_databases_$(date +%Y%m%d).sql # 自定义格式备份(支持并行恢复) sudo -u postgres pg_dump -Fc myapp > myapp_backup_$(date +%Y%m%d).dump # 恢复 SQL 格式备份 sudo -u postgres psql myapp < myapp_backup_20260324.sql # 恢复自定义格式备份 sudo -u postgres pg_restore -d myapp myapp_backup_20260324.dump

Valkey 备份

# 手动触发 RDB 快照 valkey-cli BGSAVE # 复制 RDB 文件 sudo cp /var/lib/valkey/dump.rdb /backup/valkey_$(date +%Y%m%d).rdb # 恢复:停止 Valkey,替换 dump.rdb,重启 sudo systemctl stop valkey-server sudo cp /backup/valkey_20260324.rdb /var/lib/valkey/dump.rdb sudo chown valkey:valkey /var/lib/valkey/dump.rdb sudo systemctl start valkey-server

自动备份脚本

创建一个 cron 定时任务来自动备份:

# 创建备份脚本 sudo nano /usr/local/bin/db-backup.sh
#!/bin/bash BACKUP_DIR="/backup/databases" DATE=$(date +%Y%m%d_%H%M%S) mkdir -p "$BACKUP_DIR" # MySQL/MariaDB 备份 mysqldump -u root --all-databases | gzip > "$BACKUP_DIR/mysql_$DATE.sql.gz" # PostgreSQL 备份 sudo -u postgres pg_dumpall | gzip > "$BACKUP_DIR/postgres_$DATE.sql.gz" # Valkey 备份 valkey-cli BGSAVE sleep 5 cp /var/lib/valkey/dump.rdb "$BACKUP_DIR/valkey_$DATE.rdb" # 删除 30 天前的备份 find "$BACKUP_DIR" -type f -mtime +30 -delete echo "备份完成: $DATE"
# 设置执行权限 sudo chmod +x /usr/local/bin/db-backup.sh # 添加 cron 定时任务(每天凌晨 3 点执行) sudo crontab -e # 添加以下行: # 0 3 * * * /usr/local/bin/db-backup.sh >> /var/log/db-backup.log 2>&1

数据库对比:MySQL vs PostgreSQL vs MariaDB

特性MySQLPostgreSQLMariaDB
开发者OraclePostgreSQL 社区MariaDB Foundation
许可证GPL v2(双许可)PostgreSQL License(类 MIT)GPL v2
默认端口330654323306
ACID 合规InnoDB 引擎支持完全支持InnoDB/Aria 引擎支持
JSON 支持JSON 类型JSONB 类型(更强大)JSON 类型
全文搜索支持支持(更强大)支持
地理空间基本支持PostGIS 扩展(业界最强)基本支持
复制主从复制、组复制流复制、逻辑复制主从复制、Galera 集群
存储引擎多引擎(InnoDB、MyISAM 等)单一引擎多引擎(InnoDB、Aria、ColumnStore 等)
SQL 标准遵从较好最好较好
适用场景Web 应用、读多写少复杂查询、数据分析、GISWeb 应用、MySQL 替代
学习曲线较低中等较低(与 MySQL 兼容)

选择建议

  • MySQL:生态最大、社区资源最丰富,适合大多数 Web 应用
  • PostgreSQL:功能最强大,适合需要复杂查询、JSON 操作、地理空间数据的场景
  • MariaDB:MySQL 的开源替代品,性能优化更积极,社区更开放

常用管理命令汇总

# --- MySQL / MariaDB --- sudo systemctl start mysql # 启动 sudo systemctl stop mysql # 停止 sudo systemctl restart mysql # 重启 sudo systemctl status mysql # 查看状态 sudo mysql # 登录 # --- PostgreSQL --- sudo systemctl start postgresql # 启动 sudo systemctl stop postgresql # 停止 sudo systemctl restart postgresql # 重启 sudo systemctl status postgresql # 查看状态 sudo -u postgres psql # 登录 # --- Valkey --- sudo systemctl start valkey-server # 启动 sudo systemctl stop valkey-server # 停止 sudo systemctl restart valkey-server # 重启 sudo systemctl status valkey-server # 查看状态 valkey-cli # 登录 valkey-cli INFO # 查看信息 valkey-cli DBSIZE # 查看键数量

合理选择和配置数据库,是构建可靠 Web 应用的基础。建议在开发环境多尝试不同的数据库,找到最适合你项目需求的方案。

Last updated on