海外云服务器搭建MySQL/PostgreSQL数据库服务器完整教程(2026最新版)

📅 · 海外云服务器自建服务教程 - ChengziCloud

一句话结论

Meta Description: 从零开始用海外云服务器搭建MySQL和PostgreSQL数据库,涵盖CentOS 7/Ubuntu双系统安装、主从复制、备份恢复、性能调优、安全加固全流程,附配置推荐与价格对比。

本文要点
  • 前言
  • MySQL vs PostgreSQL:怎么选
  • 服务器配置推荐
  • MySQL 8.0 安装配置
  • PostgreSQL 16 安装配置
  • 数据库自动备份
  • 安全加固
  • 性能监控与诊断

Meta Description: 从零开始用海外云服务器搭建MySQL和PostgreSQL数据库,涵盖CentOS 7/Ubuntu双系统安装、主从复制、备份恢复、性能调优、安全加固全流程,附配置推荐与价格对比。

关键词:海外云服务器搭建MySQL、PostgreSQL数据库教程、MySQL主从复制、PostgreSQL性能优化、数据库备份恢复、海外服务器数据库搭建、MySQL安全加固

前言

用海外云服务器搭建MySQL或PostgreSQL数据库服务器,是搭建任何Web应用、API后端或数据分析平台的第一步。WordPress博客、Typecho站点、跨境电商独立站、Python爬虫数据存储、Node.js应用——几乎所有互联网项目都需要一个稳定的数据库来持久化数据。本文提供完整的命令步骤,从MySQL 8.0和PostgreSQL 16的安装配置,到主从复制、自动备份、性能调优和安全加固,所有操作均可直接复制执行。

🚀 还没有海外云服务器?通过 5.chengzicloud.cloud 选购阿里云/AWS/腾讯云国际版,享专属折扣和中文技术支持。

一、MySQL vs PostgreSQL:怎么选

选数据库是搭建的第一步,MySQL和PostgreSQL各有优势,没有绝对的好坏,只有适合的场景:

MySQL 8.0的优势:

  • 生态最成熟,WordPress/Typecho/Shopify等主流CMS和电商系统都原生支持MySQL
  • 安装简单,配置参数少,新手友好
  • 读性能极高,单机查询可达5万+ QPS
  • 社区庞大,遇到问题容易找到解决方案

PostgreSQL 16的优势:

  • SQL标准兼容性最强,支持窗口函数、CTE、JSONB等高级特性
  • 数据完整性保障更好,支持外键约束、排他约束等
  • 扩展生态丰富:PostGIS(地理信息)、TimescaleDB(时序数据)、pgvector(向量搜索)
  • 并发处理能力更强,MVCC实现更高效,写密集型场景优于MySQL

选型建议:

使用场景推荐数据库理由
WordPress/Typecho博客MySQL 8.0CMS原生支持,配置最少
电商独立站(WooCommerce等)MySQL 8.0主流电商平台均基于MySQL
Python/Node.js API后端PostgreSQL 16JSONB存储灵活,扩展性强
地理信息系统(GIS)PostgreSQL 16PostGIS是行业标准
数据分析/BI报表PostgreSQL 16窗口函数、CTE、物化视图
实时数据看板MySQL 8.0读性能极高,简单查询更快
机器学习/AI应用PostgreSQL 16pgvector向量搜索原生支持

💡 新手建议:不确定就选MySQL 8.0,生态最成熟、坑最少。如果你的项目需要JSONB存储或GIS功能,选PostgreSQL 16。通过 5.chengzicloud.cloud 购买阿里云国际版或腾讯云国际版香港节点,延迟最低。

二、服务器配置推荐

数据库是服务器上资源消耗最大的服务之一,内存和磁盘I/O直接决定数据库性能:

MySQL配置推荐:

使用场景CPU内存硬盘带宽推荐系统月费参考
个人博客/小站1核1GB20GB SSD1MbpsUbuntu 22.04$3.5-5/月
企业官网/中小电商2核2GB40GB SSD3MbpsUbuntu 22.04$6-10/月
中大型电商/SaaS4核8GB100GB SSD5MbpsUbuntu 22.04$20-35/月
高并发业务8核16GB+200GB SSD10MbpsUbuntu 22.04$40-80/月

PostgreSQL配置推荐:

