17.MariaDB 数据库管理

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 ServerType '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 -ADatabase 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;
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95430.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI抢饭碗,软件测试该何去何从?

AI 浪潮下&#xff0c;软件测试路在何方 当某大厂宣布 “AI 测试机器人上岗首日就覆盖 80% 的功能测试” 时&#xff0c;测试圈炸开了锅 —— 有人连夜更新简历&#xff0c;有人在技术论坛发问&#xff1a;“十年测试经验&#xff0c;难道真的不如一行 AI 代码&#xff1f;”AI…

09 ABP Framework 中的 MVC 和 Razor Pages

ABP Framework 中的 MVC 和 Razor Pages 该页面详细介绍了 ABP Framework 与 ASP.NET Core MVC 和 Razor Pages 的集成&#xff0c;涵盖框架组件、项目模板、主题系统和模块集成模式等内容&#xff0c;提供了 ABP 应用程序中传统的服务器端 Web UI 选项。 框架集成组件 ABP 提供…

docker 容器内编译onnxruntime

docker run -itd -p 49142:49142 --gpus "device0" --name cpp_env_20250812 --shm-size"5g" -v /本地路径/onnxruntime:/onnxruntime nvidia/cuda:11.8.0-cudnn8-devel-ubuntu20.04进入容器内安装必要的依赖git clone --branch v1.13.1 --recursive https…

-bash: ll: 未找到命令

“ll” 并不是 Linux 系统的原生命令&#xff0c;而是 “ls -l” 命令的一个常用别名&#xff08;快捷方式&#xff09;。提示 “-bash: ll: 未找到命令” 说明你的系统中没有配置这个别名&#xff0c;只需手动添加即可&#xff1a;步骤&#xff1a;添加 ll 别名编辑当前用户的…

docker network 与host的区别

所以docker run的时候只需要加入指定的network&#xff0c;就会从该network自动分配对应的ip是吗 是的&#xff0c;你的理解完全正确&#xff01; Docker 网络自动分配 IP 机制 当你使用 docker run 命令并指定网络时&#xff0c;Docker 会自动从该网络的子网中分配一个 IP 地址…

GPT-5 现已上线 DigitalOcean Gradient™ AI 平台!

OpenAI 于 8 月 7 日发布其最新人工智能模型 GPT-5。根据 OpenAI 介绍&#xff0c;GPT-5 在编程、数学、写作、视觉等方面的性能全面领先&#xff0c;幻觉更低&#xff0c;指令更准。新架构整合高速模型与深度推理&#xff0c;可实时切换速答或深思。近日&#xff0c;DigitalOc…

#C语言——学习攻略:自定义类型路线--结构体--结构体类型,结构体变量的创建和初始化,结构体内存对齐,结构体传参,结构体实现位段

&#x1f31f;菜鸟主页&#xff1a;晨非辰的主页 &#x1f440;学习专栏&#xff1a;《C语言学习》 &#x1f4aa;学习阶段&#xff1a;C语言方向初学者 ⏳名言欣赏&#xff1a;“人理解迭代&#xff0c;神理解递归。” 目录 1. 结构体类型 1.1 旧知识回顾 1.1.1 结构体声…

机器学习——TF-IDF算法

TF-IDF&#xff08;Term Frequency-Inverse Document Frequency&#xff09;是一种广泛应用于文本挖掘和信息检索领域的经典加权算法&#xff0c;主要用于评估一个词语在文档集合中的重要程度。其核心思想是&#xff1a;一个词语在文档中出现的频率越高&#xff0c;同时在所有文…

区块链技术原理(9)-什么是以太币

文章目录前言什么是加密货币&#xff1f;什么是以太币&#xff08;ETH&#xff09;铸造 ETH燃烧 ETHETH 面额传输 ETH查询 ETH以太币的经济模型&#xff1a;发行与流通以太币与其他代币的区别以太币的历史与市场地位总结前言 以太币&#xff08;Ether&#xff0c;简称 ETH&…

【Oracle APEX开发小技巧16】交互式网格操作内容根据是否启用进行隐藏/展示

