MariaDB背景介绍
全称:Maria Database(MariaDB)
类型:关系型数据库管理系统(RDBMS)
特点:几乎完全兼容 MySQL,免费开源
📖 历史由来(简短版)
1995:瑞典人 Monty 开发 MySQL(名字取自大女儿 My)
2010:Oracle 收购 MySQL,社区担心被封闭
同年:Monty 带团队分叉出 MariaDB(取自小女儿 Maria 的名字),保证开源
现在:MariaDB 被很多 Linux 系统默认替代 MySQL
一句话总结:
👉 MariaDB 就是 MySQL 的“妹妹”,没被收购,更自由、更开源,功能基本一样。
✨ 类比一句话
Oracle Database = 豪华旗舰款,强大但贵。
MySQL = 原本的开源明星,现在归 Oracle 管。
MariaDB = MySQL 的“开源妹妹”,不受 Oracle 控制。
CentOS 7 部署 MariaDB 10.3.38 安装手册(避开 Oracle 19c 路径)
一、前置准备
本手册适用于在 CentOS 7 上安装 MariaDB 10.3.38,且同一台服务器上已经安装了 Oracle 19c。
为避免冲突,必须确保 MariaDB 的数据、日志目录与 Oracle 路径完全隔离。
1. 检查系统版本
命令:
cat /etc/centos-release #发行版
uname -r #内核版本
系统发行版:Red Hat Enterprise Linux 7(兼容 CentOS 7)
内核版本:3.10.0-1160.119.1.el7.x86_64
2. 检查网络连通性
命令:
yum install -y iputils #安装 ping 工具(在 RHEL7/CentOS7 上属于 iputils
包)
ping -c 4 mirrors.aliyun.com
ping yum.mariadb.org #ping 阿里云 → 确认网络没问题(常用、稳定)
curl -I http://yum.mariadb.org/10.3/centos7-amd64 #ping MariaDB 官网 → 确认能访问官方仓库(安装必备)
#curl -I 的作用是 只显示响应头,不是真正下载东西。你看到 Location: 行,就说明 yum.mariadb.org 正常可用,会把你跳到官方镜像 mirror.mariadb.org。
完美 ✅
你的 RHEL7 服务器现在 已经能正常访问外网,网络没问题:
mirrors.aliyun.com
延迟稳定 ~53ms0% 丢包
这就意味着:
👉 你完全可以走 联网一键安装 MariaDB 10.3.38 的方式,不需要搞离线包。
能 ping 通 → 联网安装;不能 → 离线安装。
3. Oracle 19c 默认目录(必须避开)
/u01/app/oracle
/u01/app/oracle/oradata
/etc/oratab
MariaDB 目录建议使用:
/data/mariadb/mysql (数据目录)
/data/mariadb/logs (日志目录)
二、联网安装方式
1.复制脚本代码
#!/bin/bash
# ==========================================================
# MariaDB 10.6.18 一键安装脚本(适用于 CentOS 7 / RHEL 7 系列)
# 适用的 Linux 版本:
# - CentOS 7.x / RHEL 7.x / Oracle Linux 7.x
# - Rocky/AlmaLinux 7.x(兼容 RHEL7)
#
# 设计目标:
# 1) 联网安装 MariaDB 10.6,优先精确安装到 10.6.18(LTS 分支中的稳定版本)
# 2) 自动将数据目录迁移到 /data/mariadb/,避开 Oracle 19c 的 /u01/app/oracle
# 3) 创建允许“任意 IP(%)”远程连接的管理账号 admin(Navicat 直接可连)
# 4) 开放 3306 防火墙端口,监听 0.0.0.0
# 5) 带有“主仓库 → 归档仓库”的自动回退机制;带有“精确版本可用性检测”
# 6) 可重复执行、失败即停,避免半拉子
# ==========================================================
# ---------- 安全/健壮性设置:任何一步失败立即退出,未定义变量当错误处理 ----------
set -euo pipefail
trap 'echo "[ERROR] 第 $LINENO 行执行失败,脚本已中止。" >&2' ERR
# ---------- 基础变量(按需改) ----------
MARIADB_MAJOR="10.6" # 大版本号(10.6 分支)
MARIADB_FULL="10.6.18" # 期望的小版本(优先安装到这个精确版本)
REPO_PRIMARY="http://archive.mariadb.org/mariadb-10.6.18/yum/centos7-amd64" # 官方主仓库,官网链接
REPO_ARCHIVE="http://archive.mariadb.org/mariadb-10.6.18/yum/centos7-amd64" # 归档仓库(兜底)
DATA_DIR="/data/mariadb/mysql" # 数据目录(避开 /u01/app/oracle)
LOG_DIR="/data/mariadb/logs" # 日志目录
SOCK_PATH="${DATA_DIR}/mysql.sock" # socket 文件路径
ROOT_PASSWORD="Root@123" # 本地 root 口令(只允许 localhost)
REMOTE_USER="admin" # 远程管理账号(Navicat 用)
REMOTE_PASS="Admin@123" # 远程管理账号密码
ALLOW_ALL_IP="%" # 允许所有 IP,生产建议改网段如 '10.13.%'
FIREWALL_PORT="3306" # 监听端口
# ---------- 前置检查 ----------
# 1) 必须 root 执行
if [[ $EUID -ne 0 ]]; then
echo "[FATAL] 请用 root 账号执行本脚本。" >&2
exit 1
fi
# 2) 粗略判断系统为 RHEL7/CentOS7/兼容发行版
if ! grep -Eiq "release 7" /etc/redhat-release 2>/dev/null; then
echo "[WARN] 检测到系统可能不是 7 系列,脚本主要针对 RHEL7/CentOS7。继续执行可能需要你手动调整。" >&2
fi
echo ">>> [1/16] 卸载系统自带的 MariaDB(若存在,避免冲突)"
yum remove -y mariadb mariadb-server mariadb-libs || true
echo ">>> [2/16] 写入 MariaDB 官方 Yum 源(优先主仓库,后续可能自动切到归档仓库)"
# 说明:先写主仓库地址;若检测失败会自动改写为归档仓库再重试
cat > /etc/yum.repos.d/MariaDB.repo <<EOF
[mariadb]
name = MariaDB
baseurl = ${REPO_PRIMARY}
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
EOF
echo ">>> [3/16] 安装辅助工具(用于版本检测),并预热元数据缓存"
yum install -y yum-utils >/dev/null 2>&1 || true # 提供 repoquery(部分环境用得到)
yum clean all
yum makecache
# ---------- 仓库可用性与“精确版本 10.6.18”可用性检测 ----------
echo ">>> [4/16] 检测主仓库可用性与 10.6.18 是否存在(showduplicates)"
EXACT_AVAILABLE=0
LIST_OK=0
# 使用 --showduplicates 列出可用版本;若失败,再切归档仓库
if yum --disablerepo='*' --enablerepo=mariadb list MariaDB-server --showduplicates >/tmp/mariadb_versions.txt 2>/dev/null; then
LIST_OK=1
elif true; then
echo "[WARN] 主仓库不可用或无列表,切换到归档仓库:${REPO_ARCHIVE}"
sed -i "s|^baseurl = .*|baseurl = ${REPO_ARCHIVE}|" /etc/yum.repos.d/MariaDB.repo
yum clean all
yum makecache
if yum --disablerepo='*' --enablerepo=mariadb list MariaDB-server --showduplicates >/tmp/mariadb_versions.txt 2>/dev/null; then
LIST_OK=1
fi
fi
if [[ "${LIST_OK}" -eq 1 ]] && grep -q "${MARIADB_FULL}" /tmp/mariadb_versions.txt; then
EXACT_AVAILABLE=1
fi
# ---------- 根据检测结果决定安装策略 ----------
echo ">>> [5/16] 安装 MariaDB(优先精确 10.6.18;不可用则安装 10.6 分支当前可用版本)"
if [[ "${EXACT_AVAILABLE}" -eq 1 ]]; then
echo "[INFO] 检测到仓库中存在 MariaDB-server-${MARIADB_FULL},执行精确版本安装。"
yum install -y MariaDB-server-${MARIADB_FULL}* MariaDB-client-${MARIADB_FULL}*
else
echo "[WARN] 仓库中找不到精确版本 ${MARIADB_FULL},将安装 10.6 分支当前可用版本。"
echo " 如必须使用 ${MARIADB_FULL},请检查企业镜像或本地离线 RPM 仓库。"
yum install -y MariaDB-server MariaDB-client
fi
echo ">>> [6/16] 停止 MariaDB 服务(准备迁移数据目录)"
systemctl stop mariadb || true
echo ">>> [7/16] 创建数据/日志目录,并授予 mysql 账户(避开 /u01/app/oracle)"
mkdir -p "${DATA_DIR}" "${LOG_DIR}"
chown -R mysql:mysql /data/mariadb
# 可选:创建默认 socket 兼容链接,防止某些工具死盯 /var/lib/mysql/mysql.sock
mkdir -p /var/lib/mysql || true
if [[ ! -e /var/lib/mysql/mysql.sock ]]; then
ln -s "${SOCK_PATH}" /var/lib/mysql/mysql.sock 2>/dev/null || true
fi
echo ">>> [8/16] 生成/覆盖服务端配置(监听所有网卡 + 指定新数据目录 + 优化项)"
cat > /etc/my.cnf.d/server.cnf <<EOF
[mysqld]
datadir=${DATA_DIR}
socket=${SOCK_PATH}
log-error=${LOG_DIR}/mariadb.log
pid-file=${DATA_DIR}/mariadb.pid
port=${FIREWALL_PORT}
bind-address=0.0.0.0 # 允许外部访问(配合防火墙)
skip_name_resolve=1 # 禁止反向 DNS,加快连接
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
innodb_file_per_table=1
[client]
socket=${SOCK_PATH}
default-character-set=utf8mb4
EOF
echo ">>> [9/16] 迁移默认数据目录到新位置(若为首次安装会有系统表)"
mv /var/lib/mysql/* "${DATA_DIR}/" 2>/dev/null || true
chown -R mysql:mysql "${DATA_DIR}"
# 极少数情况下目录仍为空,则手动初始化系统表(MariaDB 10.6 推荐 mariadb-install-db)
if [[ -z "$(ls -A "${DATA_DIR}" 2>/dev/null || true)" ]]; then
echo ">>> 检测到数据目录为空,执行初始化系统表"
if command -v mariadb-install-db >/dev/null 2>&1; then
mariadb-install-db --user=mysql --datadir="${DATA_DIR}" --basedir=/usr
elif command -v mysql_install_db >/dev/null 2>&1; then
mysql_install_db --user=mysql --datadir="${DATA_DIR}" --basedir=/usr
else
echo "[FATAL] 未找到 mariadb-install-db / mysql_install_db 工具,无法初始化系统表。" >&2
exit 1
fi
fi
# ---------- SELinux 兼容(若 Enforcing,则给新目录打正确的安全上下文) ----------
if command -v getenforce >/dev/null 2>&1 && [[ "$(getenforce)" == "Enforcing" ]]; then
echo ">>> [10/16] SELinux Enforcing 模式:设置 /data/mariadb 安全上下文"
yum install -y policycoreutils-python >/dev/null 2>&1 || true
semanage fcontext -a -t mysqld_db_t "${DATA_DIR}(/.*)?" 2>/dev/null || true
semanage fcontext -a -t mysqld_log_t "${LOG_DIR}(/.*)?" 2>/dev/null || true
restorecon -Rv "${DATA_DIR}" "${LOG_DIR}" >/dev/null 2>&1 || true
fi
echo ">>> [11/16] 启动并设为开机自启"
systemctl daemon-reload || true
systemctl start mariadb
systemctl enable mariadb
echo ">>> [12/16] 初始化安全:设 root 口令、清匿名用户、禁远程 root"
# 说明:
# - 统一设置 root@localhost 为密码认证
# - 删除匿名用户,禁止 root 远程(只保留本地 root)
mysql -uroot <<SQL
USE mysql;
ALTER USER 'root'@'localhost' IDENTIFIED VIA mysql_native_password USING PASSWORD('Root@123');
DELETE FROM mysql.global_priv WHERE User='' AND Host='%';
DELETE FROM mysql.global_priv WHERE User='root' AND Host!='localhost';
FLUSH PRIVILEGES;
SQL
echo ">>> [13/16] 创建远程管理账号(允许 ${ALLOW_ALL_IP})并授予权限"
# 注意:授予较高权限,生产可按需收敛
mysql -uroot -p"${ROOT_PASSWORD}" <<SQL
CREATE USER IF NOT EXISTS '${REMOTE_USER}'@'${ALLOW_ALL_IP}' IDENTIFIED BY '${REMOTE_PASS}';
GRANT ALL PRIVILEGES ON *.* TO '${REMOTE_USER}'@'${ALLOW_ALL_IP}' WITH GRANT OPTION;
FLUSH PRIVILEGES;
SQL
echo ">>> [14/16] 防火墙放行 ${FIREWALL_PORT}/tcp(无 firewalld 时自动跳过)"
if systemctl is-active firewalld >/dev/null 2>&1; then
firewall-cmd --permanent --add-port=${FIREWALL_PORT}/tcp
firewall-cmd --reload
else
echo "[INFO] 未检测到 firewalld 运行,跳过开放端口;若有外部防火墙,请手工放行 ${FIREWALL_PORT}/tcp。"
fi
echo ">>> [15/16] 安装版本锁插件并锁定当前已装版本(避免误升级)"
yum install -y yum-plugin-versionlock >/dev/null 2>&1 || true
yum versionlock MariaDB-server-* MariaDB-client-* >/dev/null 2>&1 || true
echo ">>> [16/16] 打印关键信息与连通性自检"
SERVER_IP=$(hostname -I | awk '{print $1}')
INSTALLED_PKG=$(rpm -q MariaDB-server || true)
echo "----------------------------------------------------------"
echo " MariaDB 已安装并运行!"
echo " - 安装包 : ${INSTALLED_PKG}"
echo " - 监听地址 : 0.0.0.0:${FIREWALL_PORT}"
echo " - 服务器 IP : ${SERVER_IP}"
echo " - 数据目录 : ${DATA_DIR}"
echo " - 日志目录 : ${LOG_DIR}"
echo " - socket : ${SOCK_PATH}"
echo " - 本机 root 密码: ${ROOT_PASSWORD}(仅限 localhost)"
echo " - 远程账号 : ${REMOTE_USER} / ${REMOTE_PASS}(允许来自:${ALLOW_ALL_IP})"
echo "----------------------------------------------------------"
echo ">>> 连通性检查(本机到本机):"
mysql -h 127.0.0.1 -P ${FIREWALL_PORT} -u"${REMOTE_USER}" -p"${REMOTE_PASS}" -e "SELECT VERSION() AS 'MariaDB_Version', NOW() AS 'Server_Time';" || {
echo "[WARN] 本机连通性测试失败,请检查端口/防火墙/SELinux/配置。" >&2
}
echo "✅ ALL DONE. 现在任何能访问到 ${SERVER_IP}:${FIREWALL_PORT} 的主机,都可以用 Navicat 连接。"
2.以上脚本复制后操作步骤
1.打开 Visual Studio Code
2.新建一个文件(快捷键:Ctrl + N)
3.把上面的脚本代码完整复制粘贴进去
4.保存文件:点击菜单栏 → 文件 → 另存为—>文件名输入:install_mariadb.sh
5.文件类型:选择 所有文件
6.编码:选 UTF-8
7.确认保存
💡 VS Code 默认保存的就是纯文本,不会乱加后缀(比如 .txt),所以比记事本更稳。
3.用 XFTP上传install_mariadb.sh到服务器步骤
1.前提条件
你电脑上已经装好 Xftp
你已经知道服务器 IP(比如:10.1.3.144)、用户名(root)、密码
2.连接服务器
双击刚刚建好的会话 → 输入 root 密码 → 连接成功
连接后界面会出现 左右双窗口:
左边 = 你电脑上的目录
右边 = 服务器上的目录(默认 /root/)
3.上传脚本文件
在左边窗口 找到你保存的脚本文件:install_mariadb.sh(比如在桌面或者 D:\work 目录里)
直接 拖拽 到右边 /root/ 目录
传输完成后,右边会出现 install_mariadb.sh 文件
4.验证上传成功
在 右边窗口 /root/ 目录下看到 install_mariadb.sh 文件(也可以利用linux命令验证)
上传就完成 ✅
4.确认脚本有执行权限
4.1Linux中权限tips:
一、基本权限类型
Linux 下的权限主要有三类:
r (read, 读权限)
文件:可以查看文件内容
目录:可以列出目录内容(ls)
w (write, 写权限)
文件:可以修改文件内容
目录:可以在该目录下 创建、删除、重命名 文件/目录
x (execute, 执行权限)
文件:可以执行(前提是它是脚本或二进制)
目录:可以进入该目录(cd)
二、权限分组
每个文件/目录都有三类对象的权限:
所有者 (user, u):文件的拥有者
所属组 (group, g):文件所在的用户组
其他人 (others, o):系统中除以上两类之外的用户
- 开始表示这是一个文件
d开头表示这是一个目录
4.2 确认脚本有执行权限
chmod +x /root/install_mariadb.sh
5.执行脚本:
./install_mariadb.sh
[root@mydbhost ~]# ./install_mariadb.sh
-bash: ./install_mariadb.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
这里的 ^M
说明你的脚本文件是 Windows 格式(CRLF 换行符) 保存的,Linux 解释器看不懂。
方法 :用 dos2unix
转换
如果系统里有 dos2unix 工具,(如果还没安装)直接复制执行:
yum install -y dos2unix
dos2unix /root/install_mariadb.sh
然后再执行:
./install_mariadb.sh
脚本会自动执行 安装 → 配置 → 开放防火墙 → 创建远程用户 等步骤。
执行过程中,终端会输出类似:
三、离线安装方式(无网络服务器)
1. 在有网络的机器下载 MariaDB 10.3.38 的 RPM 包,拷贝到 /opt/mariadb/
需要的包: MariaDB-server, MariaDB-client, MariaDB-common, MariaDB-compat, galera(可选)
2. 在目标服务器安装: cd /opt/mariadb && yum localinstall -y *.rpm
3. 修改目录: 同联网安装步骤 5~8
4. 启动并设置开机自启: systemctl start mariadb && systemctl enable mariadb
5. 配置远程访问、初始化安全、授权用户 → 同联网安装步骤 11~13
四、验证安装
1. 查看版本: mysql --version
2. 登录测试: mysql -u root -p
3. 检查数据目录: SHOW VARIABLES LIKE 'datadir'; 应为 /data/mariadb/mysql/
4. 使用 Navicat 远程连接 (IP:10.1.3.144, 用户:admin, 密码:Admin@123)
五、常见问题
1. 防火墙未开放 → Navicat 连接不上 → firewall-cmd --permanent --add-port=3306/tcp && firewall-cmd --reload
2. SELinux 拦截连接 → 临时关闭 setenforce 0,永久关闭修改 /etc/selinux/config
3. 离线安装缺依赖 → 从有网环境下载缺少的 rpm 包,拷贝进去安装
4. Oracle 与 MariaDB 路径冲突 → 确保 MariaDB 数据目录使用 /data/mariadb/,不要使用 /u01