当前位置: 代码网 > it编程>游戏开发>ar > MariaDB 基础教程从安装到主从复制

MariaDB 基础教程从安装到主从复制

2026年08月16日 ar 我要评论
mariadb 是 mysql 的社区分支,语法几乎完全兼容 mysql。你在 mysql 上学到的命令、配置、主从复制思路,绝大部分都能直接平移到 mariadb 上,反之亦然。本篇基于 cento

mariadb 是 mysql 的社区分支,语法几乎完全兼容 mysql。你在 mysql 上学到的命令、配置、主从复制思路,绝大部分都能直接平移到 mariadb 上,反之亦然。

本篇基于 centos 7 环境,从零带你走完一条完整的链路:

  1. mariadb 的安装与安全初始化
  2. 常用 sql 命令(库、表、增删改查、用户权限)
  3. 配置文件详解
  4. 主从复制(一主一从)的原理与实战

学完这一篇,你就拥有了搭建一个「能跑、安全、可扩展」的 mariadb 服务的能力。

实验环境

主机名ip 地址角色
mariadb-server10.1.8.10/24数据库服务端
mariadb-client10.1.8.11/24数据库客户端

在后面的「主从复制」章节,会换两台新机器:

主机名ip 地址角色
mariadb-server110.1.8.10/24主库(master)
mariadb-server210.1.8.11/24从库(slave)

一、安装 mariadb

1. 基础环境配置

装库之前,先给机器起个像样的主机名,并配置静态 ip——这是运维基本功,方便后续远程连接和主从通信。

服务端(mariadb-server):

hostnamectl set-hostname mariadb-server
nmcli connection modify ens33 ipv4.method manual \
  ipv4.addresses 10.1.8.10/24 \
  ipv4.gateway 10.1.8.2 \
  ipv4.dns 10.1.8.2 \
  autoconnect yes
nmcli connection up ens33

客户端(mariadb-client):

hostnamectl set-hostname mariadb-client
nmcli connection modify ens33 ipv4.method manual \
  ipv4.addresses 10.1.8.11/24 \
  ipv4.gateway 10.1.8.2 \
  ipv4.dns 10.1.8.2 \
  autoconnect yes
nmcli connection up ens33

小贴士nmcli 是 centos 7 的网络管理命令。ipv4.method manual 表示手动配置静态 ip;autoconnect yes 表示开机自动连接。

2. yum 安装与启动

# centos 7 使用 yum 安装(服务端需要 mariadb + mariadb-server,客户端只需 mariadb)
[root@mariadb-server ~]# yum install -y mariadb mariadb-server
# 启动服务
[root@mariadb-server ~]# systemctl start mariadb
# 设置开机自启
[root@mariadb-server ~]# systemctl enable mariadb
# 查看运行状态
[root@mariadb-server ~]# systemctl status mariadb

说明mariadb 是客户端命令工具,mariadb-server 是服务端。服务端机器才需要装 mariadb-server;客户端机器只装 mariadb 就能远程连接。

3. 安全初始化(必做!)

刚装好的 mariadb 有三个隐患:root 密码为空、存在匿名用户、自带 test 测试库。这些在生产环境都是安全大坑,所以装完之后第一件事,就是运行安全脚本:

[root@mariadb-server ~]# mysql_secure_installation

脚本会通过一串交互式提问来加固数据库,逐条按下表选择

步骤提示问题输入说明
1enter current password for root (enter for none)直接回车新装无 root 密码
2set root password?y设置 root 密码
3remove anonymous users?y删除匿名用户
4disallow root login remotely?y禁止 root 远程登录
5remove test database and access to it?y删除 test 测试库
6reload privilege tables now?y立即刷新权限

关键交互过程如下:

enter current password for root (enter for none):        # 回车,无 root 密码
set root password? [y/n] y                               # 设置 root 密码
new password:
re-enter new password:
password updated successfully!
remove anonymous users? [y/n] y                          # 删除匿名用户
disallow root login remotely? [y/n] y                    # 禁止 root 远程登录
remove test database and access to it? [y/n] y           # 删除 test 库
reload privilege tables now? [y/n] y                     # 刷新权限
all done!  ...

为什么每一步都要做?

  • 删匿名用户:否则任何人都能免密登录;
  • 禁 root 远程登录:防止 root 密码被网络暴力破解;
  • 删 test 库:它默认任何人都能访问。

4. 登录数据库

# 本地登录
[root@mariadb-server ~]# mysql -uroot -p
enter password:          # 输入刚才设置的密码(本教程后续统一用 huawei)

登录成功后,就进入了 mariadb 的命令行交互界面:

welcome to the mariadb monitor.  commands end with ; or \g.
mariadb [(none)]>

二、基础 sql 命令

铁律:每条 sql 语句结尾必须以分号 ; 结束。不写分号,mariadb 会以为你还没输完,一直等你继续输入。

1. 库操作(database)

