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 语句不区分大小写(
SELECT
和select
一样),但数据库名、表名可能区分(看系统),习惯上 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)
查询表结构
用DESCRIBE
或DESC
看表的字段信息:
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
表示必须填)。Key
:PRI
表示主键(唯一标识一行,不能重复)。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 用户密码
编辑配置文件,加
skip-grant-tables
(跳过权限验证):[root@server ~]# vim /etc/my.cnf.d/mariadb-server.cnf [mysqld] skip-grant-tables=1 # 加这行
重启服务:
[root@server ~]# systemctl restart mariadb
无密码登录,改 root 密码:
[root@server ~]# mysql -u root # 直接进,不用密码 MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD('新密码') where USER='root'; MariaDB [(none)]> exit
删
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
补充常用命令
修改表结构(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;
查看表的创建语句(CREATE TABLE):
MariaDB [inventory]> SHOW CREATE TABLE product; # 查看product表的创建细节
事务操作:
# 开始事务(一系列操作要么全成,要么全不成就) 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;