使用场景CPU内存硬盘带宽推荐系统月费参考
开发测试/轻量应用1核2GB30GB SSD1MbpsUbuntu 22.04$5-8/月
中小API后端2核4GB60GB SSD3MbpsUbuntu 22.04$10-15/月
中大型业务4核8GB120GB SSD5MbpsUbuntu 22.04$20-35/月
高并发OLTP8核32GB+300GB SSD10MbpsUbuntu 22.04$60-120/月

PostgreSQL为什么需要更多内存:PostgreSQL默认使用较大的shared_buffers(共享缓冲区),一般设为物理内存的25%。1GB内存的服务器shared_buffers只能设256MB,对于稍复杂的查询就可能频繁读写磁盘,性能急剧下降。因此PostgreSQL的最低实用配置是2GB内存。

磁盘选择:数据库对磁盘I/O要求极高。SSD是底线,推荐NVMe SSD。避免使用机械硬盘(HDD)或云厂商的普通云盘。阿里云ESSD PL0/PL1、AWS gp3、腾讯云SSD云盘都是不错的选择。

服务商最低配1核2G2核4G数据中心优点
阿里云国际版 ECS$4.2/月$8.5/月$16/月新加坡/香港/硅谷中文面板、支持支付宝
AWS Lightsail$3.5/月$10/月$20/月全球20+区域新用户免费套餐、生态完善
腾讯云国际版 CVM$4.5/月$9/月$18/月香港/新加坡/东京低延迟到国内、微信支付
Vultr$6/月$12/月$24/月全球32个按小时计费、随时销毁
DigitalOcean$6/月$12/月$24/月全球14个文档最完善、社区教程多

三、MySQL 8.0 安装配置

3.1 Ubuntu 22.04 安装MySQL


// 更新软件源
sudo apt update && sudo apt upgrade -y

// 安装MySQL 8.0
sudo apt install -y mysql-server

// 启动并设置开机自启
sudo systemctl start mysql
sudo systemctl enable mysql

// 运行安全配置向导(设置root密码、删除匿名用户、禁止远程root登录)
sudo mysql_secure_installation
// 按提示操作:Y → 设置密码 → Y → Y → Y → Y

3.2 CentOS 7 安装MySQL


// 安装MySQL官方YUM源
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm

// 安装MySQL 8.0(CentOS 7默认有MariaDB冲突,先卸载)
sudo yum remove -y mariadb-libs
sudo yum install -y mysql-community-server

// 启动并设置开机自启
sudo systemctl start mysqld
sudo systemctl enable mysqld

// 获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log

// 用临时密码登录后修改密码
mysql -u root -p
// 输入临时密码后执行:
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
exit

// 运行安全配置向导
sudo mysql_secure_installation

3.3 创建数据库和用户(推荐做法)


// 登录MySQL
mysql -u root -p

// 创建应用专用数据库(以WordPress为例)
CREATE DATABASE wp_database CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

// 创建专用用户(不要用root跑应用)
CREATE USER 'wp_user'@'localhost' IDENTIFIED BY 'StrongAppPassword2026!';

// 授权(只给必要权限)
GRANT ALL PRIVILEGES ON wp_database.* TO 'wp_user'@'localhost';

// 如果需要远程访问(不推荐,仅限开发环境)
CREATE USER 'wp_user'@'%' IDENTIFIED BY 'StrongAppPassword2026!';
GRANT ALL PRIVILEGES ON wp_database.* TO 'wp_user'@'%';

FLUSH PRIVILEGES;
exit

3.4 MySQL核心性能调优

编辑MySQL配置文件:


// Ubuntu
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

// CentOS 7
sudo nano /etc/my.cnf

在 [mysqld] 段添加以下参数(适用于2核4G服务器):


[mysqld]
// 基础设置
bind-address = 127.0.0.1
port = 3306
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
default-time-zone = '+8:00'

// InnoDB缓冲池(设为物理内存的50-70%)
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 4

// InnoDB日志(提高写入性能)
innodb_log_file_size = 256M
innodb_log_buffer_size = 64M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT

// 连接管理
max_connections = 200
max_connect_errors = 100
wait_timeout = 600
interactive_timeout = 600

// 查询缓存(MySQL 8.0已移除query_cache,使用ProxySQL或应用层缓存)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

重启MySQL使配置生效:


sudo systemctl restart mysql

验证配置是否生效:


mysql -u root -p -e "SHOW VARIABLES LIKE 'innodb_buffer_pool_size';"
// 应显示 2147483648(2GB)

四、PostgreSQL 16 安装配置

4.1 Ubuntu 22.04 安装PostgreSQL


// 添加PostgreSQL官方源(获取最新版本)
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
curl -fsSL https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pgdg.gpg