-- 登录(带主机和端口)
mysql -uroot -p -h127.0.0.1 -p3306
-- 查看所有数据库
show databases;
-- 创建数据库
create database school;
-- 创建数据库并指定字符集(推荐 utf8mb4,支持 emoji 表情)
create database school2 default character set utf8mb4 collate utf8mb4_general_ci;
-- 使用(切换)数据库
use school;
-- 查看当前所在库
select database();
-- 删除数据库
drop database school2;

为什么要指定字符集?
默认字符集是老旧的 latin1,一旦存储中文或 emoji 就会乱码。建库时直接指定 utf8mb4 是最省心的做法——utf8mb4utf8 的完整超集,支持所有 emoji 表情。

2. 表操作(table)

-- 查看当前库所有表
show tables;
-- 创建表
create table student(
  id   int primary key auto_increment,   -- 主键,自增
  name varchar(20),                      -- 姓名
  age  int                               -- 年龄
);
-- 查看表结构
desc student;
-- 查看建表语句
show create table student;
-- 删除表
drop table student2;

desc student 的输出含义:

列名含义
field字段名
type字段类型
null是否允许为空
key键类型(pri = 主键)
default默认值
extra附加属性(如 auto_increment 自增)

3. dml 增删改查

dml(data manipulation language,数据操纵语言)就是常说的「增删改查」:

-- 插入数据(一次性插入多条)
insert into student(name, age) values
  ('zhangsan', 18),
  ('lisi', 20);
-- 查询全部
select * from student;
-- 条件查询(年龄大于 18 的)
select * from student where age > 18;
-- 更新(把 id=1 的年龄改成 19)
update student set age = 19 where id = 1;
-- 删除(删除 id=2 的记录)
delete from student where id = 2;

记忆口诀:增 insert、删 delete、改 update、查 select。其中 select 最常用也最灵活,where 是它的灵魂——不会用 where,等于开车不会踩刹车。

4. 用户与权限

-- 创建用户(只允许本机登录)
create user 'admin'@'localhost' identified by '123456';
-- 创建用户(允许任意地址远程登录)
create user 'admin'@'%' identified by '123456';
create user 'test'@'%' identified by '123456';
-- 查看所有账号
select user, host from mysql.user;
-- 授权:把 school 库的所有权限给 admin
grant all privileges on school.* to 'admin'@'%';
-- 刷新权限
flush privileges;
-- 查看某用户的权限
show grants for 'admin'@'%';
-- 删除用户
drop user 'test'@'%';

权限粒度(重点)

  • *.* —— 所有库的所有表;
  • school.* —— school 库的全部表。

授权时要遵循「最小权限原则」:用多少给多少,别动不动就 *.*

远程登录测试(在客户端机器上):

# 客户端安装 mariadb 客户端
[root@mariadb-client ~]# yum install mariadb -y
# 用 admin 账号远程连接服务端
[root@mariadb-client ~]# mysql -uadmin -p123456 -h10.1.8.10 -p3306

三、配置文件

mariadb 的配置集中在 /etc/my.cnf 及其子目录:

