文章目录
- MariaDB 服务器
- 一、数据库基础与 MariaDB 概述
- 1. 数据库核心概念
- 2. MariaDB 核心特性
- 二、MariaDB 部署(基于 Rocky8)
- 1. 安装软件包
- 2. 服务启停与自启配置
- 3. 防火墙配置
- 4. 数据库加固(必做)
- 三、MariaDB 连接与配置
- 1. 连接方式
- 2. 核心配置文件
- 3. 关键配置参数(服务端)
- 4. 客户端配置示例(/etc/my.cnf.d/mysql-clients.cnf)
- 四、MariaDB SQL 操作(核心)
- 1. SQL 分类与核心语句
- 2. 数据库操作
- 3. 表操作(以`inventory`数据库为例)
- (1)表结构管理
- (2)数据 CRUD 操作
- (3)多表查询与函数
- 五、MariaDB 用户与权限管理
- 1. 用户账户特性
- 2. 用户创建与删除
- 3. 权限体系
- (1)权限范围(从大到小)
- (2)权限操作
- (3)常见授权示例
- 4. 密码管理
- 5. 常见访问问题排查
- 6. 忘记 root 密码的解决步骤
- 六、MariaDB 备份与恢复
- 1. 备份方式对比
- 2. 逻辑备份与恢复(使用`mysqldump`)
- (1)备份操作
- (2)恢复操作
- 3. 物理备份与恢复(使用`mariabackup`)
- (1)备份操作
- (2)恢复操作
MariaDB 服务器
一、数据库基础与 MariaDB 概述
1. 数据库核心概念
- 定义:按特定数据结构组织、存储数据的仓库,支持多种数据管理操作。
- 数据结构:数据的组织形式或数据间的关联关系,决定数据存储与调用逻辑。
2. MariaDB 核心特性
起源与定位:MySQL 的开源分支,由开源社区维护,采用 GPL 授权;因 Oracle 收购 MySQL 后存在闭源风险而生,旨在保障开源属性。
兼容性:完全兼容 MySQL 的 API 和命令行,可直接替代 MySQL。
数据组织
:一个 MariaDB 实例可包含多个 database,每个database包含多张表;表采用二维结构,与 Excel 工作表类似,具体对应关系如下:
- 行:一条记录(元组),代表一个完整的数据条目。
- 列:一个字段(属性),描述数据的某一维度,需定义数据类型、长度等属性。
- 单元格:行与列的交叉点,存储单个属性值。
应用场景:常用于 LAMP/LNMP 架构,作为 Web 应用的后端数据存储,例如存储网站用户数据、商品信息、交易记录等。
二、MariaDB 部署(基于 Rocky8)
1. 安装软件包
MariaDB 服务端与客户端需分别安装,依赖 AppStream 存储库:
- 安装服务端:
[root@server~]# dnf install -y mariadb-server - 安装客户端:
[root@server~]# dnf install -y mariadb
2. 服务启停与自启配置
- 启用并立即启动服务:
[root@server~]# systemctl enable --now mariadb - 单独启动 / 停止 / 重启:
systemctl start/stop/restart mariadb
3. 防火墙配置
开放 MariaDB 默认端口(3306/TCP)对应的服务:
- 永久添加服务规则:
[root@server~]# firewall-cmd --permanent --add-service=mysql - 重载防火墙使规则生效:
[root@server~]# firewall-cmd --reload
4. 数据库加固(必做)
通过mysql_secure_installation脚本修复默认不安全配置,交互式完成以下操作:
- 为 root 账户设置密码(默认无密码)。
- 禁止 root 账户从非本地主机访问(限制远程 root 登录)。
- 删除匿名用户账户(避免未授权访问)。
- 删除默认 test 数据库(减少测试数据泄露风险)。
三、MariaDB 连接与配置
1. 连接方式
| 连接方式 | 适用场景 | 特点 | 连接示例 |
|---|---|---|---|
| 套接字文件连接 | 客户端与服务器在同一主机 | 无需网络,安全性高,性能好 | mysql -u root -p(默认使用/var/lib/mysql/mysql.sock) |
| TCP/IP 网络连接 | 客户端与服务器在不同主机 | 需网络通信,支持远程访问,服务器需监听 3306 端口 | mysql -u root -h 192.168.1.100 -p |
2. 核心配置文件
| 配置文件 / 目录 | 作用 | 关键配置参数 |
|---|---|---|
/etc/my.cnf | 主配置文件,全局生效 | 包含基础配置引用,通常不直接修改具体参数 |
/etc/my.cnf.d/ | 辅助配置目录,按功能拆分配置 | - mariadb-server.cnf:服务端核心配置,如bind-address、port、skip-networking- mysql-clients.cnf:客户端配置,如默认连接用户、主机、端口 |
3. 关键配置参数(服务端)
-
bind-address:指定监听的网络地址,仅允许一个值,可选:
- 单个 IPv4 地址(如
192.168.1.100) - 单个 IPv6 地址(如
fde2:6494:1e09:2::20) :::监听所有 IPv4 和 IPv6 地址- 空值 /
0.0.0.0:监听所有 IPv4 地址 - 本地回环地址(
127.0.0.1/::1):仅允许本地连接
- 单个 IPv4 地址(如
skip-networking:禁用网络连接,仅允许套接字连接;skip-networking=0(默认)启用网络连接,=1禁用。port:指定监听端口,默认 3306/TCP,可自定义非冲突端口。
4. 客户端配置示例(/etc/my.cnf.d/mysql-clients.cnf)
[mysql]
user=laoma # 默认连接用户
password=redhat # 默认密码(生产环境不建议明文存储)
host=server # 默认连接的服务器主机名/IP
port=3306 # 默认连接端口
# database=test # 默认进入的数据库(可选)
四、MariaDB SQL 操作(核心)
1. SQL 分类与核心语句
| SQL 类型 | 功能 | 关键字 / 语句 |
|---|---|---|
| 数据查询语言(DQL) | 检索表中数据 | SELECT、WHERE、ORDER BY、GROUP BY、HAVING |
| 数据操作语言(DML) | 增删改表中数据 | INSERT、UPDATE、DELETE |
| 数据定义语言(DDL) | 创建 / 删除数据库、表等对象 | CREATE DATABASE/TABLE、DROP DATABASE/TABLE |
| 事务处理语言(TPL) | 保障数据一致性,处理事务 | BEGIN TRANSACTION、COMMIT、ROLLBACK |
| 数据控制语言(DCL) | 管理用户权限 | GRANT(授权)、REVOKE(回收权限) |
2. 数据库操作
| 操作目的 | 语句示例 | 说明 |
|---|---|---|
| 查看所有数据库 | MariaDB [(none)]> SHOW DATABASES; | 默认显示information_schema(元数据)、mysql(系统用户权限)、performance_schema(性能数据) |
| 切换数据库 | MariaDB [(none)]> USE mysql; | 后续操作默认在该数据库下执行 |
| 创建数据库 | MariaDB [(none)]> CREATE DATABASE laoma; | 需有全局CREATE权限 |
| 删除数据库 | MariaDB [inventory]> DROP DATABASE laoma; | 会删除数据库内所有表,需有DROP权限;删除后重建同名数据库,旧权限仍生效 |
3. 表操作(以inventory数据库为例)
(1)表结构管理
查看数据库内所有表:
MariaDB [inventory]> SHOW TABLES;查看表结构:
MariaDB [inventory]> DESCRIBE product;(或DESC product;),输出包含字段名(Field)、数据类型(Type)、是否允许空(Null)、索引(Key)、默认值(Default)、额外信息(Extra)。创建表:
MariaDB [inventory]> CREATE TABLE staff( id INT(11) NOT NULL, # 非空整数ID name VARCHAR(100) NOT NULL, # 非空字符串姓名 age INT(11) DEFAULT 10, # 整数年龄,默认值10 id_department INT(11) # 部门ID,允许空 );删除表:
MariaDB [inventory]> DROP TABLE staff;(需DROP权限)
(2)数据 CRUD 操作
| 操作类型 | 语句示例 | 说明 |
|---|---|---|
| 插入数据(CREATE) | INSERT INTO staff (id,name,age,id_department) VALUES (1,'laoma1',28,10); | 可指定部分字段(需保证非空字段有值);多组数据用逗号分隔 |
| 查询数据(Retrieve) | 1. 查询所有字段:SELECT * FROM product;2. 查询指定字段:SELECT name,price FROM product;3. 带条件查询:SELECT * FROM product WHERE price>100;4. 排序查询:SELECT * FROM product ORDER BY price DESC;(DESC 降序,ASC 升序默认) | 支持BETWEEN(范围匹配)、IN(列表匹配)、LIKE(模糊匹配,%匹配多字符,_匹配单字符)、AND/OR(逻辑组合) |
| 更新数据(Update) | UPDATE staff SET age=30 WHERE id=3; | 必须加WHERE子句,否则更新表中所有记录 |
| 删除数据(Delete) | DELETE FROM staff WHERE id=3; | 必须加WHERE子句,否则删除表中所有记录 |
(3)多表查询与函数
多表关联查询(示例:查询 “Servers” 类别下的产品名和价格):
SELECT product.name, product.price FROM product, category WHERE product.id_category = category.id # 关联条件(外键匹配) AND category.name='servers'; # 筛选条件常用聚合函数:
- 平均值:
SELECT AVG(price) FROM product; - 最大值:
SELECT MAX(price) FROM product; - 最小值:
SELECT MIN(price) FROM product; - 求和:
SELECT SUM(stock) FROM product; - 计数:
SELECT COUNT(name) FROM product;(统计非空 name 的数量)
- 平均值:
分组查询(
GROUP BY):SELECT id_category, SUM(stock) FROM product GROUP BY id_category;(按类别分组统计库存总和)
五、MariaDB 用户与权限管理
1. 用户账户特性
- 独立性:MariaDB 用户与 Linux 系统用户独立,即使名称相同,密码和权限也互不影响。
- 账户格式:
user_name@host_name,host_name指定允许连接的主机,支持通配符(%匹配任意主机 / 网段,如192.168.1.%)。
2. 用户创建与删除
| 操作 | 语句示例 | 说明 |
|---|---|---|
| 创建用户 | MariaDB [(none)]> CREATE USER laoma@'%' IDENTIFIED BY 'redhat'; | laoma@'%'表示允许 laoma 从任意主机连接,密码为 redhat;密码加密存储在mysql.user表 |
| 删除用户 | MariaDB [(none)]> DROP USER laoma@localhost; | 若用户当前已连接,需关闭连接后删除才生效 |
3. 权限体系
(1)权限范围(从大到小)
- 全局权限:管理数据库服务器本身,如
CREATE USER、SUPER。 - 数据库权限:操作特定数据库,如
CREATE DATABASE、ALTER DATABASE。 - 表权限:操作特定表,如
SELECT、INSERT、UPDATE、DELETE(CRUD 权限)。 - 列权限:操作表中特定列(极少使用)。
(2)权限操作
| 操作目的 | 语句示例 | 说明 |
|---|---|---|
| 查看用户权限 | MariaDB [(none)]> SHOW GRANTS FOR root@localhost; | 查看 root 用户在本地的所有权限 |
| 授予权限 | GRANT SELECT,INSERT,UPDATE,DELETE ON inventory.category TO laoma@localhost; | 给 laoma@localhost授予inventory.category表的 CRUD 权限;授权用户需有GRANT OPTION权限 |
| 回收权限 | REVOKE SELECT,INSERT ON inventory.category FROM laoma@localhost; | 从 laoma@localhost回收inventory.category表的查询和插入权限 |
(3)常见授权示例
| 授权需求 | 语句 |
|---|---|
| 授予特定库所有表的查询权限 | GRANT SELECT ON inventory.* TO laoma@'%'; |
| 授予所有库所有表的所有权限(超级用户) | GRANT ALL PRIVILEGES ON *.* TO laoma@localhost WITH GRANT OPTION; |
| 授予特定库的建表 / 删表权限 | GRANT CREATE,ALTER,DROP ON inventory.* TO laoma@'%'; |
4. 密码管理
| 操作场景 | 语句示例 | 说明 |
|---|---|---|
| root 修改普通用户密码 | 1. USE mysql;2. UPDATE user SET password=PASSWORD('newpass') WHERE user='laoma' AND host='localhost';或直接:SET PASSWORD FOR 'laoma'@'localhost' = PASSWORD('newpass'); | 需执行FLUSH PRIVILEGES;刷新权限 |
| 普通用户修改自身密码 | SET PASSWORD = PASSWORD('newpass'); | 无需额外权限,仅能修改自身密码 |
5. 常见访问问题排查
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| 有网络权限但仅能本地连接 | 配置文件启用skip-networking | 删除/etc/my.cnf.d/mariadb-server.cnf中的skip-networking,重启服务 |
| 无法远程连接 | 1. bind-address配置错误2. 用户表中无对应主机的用户记录3. 防火墙未开放 3306 端口 | 1. 调整bind-address为允许的远程地址或0.0.0.02. 创建user@远程IP/网段用户3. 开放防火墙 mysql 服务 |
能连接但仅见information_schema | 未授予用户访问其他数据库的权限 | 执行GRANT语句授予对应数据库权限 |
| 能连接但无法创建数据库 | 无全局CREATE权限 | 授予CREATE全局权限或特定库的创建权限 |
6. 忘记 root 密码的解决步骤
- 编辑服务端配置文件:
vim /etc/my.cnf.d/mariadb-server.cnf,在[mysqld]块添加skip-grant-tables(跳过权限验证)。 - 重启服务:
systemctl restart mariadb。 - 无密码登录:
mysql -u root。 - 修改 root 密码:
UPDATE mysql.user SET password=PASSWORD('新密码') WHERE USER='root';,执行FLUSH PRIVILEGES;,退出。 - 删除
skip-grant-tables配置,重启服务:systemctl restart mariadb。
六、MariaDB 备份与恢复
1. 备份方式对比
| 备份类型 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 逻辑备份 | 导出 SQL 命令文本文件,包含重建数据的语句 | 1. 可移植性强,支持跨数据库(如还原到 PostgreSQL)2. 服务器联机时执行,不影响业务3. 可选择性备份(特定库 / 表) | 1. 备份速度慢(需转换为 SQL 格式)2. 不包含日志和配置文件 | 中小规模数据、跨环境迁移 |
| 物理备份 | 直接复制数据库目录和数据文件 | 1. 备份 / 恢复速度快2. 包含日志和配置文件3. 适合大规模数据 | 1. 可移植性差(依赖硬件 / 软件环境)2. 需服务器脱机或锁表,避免数据变更 | 大规模数据、全量备份、灾备恢复 |
2. 逻辑备份与恢复(使用mysqldump)
(1)备份操作
- 备份单个数据库:
[root@server~]# mysqldump -u root -p inventory > /backup/inventory.dump(需输入 root 密码) - 备份所有数据库:
[root@server~]# mysqldump -u root -p --all-databases > /backup/mariadb_all.dump - 备份特定表:
[root@server~]# mysqldump -u root -p inventory product category > /backup/inventory_tables.dump - 常用选项:
--add-drop-database:备份中添加DROP DATABASE语句,恢复前先删旧库--add-drop-table:备份中添加DROP TABLE语句,恢复前先删旧表--ignore-database=name:排除特定数据库(需配合--all-databases)
(2)恢复操作
- 恢复单个数据库:
[root@server~]# mysql -u root -p inventory < /backup/inventory.dump(需先创建inventory库,除非备份包含建库语句) - 恢复所有数据库:
[root@server~]# mysql -u root -p < /backup/mariadb_all.dump
3. 物理备份与恢复(使用mariabackup)
(1)备份操作
安装工具:
[root@server~]# dnf install mariadb-backup(通常随mariadb-server自动安装)准备备份目录:
[root@server~]# mkdir -p /var/mariadb/backup/执行备份:
[root@server~]# mariabackup --backup --target-dir=/var/mariadb/backup/ --user=root --password=redhat免密备份:
/etc/my.cnf.d/mariabackup.cnf添加以下内容,避免交互式输入密码:
[xtrabackup] user=root password=redhat
(2)恢复操作
恢复会覆盖现有数据,需提前确认备份完整性!
- 停止服务:
[root@server~]# systemctl stop mariadb - 清空数据目录:先查看数据目录路径(
grep datadir /etc/my.cnf.d/mariadb-server.cnf,默认/var/lib/mysql),再删除目录内所有文件:rm -rf /var/lib/mysql/* - 执行恢复:
- 保留备份文件:
[root@server~]# mariabackup --copy-back --target-dir=/var/mariadb/backup/ - 移动备份文件(删除原备份):
[root@server~]# mariabackup --move-back --target-dir=/var/mariadb/backup/
- 保留备份文件:
- 修复权限:
[root@server~]# chown -R mysql:mysql /var/lib/mysql/(数据目录属主必须为mysql) - 启动服务:
[root@server~]# systemctl start mariadb