在日常开发中&#xff0c;有想要根据某一状态或条件去限制/隐藏对应权限或操作按钮的情况&#xff0c;于是用简报模板列表进行展示&#xff0c;并提供以下功能&#xff1a;显示模板基本信息提供启用/禁用模板的开关提供编辑模板的入口根据模板状态显示不同的操作选项效果展示&a…

AIStarter:全网唯一跨平台桌面AI管理工具,支持Windows、Mac和Linux一键部署

AIStarter作为全网唯一支持Windows、Mac和Linux的桌面AI管理平台&#xff0c;为开发者提供高效的项目管理、模型插件和工作流共享体验。最近&#xff0c;熊哥发布了4.1.0版本更新视频&#xff0c;详细演示了如何在多平台上安装、使用和分享AI项目。本文基于视频内容&#xff0c…

AP模式/ESP32作为TCP服务端,转发串口接收的数据给网络调试助手

此代码为接收STM32的数据然后直接转发到网络调试助手,当有设备连接到esp32软件热点时会通过串口发送字符’a’给STM32,当有设备断开连接时会通过串口发送字符’b’,ESP32的TX:GPIO4, RX:GPIO5ESP32作为TCP服务器地址为192.168.4.1 监听端口为3333#include <string.h> #in…

kafka 中的Broker 是什么?它在集群中起什么作用?

Kafka中的Broker&#xff1a;集群的核心支柱 在分布式消息系统Apache Kafka中&#xff0c;Broker是构成Kafka集群的核心节点或服务器。 简单来说&#xff0c;每一个Broker就是运行着Kafka服务的一个实例&#xff0c;多台Broker共同协作&#xff0c;形成了强大的、可扩展的消息处…

【SOA用于噪声抑制】光纤DFB激光器中弛豫振荡噪声抑制

概述&#xff1a;本章记录了我们在光纤分布式反馈DFB激光器中使用饱和SOA来降低RIN的工作&#xff0c;以用于低频传感器应用。结果表明&#xff0c;放大器的增益动力学允许光纤激光器的弛豫振荡RO噪声分量减少30dB。 1 背景到目前为止&#xff0c;我研究了将饱和半导体光放大器…

神经网络的核心组件解析:从理论到实践

神经网络作为深度学习的核心技术&#xff0c;其复杂性常常令人望而却步。然而&#xff0c;尽管神经网络的结构、参数和计算过程看似繁琐&#xff0c;但其核心组件却是相对简洁且易于理解的。本文将深入探讨神经网络的四大核心组件——层、模型、损失函数与优化器&#xff0c;并…

Spring Boot项目通过Feign调用三方接口的详细教程

目录 一、环境准备 二、启用Feign客户端 三、定义Feign客户端接口 四、定义请求/响应DTO 五、调用Feign客户端 六、高级配置 1. 添加请求头&#xff08;如认证&#xff09; 2. 超时配置&#xff08;application.yml&#xff09; 3. 日志配置 七、错误处理 自定义错误…

ubuntu24.04安装 bpftool 以及生成 vmlinux.h 文件

文章目录前言一、apt安装二、源码安装三、生成vmlinux.h参考资料前言 $ cat /etc/os-release PRETTY_NAME"Ubuntu 24.04.2 LTS"$ uname -r 6.14.0-27-generic一、apt安装 安装bpftool&#xff1a; $ sudo apt install linux-tools-commonThe following NEW packa…

Pytorch FSDP权重分片保存与合并

注&#xff1a;本文章方法只适用Pytorch FSDP1的模型&#xff0c;且切分策略为SHARDED_STATE_DICT场景。 在使用FSDP训练模型时&#xff0c;为了节省显存通常会把模型权重也进行切分&#xff0c;在保存权重时为了加速保存通常每个进程各自保存自己持有的部分权重&#xff0c;避…

IDEA自动生成Mapper、XML和实体文件

1. 引入插件 <build><finalName>demo</finalName><plugins><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.5</version><depe…

单例模式的理解

目录单例模式1.饿汉式(线程安全)2.懒汉式(通过synchronized修饰获取实例的方法保证线程安全)3.双重校验锁的方式实现单例模式4.静态内部类方式实现单例模式【推荐】单例模式 1.饿汉式(线程安全) package 并发的例子.单例模式; // 饿汉式单例模式&#xff08;天然线程安全&…