// 更新并安装PostgreSQL 16
sudo apt update
sudo apt install -y postgresql-16 postgresql-client-16

// PostgreSQL会自动启动
sudo systemctl status postgresql

4.2 CentOS 7 安装PostgreSQL


// 安装PostgreSQL官方YUM源
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

// 安装PostgreSQL 16
sudo yum install -y postgresql16-server postgresql16

// 初始化数据库
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

// 启动并设置开机自启
sudo systemctl start postgresql-16
sudo systemctl enable postgresql-16

4.3 创建数据库和用户


// 切换到postgres系统用户
sudo -u postgres psql

// 创建应用用户
CREATE USER app_user WITH PASSWORD 'StrongAppPassword2026!';

// 创建数据库
CREATE DATABASE app_database OWNER app_user ENCODING 'UTF8' LC_COLLATE 'en_US.UTF-8' LC_CTYPE 'en_US.UTF-8';

// 授权
GRANT ALL PRIVILEGES ON DATABASE app_database TO app_user;

// 退出
\q

4.4 PostgreSQL核心性能调优

编辑配置文件:


// Ubuntu
sudo nano /etc/postgresql/16/main/postgresql.conf

// CentOS 7
sudo nano /var/lib/pgsql/16/data/postgresql.conf

在文件中修改或添加以下参数(适用于2核4G服务器):


// 连接设置
listen_addresses = 'localhost'
port = 5432
max_connections = 100

// 内存设置(PostgreSQL的内存管理是核心)
shared_buffers = 1GB          // 物理内存的25%
effective_cache_size = 3GB    // 物理内存的75%
work_mem = 16MB               // 每个查询的排序/哈希内存
maintenance_work_mem = 256MB  // VACUUM/CREATE INDEX用

// WAL日志(Write-Ahead Logging)
wal_buffers = 64MB
checkpoint_completion_target = 0.9
max_wal_size = 2GB
min_wal_size = 1GB

// 查询优化
random_page_cost = 1.1        // SSD设为1.1(HDD默认4.0)
effective_io_concurrency = 200 // SSD设为200

// 日志
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d.log'
log_min_duration_statement = 1000  // 记录超过1秒的慢查询
log_statement = 'ddl'              // 记录所有DDL操作

重启PostgreSQL:


// Ubuntu
sudo systemctl restart postgresql

// CentOS 7
sudo systemctl restart postgresql-16

验证配置:


sudo -u postgres psql -c "SHOW shared_buffers;"
// 应显示 1GB

4.5 配置pg_hba.conf(访问控制)


// Ubuntu
sudo nano /etc/postgresql/16/main/pg_hba.conf

// CentOS 7
sudo nano /var/lib/pgsql/16/data/pg_hba.conf

在文件末尾添加(允许本地应用连接):


// 允许本地TCP连接(应用通过127.0.0.1连接)
host    all    all    127.0.0.1/32    scram-sha-256

// 如果需要远程连接(仅限内网IP,不要开放到公网)
// host    all    all    10.0.0.0/8    scram-sha-256

重启PostgreSQL使配置生效。

五、数据库自动备份

备份是数据库运维的生命线。以下是生产级自动备份方案:

5.1 MySQL自动备份脚本


sudo mkdir -p /var/backups/mysql
sudo nano /usr/local/bin/mysql-backup.sh

写入以下内容:


#!/bin/bash
// MySQL自动备份脚本(保留最近7天的备份)

BACKUP_DIR="/var/backups/mysql"
MYSQL_USER="backup_user"
MYSQL_PASS="BackupPass2026!"
DATE=$(date +%Y%m%d_%H%M%S)

// 创建备份用户(首次运行时执行一次)
// mysql -u root -p -e "CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'BackupPass2026!'; GRANT SELECT, SHOW VIEW, TRIGGER, LOCK TABLES, RELOAD, PROCESS, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost'; FLUSH PRIVILEGES;"

// 备份所有数据库
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases --single-transaction --routines --triggers --events | gzip > $BACKUP_DIR/all_databases_$DATE.sql.gz

// 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

echo "[$(date)] MySQL backup completed: all_databases_$DATE.sql.gz"

设置执行权限并添加定时任务:


sudo chmod +x /usr/local/bin/mysql-backup.sh

// 每天凌晨3点执行备份
sudo crontab -e
// 添加:
0 3 * * * /usr/local/bin/mysql-backup.sh >> /var/log/mysql-backup.log 2>&1

5.2 PostgreSQL自动备份脚本


