在云主机上自建数据库,指的是自行在云服务器(如阿里云ECS、腾讯云CVM、华为云HECS等)上安装、配置、维护数据库软件,这种方式相比云厂商提供的托管数据库服务(如RDS),拥有更高的自主控制权,但需要自行负责运维、备份和安全。
以下是一套标准、安全的自建数据库设置流程,以最常见的MySQL/MariaDB 为例(PostgreSQL、SQL Server等类似),涵盖安装、安全配置、远程连接、基础优化和备份。
1、选择操作系统:推荐使用主流的 Linux 发行版,如 CentOS 7/8、Ubuntu 20.04/22.04、Debian 11/12,Windows Server不建议用于生产环境,除非有特定依赖。
2、连接云主机:通过 SSH(Windows 用户可用 Xshell/Putty,macOS/Linux 用户直接终端)连接到你的云主机。
3、安装数据库软件:
以 Ubuntu/Debian 为例安装 MySQL 8.0:
sudo apt update
sudo apt install mysql-server -y以 CentOS/RHEL 为例安装 MariaDB 10.5:
sudo yum install epel-release -y
sudo yum install mariadb-server mariadb -y- 安装完成后,启动服务并设为开机自启:
sudo systemctl start mysqld # MySQL
sudo systemctl start mariadb # MariaDB
sudo systemctl enable mysqld # 或 mariadb刚安装的数据库存在默认空密码和匿名账户等风险,必须立即执行安全脚本:
sudo mysql_secure_installation
按提示操作:
- 设置 root 密码(务必强密码,包含大小写、数字、特殊字符)。
- 移除匿名用户:Remove anonymous users? [Y/n] y
- 禁止 root 远程登录:Disallow root login remotely? [Y/n] y(重要!)
- 移除测试数据库:Remove test database and access to it? [Y/n] y
- 重新加载权限表:Reload privilege tables now? [Y/n] y
禁止使用 root 用户进行远程操作,你需要创建一个普通用户并授权。
1、登录 MySQL/MariaDB(使用刚设置的 root 密码):
sudo mysql -u root -p2、创建数据库:
CREATE DATABASEyour_db_name DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;3、创建用户并授权远程访问:
-- 创建一个用户,允许从任何IP连接(%表示所有IP,可替换为特定IP如 '192.168.1.%')
CREATE USER 'your_user'@'%' IDENTIFIED BY 'StrongPassword!123';
-- 授予该用户对你创建的数据库的所有权限
GRANT ALL PRIVILEGES ONyour_db_name.* TO 'your_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;4、退出:\q
云主机默认配置可能只允许本地访问。
1、修改数据库配置文件:
MySQL:sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf 或sudo vi /etc/mysql/my.cnf
MariaDB:sudo vi /etc/my.cnf.d/server.cnf
- 找到bind-address = 127.0.0.1 这一行,将其修改为:
bind-address = 0.0.0.0 或者直接注释掉这一行(#bind-address = ...),这表示数据库监听所有网卡,允许远程连接。
2、重启数据库服务:sudo systemctl restart mysqld(或mariadb)
3、配置云主机安全组(最重要!):
- 登录云厂商控制台(阿里云/腾讯云/华为云等)。
- 找到你的云主机实例,点击“管理” -> “安全组”。
- 添加入方向规则:
端口:3306(MySQL/MariaDB默认端口)
授权对象:强烈建议不要设为0.0.0.0/0(允许所有IP),应该设为:
特定IP:如你的办公公网IP或应用服务器IP,形如123.123.123.123/32。
内网IP段:如果你的应用也在同一云厂商的其他主机上,使用内网IP段(如172.16.0.0/12)更安全、速度更快。
- 协议:TCP
- 策略:允许
为什么不能开放0.0.0.0/0? 因为数据库端口会立刻被全球的扫描器发现并尝试暴力破解密码,极不安全。
4、配置操作系统防火墙(如果开启):
- Ubuntu:sudo ufw allow from <你的IP> to any port 3306
- CentOS:sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<你的IP>" port port="3306" protocol="tcp" accept' 然后firewall-cmd --reload
在本地电脑(云主机外部)使用数据库客户端工具测试:
- 命令行(需安装mysql客户端):mysql -h <你的云主机公网IP> -P 3306 -u your_user -p
- 图形化工具: Navicat、DBeaver、Workbench、HeidiSQL 等。
如果连接失败,请按顺序检查:
1. 安全组规则是否已添加(云厂商控制台允许需要1-2分钟生效)。
2. 操作系统防火墙(ufw 或firewalld)是否放行3306端口。
3. 数据库配置文件中bind-address 是否已改为0.0.0.0。
4. 用户权限是否已正确授权(GRANT 语句执行无误)。
5. 云主机的网卡IP地址是否正确(注意区分公网和内网IP)。
编辑数据库配置文件(位置同上),在[mysqld] 部分下添加或修改以下参数(根据云主机内存调整):
基础优化(内存为2G-4G的云主机示例) innodb_buffer_pool_size = 1G # 一般设为物理内存的50%-70% innodb_log_file_size = 256M # 提高写入性能 max_connections = 200 # 避免连接数过大耗尽内存 character-set-server = utf8mb4 # 统一字符集 collation-server = utf8mb4_unicode_ci 慢查询日志(排查性能问题) slow_query_log = 1 slow_query_log_file = /var/log/mysql/mysql-slow.log long_query_time = 2
修改后重启数据库:sudo systemctl restart mysqld
自建数据库最重要的一点:必须建立自动备份。
1、最简单的定时脚本(示例使用mysqldump):
# 创建备份目录
sudo mkdir -p /data/backup/mysql
# 编写脚本 /usr/local/bin/backup_mysql.sh
#!/bin/bash
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
mysqldump -u root -p'YourDBRootPassword' --all-databases --single-transaction --routines --triggers --events | gzip > /data/backup/mysql/full_backup_$TIMESTAMP.sql.gz2、设置定时任务:crontab -e
# 每天凌晨2点备份
0 2 * * * /bin/bash /usr/local/bin/backup_mysql.sh3、异地备份:建议将备份文件通过rsync 或scp 传输到另外一台服务器或对象存储(如阿里云OSS、腾讯云COS)上,防止云主机故障后数据丢失。
安全第一:永远不要将数据库的 root 密码、应用密码硬编码在代码中,使用环境变量或密钥管理服务。
SSL加密:对于互联网上的数据库连接,强烈建议开启 SSL/TLS 加密,防止数据在传输中被窃听,步骤略复杂,可参考官方文档或云厂商文档。
性能监控:安装prometheus、grafana 或使用云厂商的云监控来监控数据库的CPU、内存、连接数、慢查询等情况。
替代方案:如果你不想投入精力进行上述所有运维工作(备份、监控、高可用、打补丁),建议直接使用云厂商的RDS(托管数据库服务),虽然价格稍高,但免去了大量运维成本和数据丢失风险,对于生产环境通常是更优选择。
按照以上步骤,你就能在云主机上搭建一个可用、安全、有一定性能保障的自建数据库了。
文章摘自:https://idc.huochengrm.cn/zj/27010.html
评论
析倩秀
回复云主机自建数据库设置需先安装数据库软件,配置用户权限,设置安全组规则,确保数据备份与恢复机制,优化性能参数,实现数据库的高效稳定运行。