个人用云计算学习笔记 --19 (MariaDB服务器)
文章目录
- 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, # 非空整数IDname VARCHAR(100) NOT NULL, # 非空字符串姓名age INT(11) DEFAULT 10, # 整数年龄,默认值10id_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.0 2. 创建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