sudo mkdir -p /var/backups/postgresql
sudo nano /usr/local/bin/pg-backup.sh

写入以下内容:


#!/bin/bash
// PostgreSQL自动备份脚本(保留最近7天的备份)

BACKUP_DIR="/var/backups/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)

// 备份所有数据库
sudo -u postgres pg_dumpall | gzip > $BACKUP_DIR/all_databases_$DATE.sql.gz

// 也可以单独备份某个数据库
// sudo -u postgres pg_dump app_database | gzip > $BACKUP_DIR/app_database_$DATE.sql.gz

// 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete

echo "[$(date)] PostgreSQL backup completed: all_databases_$DATE.sql.gz"

设置执行权限并添加定时任务:


sudo chmod +x /usr/local/bin/pg-backup.sh

// 每天凌晨3点执行备份
sudo crontab -e
// 添加:
0 3 * * * /usr/local/bin/pg-backup.sh >> /var/log/pg-backup.log 2>&1

5.3 备份恢复测试

备份不测试等于没有备份。以下是恢复验证步骤:


// MySQL恢复测试
gunzip < /var/backups/mysql/all_databases_20260903_030000.sql.gz | mysql -u root -p

// PostgreSQL恢复测试
gunzip < /var/backups/postgresql/all_databases_20260903_030000.sql.gz | sudo -u postgres psql

🚀 通过 5.chengzicloud.cloud 购买阿里云国际版或AWS,均支持云快照自动备份,与本地脚本形成双重保障。

六、安全加固

数据库暴露在公网上是最常见的安全事故根源。以下是从系统层到数据库层的完整安全加固:

6.1 网络层隔离


// MySQL默认只监听本地(确认配置)
grep "bind-address" /etc/mysql/mysql.conf.d/mysqld.cnf
// 应显示:bind-address = 127.0.0.1

// PostgreSQL同理
grep "listen_addresses" /etc/postgresql/16/main/postgresql.conf
// 应显示:listen_addresses = 'localhost'

绝对不要将数据库端口(3306/5432)开放到公网。如果应用和数据库不在同一台服务器,通过SSH隧道或VPC内网连接。

6.2 防火墙配置


// Ubuntu(ufw)
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw enable

// CentOS 7(firewalld)
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --reload

// 不要开放3306和5432端口!

6.3 MySQL安全加固


// 删除匿名用户
mysql -u root -p -e "DELETE FROM mysql.user WHERE User='';"

// 禁止远程root登录
mysql -u root -p -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');"

// 删除测试数据库
mysql -u root -p -e "DROP DATABASE IF EXISTS test; DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%';"

// 刷新权限
mysql -u root -p -e "FLUSH PRIVILEGES;"

6.4 PostgreSQL安全加固


// 确认pg_hba.conf使用scram-sha-256认证(而非trust或md5)
grep -v "^#" /etc/postgresql/16/main/pg_hba.conf | grep -v "^$"
// 确保看到 scram-sha-256,不要看到 trust

6.5 定期安全更新


// Ubuntu
sudo apt update && sudo apt upgrade -y

// CentOS 7
sudo yum update -y

七、性能监控与诊断

7.1 MySQL监控


// 查看当前连接和运行中的查询
mysql -u root -p -e "SHOW PROCESSLIST;"

// 查看InnoDB状态
mysql -u root -p -e "SHOW ENGINE INNODB STATUS\G"

// 查看慢查询统计
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';"

// 查看缓冲池命中率(应大于99%)
mysql -u root -p -e "SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';"

7.2 PostgreSQL监控


// 查看当前活跃连接
sudo -u postgres psql -c "SELECT pid, usename, application_name, state, query_start, left(query, 80) FROM pg_stat_activity WHERE state = 'active';"

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

// 查看表膨胀(dead tuples占比)
sudo -u postgres psql -c "SELECT schemaname, relname, n_dead_tup, n_live_tup, round(n_dead_tup::numeric / NULLIF(n_live_tup, 0) * 100, 2) AS dead_pct FROM pg_stat_user_tables WHERE n_dead_tup > 1000 ORDER BY n_dead_tup DESC LIMIT 10;"

// 手动触发VACUUM清理
sudo -u postgres psql -c "VACUUM VERBOSE ANALYZE;"

7.3 一键监控脚本


sudo nano /usr/local/bin/db-monitor.sh

#!/bin/bash
// 数据库状态一键检查脚本

echo "=== 系统资源 ==="
free -h
echo ""
df -h /
echo ""

