数据库
本文已按 Ubuntu 26.04 LTS 2026 年 4 月发布说明做初步复核,数据库版本和升级注意事项仍需逐项验证。
数据库是几乎所有 Web 应用和服务的核心组件。Ubuntu 官方仓库提供了多种主流数据库的安装包,本文将介绍如何在 Ubuntu 26.04 上安装和配置最常用的数据库:MySQL/MariaDB、PostgreSQL、Redis 和 SQLite。
MySQL / MariaDB
MySQL 是世界上最流行的开源关系型数据库之一,而 MariaDB 是 MySQL 的一个社区分支,由 MySQL 的原始开发者维护,两者在使用上高度兼容。
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脚本会引导你完成以下操作:
- 设置 root 密码(如果还没有设置)
- 删除匿名用户(强烈建议删除)
- 禁止 root 远程登录(强烈建议禁止)
- 删除测试数据库(建议删除)
- 重新加载权限表
基本操作
# 登录 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将数据库暴露到公网(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 mysqlPostgreSQL
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/tcpRedis / Valkey
Redis / Valkey 是开源的内存数据结构存储系统,可以用作数据库、缓存和消息代理。它们支持多种数据结构,如字符串、哈希、列表、集合等,以极快的读写速度著称。
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.rdbAOF(追加日志)——记录每次写操作:
# 启用 AOF
appendonly yes
# AOF 同步策略
# always: 每次写操作都同步(最安全,但最慢)
# everysec: 每秒同步一次(推荐,兼顾安全和性能)
# no: 由操作系统决定(最快,但可能丢失数据)
appendfsync everysec
# AOF 文件名
appendfilename "appendonly.aof"# 重启 Valkey 使配置生效
sudo systemctl restart valkey-serverValkey 安全配置
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 YourStrongRedisPasswordSQLite
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
-- 退出
.quitSQLite 的优势在于零配置、零维护,适合以下场景:
- 小型 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 myappPostgreSQL 备份
# 备份单个数据库
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.dumpValkey 备份
# 手动触发 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
| 特性 | MySQL | PostgreSQL | MariaDB |
|---|---|---|---|
| 开发者 | Oracle | PostgreSQL 社区 | MariaDB Foundation |
| 许可证 | GPL v2(双许可) | PostgreSQL License(类 MIT) | GPL v2 |
| 默认端口 | 3306 | 5432 | 3306 |
| ACID 合规 | InnoDB 引擎支持 | 完全支持 | InnoDB/Aria 引擎支持 |
| JSON 支持 | JSON 类型 | JSONB 类型(更强大) | JSON 类型 |
| 全文搜索 | 支持 | 支持(更强大) | 支持 |
| 地理空间 | 基本支持 | PostGIS 扩展(业界最强) | 基本支持 |
| 复制 | 主从复制、组复制 | 流复制、逻辑复制 | 主从复制、Galera 集群 |
| 存储引擎 | 多引擎(InnoDB、MyISAM 等) | 单一引擎 | 多引擎(InnoDB、Aria、ColumnStore 等) |
| SQL 标准遵从 | 较好 | 最好 | 较好 |
| 适用场景 | Web 应用、读多写少 | 复杂查询、数据分析、GIS | Web 应用、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 应用的基础。建议在开发环境多尝试不同的数据库,找到最适合你项目需求的方案。