17.MariaDB 数据库管理

发布于:2025-08-12 ⋅ 阅读:(14) ⋅ 点赞:(0)

17.MariaDB 数据库管理

数据库介绍

数据库(Database)简单来说,就是按照一定规则存数据的 “仓库”。它能高效存大量数据,还能方便地查、增、改、删数据,是各种信息系统的核心。

核心特点:

  • 结构化存储:数据像表格一样按规则排列(比如 Excel 的行和列),找起来、管起来都方便。
  • 共享性:多个用户或程序能同时用数据,不用重复存多份。
  • 独立性:改数据的存法不用改程序,程序和数据 “各管各的”。
  • 安全性:能通过密码、权限控制谁能访问,防止数据被乱改或偷看。
  • 完整性:数据得符合规矩(比如手机号不能重复、年龄不能是负数),避免存错数据。

数据库种类

按数据的组织方式(数据模型),数据库主要分下面几类(本章重点讲关系型数据库):

关系型数据库(Relational Database, RDBMS)
  • 原理:数据存在二维表格里(有行有列),表和表之间用 “主键”(唯一标识一行)和 “外键”(关联其他表的主键)连起来。

  • 核心特点

    :遵守 ACID 原则(保证数据可靠),能用 SQL 语言操作(SQL 是专门操作数据库的语言)。

    • 原子性:操作要么全成,要么全不成(比如转账,要么转成功,要么没转,不会转一半)。
    • 一致性:操作后数据得符合规则(比如转账后,两个人的总钱数不变)。
    • 隔离性:多个操作同时进行时,互不干扰(比如 A 和 B 同时查余额,结果不会乱)。
    • 持久性:操作完数据就稳定存下来了,就算断电也不会丢。
  • 适用范围:适合存结构固定、需要保证准确的场景(比如银行账单、电商订单)。

  • 代表产品:

    • MySQL:免费开源,网站常用(比如电商网站、博客)。
    • PostgreSQL:功能强,支持复杂查询和自定义数据类型。
    • Oracle:企业用得多,稳定,适合大系统(比如银行核心系统)。
    • SQL Server:微软出的,和 Windows 系统配合好。
非关系型数据库(NoSQL)

非关系型数据库不按表格存数据,结构更灵活,适合存乱七八糟(非结构化)或半结构化的数据,比如社交软件的消息、大数据分析的数据。常见类型:

(1)键值型数据库(Key-Value Database)
  • 原理:像字典一样,用 “键”(唯一名字)对应 “值”(数据,比如字符串、JSON)。
  • 特点:查数据特别快,适合简单的存和取。
  • 代表产品:Redis、Memcached。
  • 适用场景:缓存(比如电商商品详情临时存在这,打开更快)、存登录会话信息。
(2)文档型数据库(Document Database)
  • 原理:以 “文档” 为单位存数据(比如 JSON 格式),文档里能有嵌套结构(比如一个用户文档里包含地址、电话等)。
  • 特点:不用预先定义结构,想存啥字段就加啥。
  • 代表产品:MongoDB。
  • 适用场景:内容管理(比如博客、新闻)、存用户的多维度信息(比如用户的爱好、消费记录)。
(3)列族型数据库(Column-Family Database)
  • 原理:按 “列族”(一组相关的列)存数据,适合处理海量数据。
  • 特点:能存很多数据,支持分布式存储(多台机器一起存)。
  • 代表产品:HBase、Cassandra。
  • 适用场景:大数据分析(比如存所有用户的行为日志)、传感器数据(比如温度随时间变化的记录)。
(4)图形数据库(Graph Database)
  • 原理:用 “节点”(比如人、物)和 “边”(比如朋友关系、买卖关系)存数据,擅长处理复杂的关联。
  • 特点:查关系特别快(比如找 “朋友的朋友”)。
  • 代表产品:Neo4j。
  • 适用场景:社交网络(推荐好友)、知识图谱(比如 “李白和杜甫的关系”)。
其他类型数据库
  • 时序数据库:专门存随时间变的数据(比如股票价格、温度),按时间查很方便,代表有 InfluxDB。
  • 搜索引擎数据库:擅长全文搜索(比如搜 “手机 性价比高”),代表有 Elasticsearch(常用于日志检索、商品搜索)。

MariaDB 介绍

MariaDB 是 MySQL 的 “亲兄弟”,由开源社区维护,免费可用,和 MySQL 完全兼容(命令、接口都一样),能直接替换 MySQL。

