CentOS 7 搭建 MariaDB 数据库服务
1. 服务介绍
MariaDB 是兼容 MySQL 协议的关系型数据库,可集中存储、查询和管理结构化数据,常用于 Web 应用、WordPress、监控平台和认证系统。本实验安装 MariaDB,迁移数据与日志目录,配置远程管理账号,并完成建库、建表、数据导入和自动备份。
2. 准备运行环境
本实验使用以下环境:
| 角色 | IP 地址 | 用途 |
| --- | --- | --- |
| MariaDB 服务端 | 10.1.100.101 | 运行数据库服务 |
| 测试客户端 | 10.1.100.50 | 验证远程连接 |
• 操作系统:CentOS 7.x。
• 操作账号:root 或具备 sudo 权限的管理员。
• 软件源:YUM 可用。
• 磁盘:/data 所在文件系统有足够空间。
• 网络:客户端可访问服务端 TCP 3306 端口。
开始前检查环境:
bash
cat /etc/centos-release
uname -r
ip addr
df -h /data
ping -c 3 10.1.100.50
3. 相关知识
• MariaDB 默认监听 TCP 3306;本地客户端也可通过 Unix Socket 连接。
• 迁移数据目录必须先停止服务,并保留原目录备份;直接移动运行中的数据文件可能造成损坏。
• skip_name_resolve=ON 可减少反向 DNS 查询,但授权账号必须使用 IP 或网段,不能依赖主机名。
• innodb_file_per_table=OFF 会让 InnoDB 表共享系统表空间,删除数据后磁盘空间不容易直接回收。该设置用于复现实验要求,新环境通常保持默认开启。
• 远程访问要同时检查监听地址、数据库授权、防火墙和 SELinux 标签。
• 数据库备份只有经过恢复测试才算有效;生产环境还应设置异机保存、保留周期和备份告警。
• 不建议开放 root 远程登录,应创建独立管理账号并限制来源网段。
4. 实验步骤
4.1 安装并初始化 MariaDB
bash
yum install -y mariadb mariadb-server rsync policycoreutils-python
systemctl enable --now mariadb
mysql_secure_installation
按提示设置 root 密码、删除匿名账号、禁止 root 远程登录、删除测试数据库并刷新权限。
4.2 迁移数据库存储目录
先停止服务,再复制原数据目录:
bash
systemctl stop mariadb
mkdir -p /data/database
rsync -aHAX /var/lib/mysql/ /data/database/
chown -R mysql:mysql /data/database
保留原目录备份,确认新目录启动正常后再决定是否清理:
bash
mv /var/lib/mysql /var/lib/mysql.backup
为新目录设置 SELinux 数据库标签:
bash
semanage fcontext -a -t mysqld_db_t '/data/database(/.*)?'
restorecon -Rv /data/database
4.3 配置数据库参数
备份配置文件:
bash
cp -a /etc/my.cnf.d/server.cnf /etc/my.cnf.d/server.cnf.bak
mkdir -p /data/log/mariadb
chown -R mysql:mysql /data/log/mariadb
semanage fcontext -a -t mysqld_log_t '/data/log/mariadb(/.*)?'
restorecon -Rv /data/log/mariadb
编辑 /etc/my.cnf.d/server.cnf,在 [mysqld] 段加入:
ini
[mysqld]
datadir=/data/database
socket=/data/database/mysql.sock
innodb_file_per_table=OFF
skip_name_resolve=ON
bind-address=0.0.0.0
log-error=/data/log/mariadb/mariadb.log
[client]
socket=/data/database/mysql.sock
启动服务并检查状态:
bash
systemctl start mariadb
systemctl status mariadb --no-pager
4.4 配置防火墙
只允许实验网段访问 TCP 3306:
bash
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=10.1.100.0/24 port port=3306 protocol=tcp accept'
firewall-cmd --reload
firewall-cmd --list-rich-rules
4.5 创建数据库、表和测试数据
登录数据库:
bash
mysql -uroot -p
执行以下 SQL:
sql
CREATE DATABASE userdb DEFAULT CHARACTER SET utf8mb4;
USE userdb;
CREATE TABLE users (
id INT UNSIGNED NOT NULL AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
PRIMARY KEY (id),
UNIQUE KEY uk_username (username)
) ENGINE=InnoDB;
INSERT INTO users (username, email) VALUES
('alice', 'alice@example.com'),
('bob', 'bob@example.com');
SELECT * FROM users;
4.6 从 SQL 文件导入数据
创建 /tmp/userdb_data.sql:
sql
USE userdb;
INSERT INTO users (username, email) VALUES
('carol', 'carol@example.com'),
('david', 'david@example.com');
执行导入:
bash
mysql -uroot -p < /tmp/userdb_data.sql
mysql -uroot -p -e 'SELECT * FROM userdb.users;'
4.7 创建远程管理账号
在 MariaDB 中创建仅允许实验网段登录的管理账号:
sql
CREATE USER 'dbadmin'@'10.1.100.%' IDENTIFIED BY 'ChangeThis_StrongPassword!';
GRANT ALL PRIVILEGES ON userdb.* TO 'dbadmin'@'10.1.100.%';
FLUSH PRIVILEGES;
SHOW GRANTS FOR 'dbadmin'@'10.1.100.%';
生产环境应按业务库和操作类型进一步缩小权限,不要长期授予全库管理权限。
4.8 配置自动备份
创建备份目录和脚本 /usr/local/sbin/backup_mariadb.sh:
bash
mkdir -p /data/backup/mariadb
cat > /usr/local/sbin/backup_mariadb.sh <<'EOF'
#!/bin/bash
set -e
BACKUP_DIR=/data/backup/mariadb
STAMP=$(date +%F_%H%M%S)
mysqldump --single-transaction --routines --events -uroot -p'RootPassword' userdb | gzip > "$BACKUP_DIR/userdb_$STAMP.sql.gz"
find "$BACKUP_DIR" -type f -name 'userdb_*.sql.gz' -mtime +7 -delete
EOF
chmod 700 /usr/local/sbin/backup_mariadb.sh
生产环境不要把密码直接写进脚本。可把凭据放入权限为 600 的客户端配置文件,再由备份账号执行。
每天凌晨 2:30 执行备份:
bash
cat > /etc/cron.d/mariadb_backup <<'EOF'
30 2 * * * root /usr/local/sbin/backup_mariadb.sh >> /var/log/mariadb_backup.log 2>&1
EOF
5. 验证结果
5.1 服务端验证
检查服务、监听端口、数据目录和运行参数:
bash
systemctl status mariadb --no-pager
ss -lntp | grep ':3306'
mysql -uroot -p -e 'SELECT VERSION();'
mysql -uroot -p -e "SHOW VARIABLES LIKE 'datadir';"
mysql -uroot -p -e "SHOW VARIABLES LIKE 'socket';"
mysql -uroot -p -e "SHOW VARIABLES LIKE 'innodb_file_per_table';"
mysql -uroot -p -e "SHOW VARIABLES LIKE 'skip_name_resolve';"
mysql -uroot -p -e 'SELECT * FROM userdb.users;'
journalctl -u mariadb -n 50 --no-pager
tail -n 50 /data/log/mariadb/mariadb.log
5.2 客户端验证
在 10.1.100.50 安装客户端并远程连接:
bash
yum install -y mariadb
mysql -h 10.1.100.101 -u dbadmin -p -e 'SELECT * FROM userdb.users;'
客户端能够查询测试数据,说明监听地址、防火墙和账号授权均已生效。
5.3 备份与恢复验证
手动执行一次备份并检查文件:
bash
/usr/local/sbin/backup_mariadb.sh
ls -lh /data/backup/mariadb
gzip -t /data/backup/mariadb/userdb_*.sql.gz
将最新备份恢复到测试数据库:
bash
mysql -uroot -p -e 'CREATE DATABASE userdb_restore DEFAULT CHARACTER SET utf8mb4;'
zcat /data/backup/mariadb/userdb_*.sql.gz | mysql -uroot -p userdb_restore
mysql -uroot -p -e 'SELECT COUNT(*) FROM userdb_restore.users;'
服务正常、客户端远程查询成功、数据目录和日志目录符合配置,并且备份可以恢复,说明 MariaDB 服务配置完成。