echo "=== MySQL状态 ==="
mysql -u root -p'YourRootPassword' -e "SHOW GLOBAL STATUS LIKE 'Threads_connected';" 2>/dev/null | tail -1
mysql -u root -p'YourRootPassword' -e "SHOW GLOBAL STATUS LIKE 'Slow_queries';" 2>/dev/null | tail -1
echo ""

echo "=== PostgreSQL状态 ==="
sudo -u postgres psql -c "SELECT count(*) AS connections FROM pg_stat_activity;" 2>/dev/null
sudo -u postgres psql -c "SELECT pg_size_pretty(pg_database_size('postgres'));" 2>/dev/null
echo ""
echo "=== 检查完成 ==="

sudo chmod +x /usr/local/bin/db-monitor.sh

八、常见问题 FAQ

Q:MySQL和PostgreSQL可以同时安装在同一台服务器上吗?

A:可以,但不推荐。两个数据库会争抢内存和CPU资源,且分别监听3306和5432端口,管理复杂度翻倍。除非有特殊需求(比如一个跑WordPress,一个跑PostGIS应用),否则选一个就够了。如果确实需要同时运行,确保服务器内存至少4GB,并分别为两个数据库设置合理的内存上限。

Q:数据库数据目录磁盘快满了怎么办?

A:首先检查慢查询日志和Binlog/WAL日志占用了多少空间。MySQL执行 PURGE BINARY LOGS BEFORE '2026-08-01 00:00:00'; 清理旧Binlog。PostgreSQL执行 SELECT pg_switch_wal(); 并确认 archive_command 已处理旧WAL文件。然后清理测试数据和临时表。长期方案:配置日志轮转和自动清理策略。

Q:数据库被攻击了怎么办?发现大量异常连接。

A:立即执行 SHOW PROCESSLIST(MySQL)或 SELECT * FROM pg_stat_activity(PostgreSQL)查看来源IP,KILL异常连接。修改root密码,检查 bind-address 是否误设为 0.0.0.0,检查防火墙是否放行了3306/5432。安装fail2ban封禁暴力破解IP。参考本站的《网站安全加固专题》做全面防护。

Q:备份文件太大,磁盘空间不够怎么办?

A:使用gzip压缩(上面脚本已包含),100MB的SQL文件压缩后通常只有10-20MB。设置保留天数(脚本默认7天),自动删除旧备份。考虑使用rclone将备份同步到阿里云OSS或AWS S3异地存储,详见本站的《数据备份与容灾恢复》教程。

Q:如何实现MySQL主从复制?

A:在从服务器配置 server-id=2,执行 CHANGE MASTER TO MASTER_HOST='主服务器IP', MASTER_USER='repl_user', MASTER_PASSWORD='ReplPass2026!', MASTER_AUTO_POSITION=1;,然后 START SLAVE;,用 SHOW SLAVE STATUS\G 确认 Slave_IO_Running 和 Slave_SQL_Running 均为Yes。详细步骤可参考本站的《Redis缓存服务器搭建》中的主从复制章节,原理类似。

Q:PostgreSQL连接数满了,新连接被拒绝。

A:默认 max_connections=100,应用连接池配置不当容易耗尽。先用 SELECT count(*) FROM pg_stat_activity; 查看当前连接数,然后 pg_terminate_backend(pid) 终止空闲连接。长期方案:增加 max_connections(需要同步增加 shared_buffers 和操作系统 ulimit -n),或在应用端使用PgBouncer连接池。

Q:Ubuntu和CentOS 7选哪个系统?

A:2026年强烈推荐Ubuntu 22.04 LTS。CentOS 7已于2024年6月30日停止维护(EOL),虽然部分云厂商仍提供镜像,但安全更新已停止,存在严重安全风险。Ubuntu 22.04 LTS支持到2027年,软件包更新及时,社区活跃。如果现有服务器是CentOS 7,建议尽快迁移到Ubuntu 22.04或AlmaLinux 9。

九、总结

用海外云服务器搭建MySQL或PostgreSQL数据库服务器,是所有Web项目的基础。本文从选型对比、安装配置、性能调优、自动备份到安全加固,提供了完整的操作步骤。对于大多数项目,MySQL 8.0是更稳妥的选择——生态成熟、配置简单;如果你需要JSONB、GIS或向量搜索等高级功能,PostgreSQL 16是更好的选择。

延伸阅读:

本文由 5.chengzicloud.cloud 提供,点击访问首页了解更多海外云服务器部署方案和专属优惠。