MariaDB 里可以有多个 “数据库(database)”,每个数据库里有多个 “表(table)”。

关系数据库的表和 Excel 表格很像:

  • 一行就是一条记录(比如一个人的信息)。
  • 一列就是一个字段(比如 “姓名”“年龄”),每个字段有类型(比如年龄是数字,姓名是字符串)。
  • 行和列的交叉点就是具体的(比如 “张三”“20”)。

部署 MariaDB

安装 MariaDB

安装服务端和客户端

# 安装服务端(数据库核心程序,负责存数据、处理请求)
[root@server ~]# yum install -y mariadb-server

# 安装客户端(用来连接服务端、发命令的工具)
[root@server ~]# yum install -y mariadb
  • 选项-y:自动确认安装,不用手动输入 “y”。

启用并启动服务

# 启用服务(开机自动启动),并立即启动服务
[root@server ~]# systemctl enable --now mariadb
  • systemctl:Linux 管理服务的命令。
  • enable:设置开机自启。
  • --now:立即启动服务(相当于同时执行start)。

配置防火墙

# 允许MySQL服务的端口(3306)通过防火墙(永久生效)
[root@server ~]# firewall-cmd --permanent --add-service=mysql
# 重新加载防火墙规则,使配置生效
[root@server ~]# firewall-cmd --reload
  • --permanent:配置永久生效(重启防火墙也不会丢)。
  • --add-service=mysql:允许 MySQL 服务(默认用 3306 端口)。
  • --reload:重新加载规则,让新配置生效。

加固 MariaDB

刚装的 MariaDB 有默认的测试数据库(test)和不安全的设置(比如匿名用户),用mysql_secure_installation命令加固:

[root@server ~]# mysql_secure_installation

运行后会弹出交互提示,按步骤做:

  • 给 root 用户设密码(数据库的 root,不是 Linux 的 root)。
  • 禁止 root 从远程登录(只能在本机登,更安全)。
  • 删除匿名用户(防止陌生人随便登录)。
  • 删除 test 数据库(没用,留着可能有风险)。

连接 MariaDB

装了mariadb客户端后,用mysql命令连接数据库:

# 连接本地数据库,用户是root,会提示输入密码
[root@server ~]# mysql -u root -h localhost -p
  • 选项:
    • -u:指定登录用户(这里是 root)。
    • -h:指定数据库服务器地址(localhost表示本机)。
    • -p:提示输入密码(如果密码为空,直接回车)。

首次安装时,root 默认没密码,直接登录:

[root@server ~]# mysql -u root  # 不用输密码
Welcome to the MariaDB monitor.  Commands end with ; or \g.  # 命令用;或\g结束
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.  # 输入help看帮助

MariaDB [(none)]>  # 提示符,(none)表示没选数据库

提示符里的[(none)]表示当前没选中数据库,选了数据库后会显示数据库名(比如MariaDB [mysql]>)。

配置 MariaDB