路径说明
/etc/my.cnf主配置文件
/etc/my.cnf.d/*.cnf子配置目录(按模块拆分)
/etc/my.cnf.d/server.cnf服务端常用配置片段

常用的 [mysqld] 配置项:

[mysqld]
# 数据库 id:主从复制必须不一样,单机随便写
server-id=1
# 数据目录
datadir=/var/lib/mysql
# 监听地址:0.0.0.0 允许远程访问
bind-address=0.0.0.0
# 默认字符集
character-set-server=utf8mb4
# 开启 binlog(主从复制需要)
log_bin=mysql-bin
binlog_format=mixed
[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid
参数作用
server-id服务器唯一编号,主从复制时每个节点必须不同
datadir数据文件存放目录
bind-address监听地址,0.0.0.0 表示接受任意来源连接
character-set-server服务端默认字符集
log_bin开启二进制日志(主从复制、数据恢复的核心)
binlog_formatbinlog 格式(statement / row / mixed)

修改配置后,必须重启服务才能生效

systemctl restart mariadb

防火墙别忘了! 否则外部机器根本连不上 3306 端口:

firewall-cmd --add-port=3306/tcp --permanent
firewall-cmd --reload

四、主从复制基础(一主一从)

1. 什么是主从复制?

主从复制是指:主库(master)把数据变更以日志形式传输给从库(slave),从库重放日志实现数据一致。

一句话理解:主库负责「写」,从库负责「读」,两者数据保持同步。它的价值在于:

  • 读写分离:主库扛写、从库扛读,分担压力;
  • 数据备份:从库天然是主库的一份实时备份;
  • 高可用:主库挂了,从库能顶上。

2. 原理:三个日志 + 三个线程

先记住这 6 个名词,主从复制就懂了一半:

角色名称作用
主库二进制日志 binlog记录所有修改数据的 sql,是同步的「数据源头」
主库binlog dump 线程负责向从库传输 binlog
从库中继日志 relay log存放从主库拉来的 binlog,避免直接通过网络读主库
从库io 线程连接主库、拉取 binlog、写入本地 relay log
从库sql 线程读取 relay log、执行 sql、还原数据变更

类比:把主从复制想象成「抄作业」——

  • 主库(学霸)把解题过程写进笔记本 binlog
  • 从库(同学)派 io 线程 去把笔记本内容抄到自己的草稿纸 relay log 上;
  • 再派 sql 线程 照着草稿纸,自己一步步重新做一遍,最后得到一模一样的答案。

3. 完整同步流程

步骤说明
主库执行增删改/建表时,先写事务日志(redo log)保证持久化,再按顺序写入 binlog
从库 io 线程连接主库,告知要同步的 binlog 文件名和位置(position)
主库 binlog dump 线程根据位置读取增量数据,通过网络发给从库
从库 io 线程先写入本地 relay log,并更新状态文件(实现断点续传)
从库 sql 线程解析并执行 relay log 里的 sql,还原主库数据变更

为什么要有 relay log? 如果从库直接通过网络读主库 binlog,网络一中断就容易丢数据。先落到本地 relay log,再慢慢执行,就安全多了,也支持断点续传、不重复/不遗漏。

4. 实战配置

实验拓扑(两台新机器):

主机名ip 地址角色
mariadb-server110.1.8.10/24主库 master
mariadb-server210.1.8.11/24从库 slave

两台机器都要先完成:基础配置、安装、安全初始化(步骤同「一、安装」)。

主库配置(mariadb-server1)

# 1. 修改配置,添加 server-id 和 binlog
[root@mariadb-server1 ~]# vim /etc/my.cnf
[mysqld]
server-id=1         # 主从复制里每个节点必须唯一
log_bin=mysql-bin   # 开启 binlog
# 2. 重启生效
[root@mariadb-server1 ~]# systemctl restart mariadb.service
# 3. 登录并创建复制专用账号
[root@mariadb-server1 ~]# mysql -uroot -phuawei
mariadb [(none)]> create user 'repl'@'%' identified by 'repl@123456';
mariadb [(none)]> grant replication slave on *.* to 'repl'@'%';
mariadb [(none)]> flush privileges;
-- 4. 查看主库 binlog 位置(记下 file 和 position 两个值!)
mariadb [(none)]> show master status;

show master status 输出类似:

+------------------+----------+--------------+------------------+
| file             | position | binlog_do_db | binlog_ignore_db |
+------------------+----------+--------------+------------------+
| mysql-bin.000001 |      548 |              |                  |
+------------------+----------+--------------+------------------+

重点记住 file(如 mysql-bin.000001)和 position(如 548),待会儿从库配置要用。这个位置就表示「从库应该从哪个点开始同步」。

从库配置(mariadb-server2)

# 1. 修改配置,server-id 必须和主库不同
[root@mariadb-server2 ~]# vim /etc/my.cnf
[mysqld]
server-id=2               # 与主库不同
relay_log=mysql-relay-bin # 开启中继日志
# 2. 重启生效
[root@mariadb-server2 ~]# systemctl restart mariadb.service
# 3. 登录并指定主库信息
[root@mariadb-server2 ~]# mysql -uroot -phuawei
mariadb [(none)]> change master to
  master_host='10.1.8.10',
  master_user='repl',
  master_password='repl@123456',
  master_log_file='mysql-bin.000001',   -- 主库的 file
  master_log_pos=548;                    -- 主库的 position
-- 4. 启动从库复制
mariadb [(none)]> start slave;
-- 5. 查看从库状态
mariadb [(none)]> show slave status\g;

验证复制是否正常

关键看两个字段:

slave_io_running: yes
slave_sql_running: yes

只要这两个都是 yes,复制就正常。 io 线程管「拉日志」,sql 线程管「执行日志」,缺一不可。

最终测试:在主库建库,看从库是否自动同步。

-- 主库 server1 创建数据库
mariadb [(none)]> create database qingqingcaoyuan;
mariadb [(none)]> show databases;
-- 能看到 qingqingcaoyuan
-- 从库 server2 没手动创建,但也有了
mariadb [(none)]> show databases;
-- 同样能看到 qingqingcaoyuan ✅

总结

回顾本篇掌握的核心内容:

模块关键点
安装yum install mariadb mariadb-server + systemctl 启动 + mysql_secure_installation 安全初始化
sql库 / 表 / 增删改查(dml)/ 用户权限,每条语句以 ; 结尾
配置/etc/my.cnf,核心是 server-idlog_binbind-address、字符集
主从复制binlog → relay log,dump 线程 → io 线程 → sql 线程;slave_io_runningslave_sql_running 都为 yes 即成功

mariadb 作为 mysql 的社区分支,学会了它,再上手 mysql 基本是零成本迁移。这篇只是「基础」,进阶还可以继续学习主从复制的故障排查、读写分离,以及更复杂的集群方案。

到此这篇关于mariadb 基础教程从安装到主从复制的文章就介绍到这了,更多相关mariadb基础教程内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com