MariaDB 默认监听所有网络地址的 3306 端口(数据库默认端口),配置文件在这些地方:

  • 主配置文件:/etc/my.cnf
  • 辅助配置文件:/etc/my.cnf.d/*(比如mariadb-server.cnf是服务端主要配置)

/etc/my.cnf.d/mariadb-server.cnf[mysqld]块里可以改这些参数:

参数 作用
bind-address 指定监听的地址(只能填一个): - 127.0.0.1:只允许本机连接 - 0.0.0.0:允许所有 IPv4 地址连接 - :::允许所有 IPv6 和 IPv4 地址连接
skip-networking 是否禁用网络连接(1 禁用,0 启用)。禁用后只能用本地套接字连接
port 改端口(默认 3306)

客户端配置示例(让客户端默认用指定用户、密码连接,不用每次输):

[root@client ~]# vim /etc/my.cnf.d/mysql-clients.cnf  # 编辑客户端配置文件

添加以下内容:

[mysql]
user=bq          # 默认登录用户
password=123     # 默认密码(明文,注意权限,别让别人看)
host=server      # 默认连接的服务器地址(可以是IP或主机名)
port=3306        # 服务器端口
# database=test  # 默认选中的数据库(注释掉了,可选)

数据库操作

SQL 语句分类

SQL 是操作数据库的语言,分几类:

  • DQL(数据查询语言):查数据,关键词SELECT(配合WHERE ORDER BY等)。
  • DML(数据操作语言):改数据,关键词INSERT(增)、UPDATE(改)、DELETE(删)。
  • DDL(数据定义语言):建 / 删数据库、表,关键词CREATE(建)、DROP(删)、ALTER(改表结构)。
  • TPL(事务处理语言):保证操作可靠,关键词BEGIN TRANSACTION(开始事务)、COMMIT(提交)、ROLLBACK(回滚)。
  • DCL(数据控制语言):管权限,关键词GRANT(授权)、REVOKE(收回权限)。

SQL 语句使用

查询数据库列表
MariaDB [(none)]> SHOW DATABASES;  # 列出所有数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |  # 存数据库的元信息(比如表结构、字段类型)
| mysql              |  # 存用户和权限信息
| performance_schema |  # 存数据库性能信息
+--------------------+
3 rows in set (0.019 sec)
使用数据库

USE命令选一个数据库,之后的操作默认在这个库下:

MariaDB [(none)]> USE mysql;  # 选中mysql数据库
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed  # 提示切换成功
MariaDB [mysql]>  # 提示符变成[mysql],表示当前在mysql库

注意:SQL 语句不区分大小写(SELECTselect一样),但数据库名、表名可能区分(看系统),习惯上 SQL 关键词大写,方便区分。

创建数据库
MariaDB [mysql]> CREATE DATABASE bq;  # 创建名为bq的数据库
Query OK, 1 row affected (0.010 sec)  # 提示成功

MariaDB [mysql]> USE bq;  # 切换到bq库
Database changed
删除数据库
MariaDB [inventory]> DROP DATABASE bq;  # 删除bq数据库(谨慎!会删库中所有表和数据)
Query OK, 0 rows affected (0.006 sec)
  • 注意:删库会删除所有表和数据,且无法恢复!只有有DROP权限的用户才能删。

SQL 语句对表的使用

环境准备(导入示例数据)
# 先创建inventory数据库,再导入备份文件(假设备份文件叫inventory.dump)
[root@server ~]# mysql -uroot -p123 -e 'create database inventory;'  # -e直接执行SQL命令
[root@server ~]# mysql -uroot -p123 inventory < inventory.dump  # 把备份导入inventory库
查询表
查询表列表
MariaDB [(none)]> USE inventory;  # 先选中inventory库
MariaDB [inventory]> SHOW TABLES;  # 列出当前库的所有表
+---------------------+
| Tables_in_inventory |
+---------------------+
| category            |  # 分类表
| manufacturer        |  # 厂商表
| product             |  # 产品表
+---------------------+
3 rows in set (0.001 sec)
查询表结构

DESCRIBEDESC看表的字段信息:

MariaDB [inventory]> DESCRIBE product;  # 查看product表的结构
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |  # 主键,自动增长(新增记录时自动加1)
| name            | varchar(100) | NO   |     | NULL    |                |  # 产品名,字符串类型,最多100字符,不能为空
| price           | double       | NO   |     | NULL    |                |  # 价格,浮点数,不能为空
| stock           | int(11)      | NO   |     | NULL    |                |  # 库存,整数,不能为空
| id_category     | int(11)      | NO   |     | NULL    |                |  # 分类ID(关联category表的id)
| id_manufacturer | int(11)      | NO   |     | NULL    |                |  # 厂商ID(关联manufacturer表的id)
+-----------------+--------------+------+-----+---------+----------------+
6 rows in set (0.008 sec)

字段说明:

  • Field:字段名。
  • Type:数据类型(int整数、varchar字符串等)。
  • Null:是否允许为空(NO表示必须填)。
  • KeyPRI表示主键(唯一标识一行,不能重复)。
  • Default:默认值(没填时自动用的 value)。
  • Extra:额外信息(auto_increment表示自动增长)。
查询表中数据

查所有记录和所有字段*表示所有字段):

MariaDB [inventory]> SELECT * FROM product;  # 查product表的所有记录
+----+-------------------+---------+-------+-------------+-----------------+
| id | name              | price   | stock | id_category | id_manufacturer |
+----+-------------------+---------+-------+-------------+-----------------+
|  1 | ThinkServer TS140 |  539.88 |    20 |           2 |               4 |  # 一条产品记录
|  2 | ThinkServer RD630 | 2379.14 |    20 |           2 |               4 |
|  3 | RT-AC68U          |  219.99 |    10 |           1 |               3 |
|  4 | X110 64GB         |   73.84 |   100 |           3 |               1 |
+----+-------------------+---------+-------+-------------+-----------------+
4 rows in set (0.004 sec)

查特定字段(只看需要的字段):

MariaDB [inventory]> SELECT name,price,stock FROM product;  # 只查name、price、stock字段
+-------------------+---------+-------+
| name              | price   | stock |
+-------------------+---------+-------+
| ThinkServer TS140 |  539.88 |    20 |
| ThinkServer RD630 | 2379.14 |    20 |
| RT-AC68U          |  219.99 |    10 |
| X110 64GB         |   73.84 |   100 |
+-------------------+---------+-------+
4 rows in set (0.001 sec)
WHERE 子句(条件查询)

WHERE过滤符合条件的记录:

MariaDB [inventory]> SELECT * FROM product WHERE price > 100;  # 查价格大于100的产品
+----+-------------------+---------+-------+-------------+-----------------+
| id | name              | price   | stock | id_category | id_manufacturer |
+----+-------------------+---------+-------+-------------+-----------------+
|  1 | ThinkServer TS140 |  539.88 |    20 |           2 |               4 |
|  2 | ThinkServer RD630 | 2379.14 |    20 |           2 |               4 |
|  3 | RT-AC68U          |  219.99 |    10 |           1 |               3 |
+----+-------------------+---------+-------+-------------+-----------------+
3 rows in set (0.020 sec)

常用条件操作符

操作符 说明 例子
= 等于 price = 100(价格等于 100)
<> 不等于(也可用!= price <> 100(价格不等于 100)
> 大于 stock > 50(库存大于 50)
< 小于 stock < 50(库存小于 50)
>= 大于等于 price >= 200(价格大于等于 200)
<= 小于等于 price <= 200(价格小于等于 200)
BETWEEN 在范围内(包含边界) id BETWEEN 1 AND 3(id 在 1-3 之间)
IN 在列表中 id IN (1,3)(id 是 1 或 3)
LIKE 模糊匹配(%代表任意字符,_代表 1 个字符) name LIKE '%Server%'(名字含 Server)
AND 逻辑与(同时满足) price>100 AND stock>10
OR 逻辑或(满足一个即可) price>1000 OR name LIKE '%RD%'

更多示例

# 查id在1到3之间的产品
MariaDB [inventory]> SELECT * FROM product WHERE id BETWEEN 1 AND 3;

# 查分类是Servers或Ssd的记录(category表)
MariaDB [inventory]> SELECT * FROM category WHERE name IN ('Servers','Ssd');

# 查名字含RD,且价格>1000的产品
MariaDB [inventory]> SELECT * FROM product WHERE name like '%RD%' AND price>1000;

# 按价格升序排序(默认升序,加DESC降序)
MariaDB [inventory]> SELECT * FROM product ORDER BY price;  # 从低到高
MariaDB [inventory]> SELECT * FROM product ORDER BY price desc;  # 从高到低
多表查询(关联查询)

通过表之间的关联字段(比如id_category关联category表的id),同时查多个表的数据:

示例 1:查产品类型是 Servers 的产品名称和价格

MariaDB [inventory]> SELECT product.name,product.price  # 要查的字段(加表名前缀区分)
FROM product,category  # 涉及的表
WHERE product.id_category = category.id  # 关联条件(product的分类ID=category的id)
AND category.name='Servers';  # 过滤条件(分类名是Servers)
+-------------------+---------+
| name              | price   |
+-------------------+---------+
| ThinkServer TS140 |  539.88 |
| ThinkServer RD630 | 2379.14 |
+-------------------+---------+

示例 2:查厂商是 Lenovo 的产品名称和价格

MariaDB [inventory]> SELECT product.name,product.price
FROM product,manufacturer  # 关联product和manufacturer表
WHERE product.id_manufacturer = manufacturer.id  # 关联条件(厂商ID匹配)
AND manufacturer.name='Lenovo';  # 厂商名是Lenovo
+-------------------+---------+
| name              | price   |
+-------------------+---------+
| ThinkServer TS140 |  539.88 |
| ThinkServer RD630 | 2379.14 |
+-------------------+---------+
函数(聚合查询)

用聚合函数对数据做统计(比如求平均、最大、最小等):

函数 作用 示例
avg(字段) 求平均值 avg(price)(平均价格)
max(字段) 求最大值 max(price)(最高价格)
min(字段) 求最小值 min(price)(最低价格)
sum(字段) 求和 sum(stock)(总库存)
count(字段) 计数(非空值数量) count(name)(产品总数)

示例

# 查产品平均价格
MariaDB [inventory]> SELECT avg(price) FROM product;

# 查价格最低的产品信息(子查询:先查最低价格,再查对应产品)
MariaDB [inventory]> SELECT * FROM product WHERE price=(SELECT min(price) FROM product);

# 查Lenovo厂商有多少种产品
MariaDB [inventory]> SELECT count(product.name)  # 计数产品名
FROM product,manufacturer 
WHERE product.id_manufacturer = manufacturer.id
AND manufacturer.name='Lenovo';

# 按分类分组,查每个分类的总库存
MariaDB [inventory]> SELECT id_category,sum(stock) FROM product GROUP BY id_category;  # GROUP BY按分类ID分组
创建表

CREATE TABLE创建表,指定字段名、类型和约束:

MariaDB [inventory]> CREATE TABLE staff(  # 创建名为staff的表
id INT(11) NOT NULL,  # 员工ID,整数,不能为空
name VARCHAR(100) NOT NULL,  # 姓名,字符串(最多100字符),不能为空
age INT(11)  DEFAULT 10,  # 年龄,整数,默认值10
id_department INT(11)  # 部门ID,整数(可以为空)
);
Query OK, 0 rows affected (0.017 sec)

MariaDB [inventory]> SHOW TABLES;  # 查看是否创建成功
  • 常用数据类型:INT(整数)、VARCHAR(长度)(字符串)、DOUBLE(浮点数)、DATE(日期)等。
  • 约束:NOT NULL(不能为空)、DEFAULT(默认值)、PRIMARY KEY(主键)等。
插入记录

INSERT添加数据到表中:

# 全字段插入(按字段顺序填值)
MariaDB [inventory]> INSERT INTO staff (id,name,age,id_department)
VALUES (1,'bq1',28,10);  # 值的顺序和字段对应

# 部分字段插入(只填id、name、age,id_department用默认值NULL)
MariaDB [inventory]> INSERT INTO staff (id,name,age) VALUES (2,'bq2',20);

# 更少字段(age用默认值10)
MariaDB [inventory]> INSERT INTO staff (id,name) VALUES (3,'bq3');
更新记录

UPDATE修改表中的数据,必须加WHERE否则改所有记录

# 改id=3的记录,age设为30
MariaDB [inventory]> UPDATE staff SET age=30 WHERE id=3;

# 危险!不加WHERE会改所有记录的age为30
MariaDB [inventory]> UPDATE staff SET age=30;  # 谨慎使用!
删除记录

DELETE删除记录,必须加WHERE否则删所有记录

# 删除id=3的记录
MariaDB [inventory]> DELETE FROM staff WHERE id=3 ;

# 危险!删表中所有记录(表结构还在)
MariaDB [inventory]> DELETE FROM staff ;  # 谨慎使用!
删除表

DROP TABLE删除表(表结构和数据全删,无法恢复):

MariaDB [inventory]> DROP TABLE staff ;  # 删除staff表

管理 MariaDB 用户

MariaDB 的用户和 Linux 系统用户无关,单独管理。每个用户用用户名@主机标识(控制用户从哪台机器登录)。

创建用户账户

CREATE USER创建用户,需要 root 权限或CREATE USER权限:

# 创建用户bq,允许从任意主机(%)登录,密码123
MariaDB [(none)]> CREATE USER 'bq'@'%' IDENTIFIED BY '123';
  • 用户名格式:user_name'@'host_name,host_name控制登录来源:
    • %:任意主机(包括远程)。
    • localhost:只能本机登录。
    • 192.168.1.%:192.168.1 网段的主机。
    • 192.168.1.5:指定 IP(192.168.1.5)。

用户密码存在mysql.user表中(加密存储):

MariaDB [mysql]> SELECT host,user,password FROM user WHERE user = 'bq';  # 查用户信息
+-----------+--------+-------------------------------------------+
| host      | user   | password                                  |  # 加密后的密码
+-----------+--------+-------------------------------------------+
| %         | bq     | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+-----------+--------+-------------------------------------------+

控制用户权限

新用户默认没权限,用GRANT授权,REVOKE收回权限。

权限范围

权限分不同级别:

  • 全局权限:管理整个数据库服务器(比如CREATE USER)。
  • 数据库权限:操作某个数据库(比如CREATE DATABASE)。
  • 表权限:操作某个表(比如SELECT INSERT)。
  • 列权限:操作表中某列(较少用)。
查询用户权限

SHOW GRANTS FOR查看用户有哪些权限:

# 查root@localhost的权限
MariaDB [(none)]> SHOW GRANTS FOR root@localhost;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' ... WITH GRANT OPTION |  # root有所有权限,且能授权给别人
+----------------------------------------------------------------------------------------------------------------------------------------+
授予用户权限

GRANT授权,格式:GRANT 权限 ON 数据库.表 TO 用户

# 给bq@localhost授予inventory库中category表的增删改查权限
MariaDB [(none)]> GRANT SELECT, UPDATE, DELETE, INSERT
    -> ON inventory.category  # 作用范围:inventory库的category表
    -> TO bq@localhost ;  # 给这个用户
Query OK, 0 rows affected (0.006 sec)

常用授权示例

命令 说明
GRANT SELECT ON db.tb TO user@host 允许用户查 db 库的 tb 表
GRANT SELECT ON db.* TO user@host 允许用户查 db 库的所有表
GRANT SELECT ON *.* TO user@host 允许用户查所有库的所有表(全局权限)
GRANT CREATE, DROP ON db.* TO user@host 允许用户在 db 库中建表、删表
GRANT ALL PRIVILEGES ON *.* TO user@host 给用户所有权限(超级用户)
回收用户权限

REVOKE收回权限,格式:REVOKE 权限 ON 数据库.表 FROM 用户

# 收回bq@localhost对inventory.category表的增删改查权限
MariaDB [(none)]> REVOKE SELECT, UPDATE, DELETE, INSERT
    -> ON inventory.category FROM bq@localhost;
Query OK, 0 rows affected (0.011 sec)

删除用户

DROP USER删除用户:

# 删除用户bq@localhost(必须用'用户@主机'格式)
MariaDB [(none)]> DROP USER bq@localhost;
Query OK, 0 rows affected (0.001 sec)

注意:如果用户正在连接,删除后当前连接还能用,断开后才失效。

更改用户密码

root 改其他用户密码

# 方法1:改mysql.user表
MariaDB [(none)]> USE mysql;
MariaDB [mysql]> UPDATE user SET password=PASSWORD('新密码') WHERE user='bq' and host='localhost';
MariaDB [mysql]> FLUSH PRIVILEGES;  # 刷新权限(让修改生效)

# 方法2:用SET PASSWORD
MariaDB [(none)]> SET PASSWORD FOR 'bq'@'localhost' = PASSWORD('新密码');

普通用户改自己密码

MariaDB [(none)]> SET PASSWORD = PASSWORD('新密码');  # 只能改自己的
MariaDB [(none)]> FLUSH PRIVILEGES;

排故数据库访问

问题现象 可能原因及解决办法
授权了任意主机访问,但只能本地连 配置文件可能设了skip-networking(禁用网络),删了重启服务
能本地连,远程连不上 检查bind-address是否限制了地址;用户是否有远程登录权限(比如user@%
能登录,但只能看到 information_schema 库 用户没权限访问其他库,用GRANT授权
能登录,但不能建库 CREATE全局权限,授权GRANT CREATE ON *.* TO ...
能登录,但不能读写数据 缺表的SELECT INSERT等权限,授权对应表权限

忘记 root 用户密码

  1. 编辑配置文件,加skip-grant-tables(跳过权限验证):

    [root@server ~]# vim /etc/my.cnf.d/mariadb-server.cnf
    [mysqld]
    skip-grant-tables=1  # 加这行
    
  2. 重启服务:

    [root@server ~]# systemctl restart mariadb
    
  3. 无密码登录,改 root 密码:

    [root@server ~]# mysql -u root  # 直接进,不用密码
    MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD('新密码') where USER='root';
    MariaDB [(none)]> exit
    
  4. skip-grant-tables,重启服务:

    [root@server ~]# vim /etc/my.cnf.d/mariadb-server.cnf  # 注释掉那行
    [root@server ~]# systemctl restart mariadb
    

备份和恢复

备份是为了防止数据丢失,分逻辑备份和物理备份。

备份方式

类型 特点
逻辑备份 导出为 SQL 文件(包含建表、插数据的命令),速度较慢,可移植性强(能导到其他数据库),联机备份,不包含日志和配置。
物理备份 复制数据库文件,速度快,只能恢复到类似环境(硬件、软件),需离线或锁表备份,包含日志和配置。

执行备份

逻辑备份(mysqldump)

mysqldump工具导出 SQL 文件,需要SELECT SHOW VIEW TRIGGER等权限。

语法

mysqldump [选项] 数据库名 [表名] > 备份文件路径  # 备份单个库或表
mysqldump [选项] --databases 库1 库2 > 备份文件  # 备份多个库
mysqldump [选项] --all-databases > 备份文件  # 备份所有库

常用选项

选项 作用
-u 用户名 指定登录用户
-p 提示输入密码
-A/--all-databases 备份所有库
-B/--databases 备份多个库(后面跟库名)
--add-drop-table 备份中加DROP TABLE(恢复时先删旧表)
--ignore-table=库.表 忽略某个表

示例

# 备份inventory库到/backup/inventory.dump
[root@server ~]# mysqldump -u root -p inventory > /backup/inventory.dump
Enter password:  # 输入root密码

# 备份所有库到/backup/mariadb.dump
[root@server ~]# mysqldump -u root -p --all-databases > /backup/mariadb.dump

备份文件是文本,包含建表和插数据的 SQL 命令(比如CREATE TABLE INSERT)。

物理备份(mariabackup)

mariabackup工具(需安装mariadb-backup包)复制数据库文件:

# 安装工具(通常装服务端时已装)
[root@server ~]# yum install mariadb-backup

# 建备份目录
[root@server ~]# mkdir -p /var/mariadb/backup/

# 执行备份(用户root,密码123,备份到/var/mariadb/backup/)
[root@server ~]# mariabackup --backup --target-dir /var/mariadb/backup/ \
> --user root --password 123

免密码配置(避免每次输密码):

[root@server ~]# cat /etc/my.cnf.d/mariabackup.cnf
[xtrabackup]
user=root
password=123  # 明文存,注意文件权限(chmod 600)

执行恢复

恢复会覆盖现有数据,恢复前确保数据可丢!

恢复逻辑备份

mysql命令导入 SQL 文件:

# 恢复到inventory库(库需存在,或备份里有建库语句)
[root@server ~]# mysql -u root -p inventory < /backup/inventory.dump
Enter password:  # 输入密码
恢复物理备份

mariabackup--copy-back(保留备份)或--move-back(移动备份,删除原备份):

# 1. 停服务
[root@server ~]# systemctl stop mariadb

# 2. 清空数据目录(默认/var/lib/mysql)
[root@server ~]# rm -rf /var/lib/mysql/*

# 3. 恢复备份(--copy-back保留原备份)
[root@server ~]# mariabackup --copy-back --target-dir=/var/mariadb/backup/

# 4. 改权限(数据目录属主必须是mysql)
[root@server ~]# chown -R mysql:mysql /var/lib/mysql/

# 5. 启动服务
[root@server ~]# systemctl start mariadb

补充常用命令

  1. 修改表结构(ALTER TABLE)

    # 给staff表加一个gender字段(varchar类型,长度2)
    MariaDB [inventory]> ALTER TABLE staff ADD gender VARCHAR(2);
    
    # 修改age字段类型为INT(3)
    MariaDB [inventory]> ALTER TABLE staff MODIFY age INT(3);
    
    # 删除gender字段
    MariaDB [inventory]> ALTER TABLE staff DROP gender;
    
  2. 查看表的创建语句(CREATE TABLE)

    MariaDB [inventory]> SHOW CREATE TABLE product;  # 查看product表的创建细节
    
  3. 事务操作

    # 开始事务(一系列操作要么全成,要么全不成就)
    MariaDB [inventory]> BEGIN;
    # 执行操作(比如转账:A减100,B加100)
    MariaDB [inventory]> UPDATE account SET money=money-100 WHERE id=1;
    MariaDB [inventory]> UPDATE account SET money=money+100 WHERE id=2;
    # 确认无误,提交事务(生效)
    MariaDB [inventory]> COMMIT;
    # 如果出错,回滚(取消所有操作)
    MariaDB [inventory]> ROLLBACK;
    

网站公告

今日签到

点亮在社区的每一天
去签到