5. MariaDB 数据库管理

MariaDB 数据库管理

个人笔记:

bash 复制代码
#日志排故
tail -f /var/log/mariadb/mariadb.log

一、MariaDB数据库基础概念

1.1 数据库定义

数据库,是一个存放计算机数据的仓库 , 是按照一定数据结构组织和存储计算机数据的仓库,可通过多种方法管理其中的数据。

1.2 数据结构

指数据的组织形式或数据之间的联系。

1.3 数据库种类

  • 早期三种流行模型
    • 层次式数据库:以层次模型建立,如文件系统、DNS。
    • 网状数据库:以网状模型建立,如网络通信。
    • 关系型数据库:以二维表模型建立,如图书馆管理系统。
  • 当今互联网常用模式
    • 关系型数据库:将复杂数据结构归结为二维表形式,对数据的操作基于关系表格,通过分类、合并、连接或选取等运算管理数据库,如Oracle、MySQL、PostgreSQL等。
    • 非关系型数据库(NoSQL):意为"Not Only SQL",是传统数据库的有效补充,典型产品有Redis(持久化缓存)、Mongodb、Memcached(纯内存)等。

1.4 关系数据库

关系数据库将结构化数据存储在相互关联的表中,便于组合信息处理和生成报告。关系数据库管理系统(RDBMS)用于管理关系数据库,多数支持使用结构化查询语言(SQL)查找和管理数据。

许多组织用关系数据库存储业务信息,如库存、销售和财务。很多支持动态内容的Web应用基于LAMP(LNMP)解决方案构建:

  • Linux:提供基本环境。
  • Apache HTTPS Server或Nginx:提供Web服务器。
  • MariaDB、MySQL或其他关系数据库(如PostgreSQL):存储站点数据。
  • Web服务器运行的编程语言(如PHP、Python等):更新数据库数据并动态构建网页。

1.5 MariaDB 介绍

1.基本概述

MariaDB是MySQL数据库的一个分支,由开源社区维护,采用GPL授权许可。因甲骨文公司收购MySQL后有闭源风险,MySQL开源社区分支出MariaDB。它完全兼容MySQL,包括API和命令行,可作为MySQL的替代品。

MariaDB可包含多个database,每个database包含多张表。

2 表的相关概念

关系数据库的表类似Excle工作表:

  • 表中的一行称为一个元组或一条记录。
  • 数据表中的每一列称为一个字段(属性),表由字段定义,每个字段有数据类型、长度等属性。
  • 行和列的交叉位置表示某个属性值。

二、MariaDB 部署

2.1 安装MariaDB

根据你的需求,服务端和客户端的安装操作本身与主机名(serverclient)无关,仅需在对应的服务器上执行相应命令即可:

  1. 在服务端服务器(主机名 [root@server ~])上安装服务端

    执行你提到的服务端安装命令:

    bash 复制代码
    root@server ~ 16:22:48]# yum install -y mariadb-server

    安装完成后,还需启动服务并设置开机自启(可选但推荐):

    bash 复制代码
    [root@server ~ 16:28:53]# systemctl start mariadb   # 启动服务
    [root@server ~ 16:34:08]# systemctl enable mariadb --now  # 设置开机自启
  2. 在客户端服务器(主机名 [root@client ~])上安装客户端

    执行你提到的客户端安装命令:

    bash 复制代码
    [root@client ~ 16:15:59]# yum install -y mariadb

安装完成后,客户端可通过 mysql 命令连接服务端(需确保服务端已启动且网络/防火墙允许连接),例如:(需后续配置)

bash 复制代码
# 在客户端执行,连接服务端(假设服务端IP为 10.1.8.10)
[root@client ~ 16:37:01]# mysql -h 10.1.8.10 -u lzh -p

2.2 启用并启动服务

bash 复制代码
[root@server ~]# systemctl enable mariadb --now

2.3 配置防火墙

bash 复制代码
[root@server ~]# firewall-cmd --permanent --add-service=mysql
[root@server ~]# firewall-cmd --reload

2.4 加固 MariaDB

MariaDB默认有test数据库和不安全配置,运行mysql_secure_installation修改,包括:

  • 为root帐户设置密码。
  • 禁止root帐户从本地主机外部访问数据库。
  • 删除匿名用户帐户。
  • 删除用于演示的test数据库。
bash 复制代码
[root@server ~]# mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      mariadbS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none): 
OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y  
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!


By default, a MariaDB installation has an anonymous user, allowing anyone
to log into MariaDB without having to have a user account created for
them.  This is intended only for testing, and to make the installation
go a bit smoother.  You should remove them before moving into a
production environment.

Remove anonymous users? [Y/n]  
 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This
ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] 
 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can
access.  This is also intended only for testing, and should be removed
before moving into a production environment.

Remove test database and access to it? [Y/n] 
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.

Reload privilege tables now? [Y/n] 
 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB
installation should now be secure.

Thanks for using MariaDB!

[root@server ~ 10:18:41]# mysql -u root
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 10
mariadb version: 5.5.68-MariaDB MariaDB mariadb

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> exit
Bye

2.5 连接 MariaDB

  • 通过套接字文件连接:客户端与服务器在同一台计算机时使用,更安全,但使用数据库的服务需在MariaDB服务器上运行,影响性能。
bash 复制代码
[root@server ~ ]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.68-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 
  • 通过TCP/IP网络连接 :远程服务器与MariaDB服务器在不同主机时使用,服务器需配置侦听3306/TCP端口。
    • 数据库服务器本机创建连接用户:
bash 复制代码
[root@server ~ 16:41:07]# mysql -u roott
#创建连接用户
MariaDB [(none)]> create user lzh@'%' identified by '123';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
  • 客户端测试:
bash 复制代码
[root@client ~ 16:44:59]# mysql -u lzh -h server -p123 

2.6 配置 MariaDB

默认情况下,MariaDB 侦听系统中所有网络地址上3306/TCP端口。

  • 配置文件
    • 主配置文件:/etc/my.cnf
    • 辅助配置文件:/etc/my.conf.d/*
  • /etc/my.cnf.d/mariadb-server.cnf 文件中[mysqld]块的主要参数
    • bind-address:指定侦听的网络地址,可设为单个IPv4/IPv6地址、::(所有地址)、空白(所有IPv4地址)、127.0.0.1或::1(仅本地访问)。
    • port:指定除3306/TCP外的网络端口。
    • skip-networking:设为1禁用网络连接,客户端需用套接字文件通信;设为0(默认)则侦听网络连接。
  • 客户端配置示例:
bash 复制代码
[root@client ~ 16:56:44]# vim /etc/my.cnf.d/mysql-clients.cnf
ini 复制代码
#在client客户端输入mysql,可直连接lzh用户的数据库
[mysql]
user=lzh         #登录用户名
password=123     #登录密码
host=server      #服务器主机名(需解析)
port=3306        #服务端口(默目标库认)
# database=test  #目标库

三、MariaDB 中 SQL

4.1 SQL 描述

SQL(Structured Query Language,结构化查询语言)是1986年10月由美国国家标准局颁布的数据库语言,国际标准化组织(ISO)也颁布了SQL国际标准。它是关系数据库最重要的操作语言,影响超出数据库领域。

SQL语句分类:

  • 数据查询语言(DQL):用于从表中获取数据,关键字有SELECT、WHERE、ORDER BY、GROUP BY、HAVING。
  • 数据操作语言(DML):包括INSERT、UPDATE、DELETE语句。
  • 数据定义语言(DDL):包括CREATE、DROP等语句,如创建表、删除表、添加索引等。
  • 事务处理语言(TPL):确保DML语句影响的表及时更新,语句有BEGIN TRANSACTION、COMMIT、ROLLBACK。
  • 数据控制语言(DCL):通过GRANT或REVOKE确定用户对数据库对象的访问权限。

4.2 连接数据库

mariadb软件包提供mysql命令,支持交互式和非交互式访问MariaDB。

  • 交互式执行:结果以ASCII表格式显示。
  • 非交互式执行:结果以制表符分隔格式显示。

示例:

bash 复制代码
[root@server ~ 17:02:08]# mysql -u root -h localhost -p

首次安装时,MariaDB默认root用户无需密码访问 ,若使用 -p ,则会被拒绝:

bash 复制代码
[root@server ~ 17:02:32]# mysql -u root
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 8
Server version: 10.3.17-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> 

[root@server ~ 17:02:38]# mysql -u root -p 
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

交互式SQL语句执行时,MariaDB提示符在方括号中显示当前选择的数据库。

4.3 数据库操作

4.3.1 查询数据库列表
bash 复制代码
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.019 sec)

数据库说明:

  • mysql:系统数据库,保存数据库用户及访问权限等信息。
  • INFORMATION_SCHEMA:保存数据库或数据表的元数据信息。
  • PERFORMANCE_SCHEMA:保存数据库服务器性能信息。
4.3.2 使用数据库

使用USE语句选择数据库,后续操作默认针对该数据库:

sql 复制代码
MariaDB [(none)]> USE 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]> 

SQL语句不区分大小写,但数据库名称区分大小写。通常数据库名称全为小写,SQL语句全为大写,以区分语句与目标或参数。

4.3.3 创建数据库
sql 复制代码
MariaDB [mysql]> CREATE DATABASE lzh;
Query OK, 1 row affected (0.010 sec)

MariaDB [mysql]> USE lzh;
Database changed
4.3.4 删除数据库

**DROP DATABASE语句删除数据库中的所有表和数据库,会破坏所有数据,只有具有 DROP**特权的用户可执行,不改变用户特权,重新创建同名数据库时旧权限仍有效。

sql 复制代码
MariaDB [(none)]> DROP DATABASE lzh;
Query OK, 0 rows affected (0.006 sec)

4.4 表操作

SQL的CRUD操作(create添加数据、read读取数据、update修改数据、delete删除数据)。

4.4.1 环境准备

拖入 [inventory.dump](5. Mariadb 服务器.images\inventory.dump) (需要的评论 , 私发给你)

bash 复制代码
# 导入备份
[root@server ~]# mysql -uroot  -e 'create database inventory;'
[root@server ~]# mysql -uroot  inventory < inventory.dump
4.4.2 查询表
查询表列表
bash 复制代码
# 查询表列表
MariaDB [(none)]> USE inventory;
MariaDB [inventory]> SHOW TABLES;
+---------------------+
| Tables_in_inventory |
+---------------------+
| category            |
| manufacturer        |
| product             |
+---------------------+
3 rows in set (0.001 sec)
查询表结构
bash 复制代码
MariaDB [inventory]> DESCRIBE product;
+-----------------+--------------+------+-----+---------+----------------+
| Field           | Type         | Null | Key | Default | Extra          |
+-----------------+--------------+------+-----+---------+----------------+
| id              | int(11)      | NO   | PRI | NULL    | auto_increment |
| name            | varchar(100) | NO   |     | NULL    |                |
| price           | double       | NO   |     | NULL    |                |
| stock           | int(11)      | NO   |     | NULL    |                |
| id_category     | int(11)      | NO   |     | NULL    |                |
| id_manufacturer | int(11)      | NO   |     | NULL    |                |
+-----------------+--------------+------+-----+---------+----------------+
6 rows in set (0.008 sec)

MariaDB [inventory]> 

输出各列含义:

  • Field:属性名称。
  • Type:属性数据格式,如stock为最多11位数字的整数。
  • Null:指示属性是否可为null。
  • Default:未指定属性时的默认值。
  • Key:显示属性是否为主键(primary key),主键是表中一行的唯一标识符。
  • Extra:额外信息,如id字段的auto_increment表示插入新条目时值自动增加。
查询表中数据
  • 查询表中所有记录所有字段:
bash 复制代码
MariaDB [inventory]> SELECT * FROM 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)
  • 查询表中所有记录特定字段:
bash 复制代码
MariaDB [inventory]> SELECT name,price,stock FROM product;
+-------------------+---------+-------+
| 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子句

筛选指定结果

bash 复制代码
MariaDB [inventory]> SELECT * FROM product WHERE price > 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)

条件操作数:

Operator Description
= 等于
<> 不等于(部分SQL版本可能为!=)
> 大于
< 小于
>= 大于等于
<= 小于等于
BETWEEN 在指定的包含范围内
LIKE 搜索匹配模式
IN 指定列的多个可能值
bash 复制代码
# 条件操作符包括:=、<>、>、<、>=、<=
MariaDB [inventory]> SELECT * FROM product WHERE price > 100;

# BETWEEN示例,匹配1到3之间(包括1和3)的记录
MariaDB [inventory]> SELECT * FROM product WHERE id BETWEEN 1 AND 3;

# IN示例,匹配id为1或3的记录;匹配名称为'Servers'或'Ssd'的记录
MariaDB [inventory]> SELECT * FROM product WHERE id IN (1,3);
MariaDB [inventory]> SELECT * FROM category WHERE name IN ('Servers','Ssd');

# LIKE示例,匹配名称包含'Server'的记录(%表示一个或多个字符)
MariaDB [inventory]> SELECT * FROM product WHERE name like '%Server%';

# 逻辑与AND示例,匹配名称包含'RD'且价格大于1000的记录
MariaDB [inventory]> SELECT * FROM product WHERE name like '%RD%' AND price>1000;

# 逻辑或OR示例,匹配名称包含'RD'或价格大于500的记录
MariaDB [inventory]> SELECT * FROM product WHERE name like '%RD%' OR price>500;

# ORDER BY示例,按价格升序排序;按价格降序排序
MariaDB [inventory]> SELECT * FROM product ORDER BY price;
MariaDB [inventory]> SELECT * FROM product ORDER BY price desc;
多表查询
bash 复制代码
# 示例1:查询产品类型是Servers的产品名称和价格
MariaDB [inventory]> SELECT product.name,product.price
FROM product,category
WHERE product.id_category = category.id 
AND category.name='Servers';

# 示例2:查询厂商是Lenovo的产品名称和价格
MariaDB [inventory]> SELECT product.name,product.price
FROM product,manufacturer 
WHERE product.id_manufacturer = manufacturer.id
AND manufacturer.name='Lenovo';
函数
bash 复制代码
# 示例1:查询产品价格平均值
MariaDB [inventory]> SELECT avg(price) FROM product;

# 示例2:查询产品价格最大值
MariaDB [inventory]> SELECT max(price) FROM product;

# 示例3:查询产品价格最小值
MariaDB [inventory]> SELECT min(price) FROM product;

# 示例4:查询产品存量总和
MariaDB [inventory]> SELECT sum(stock) FROM product;

# 示例5:查询产品价格最小值的产品信息
MariaDB [inventory]> SELECT * FROM product WHERE price=(SELECT min(price) FROM product);

# 示例6:查询Lenovo厂商提供的产品数量
MariaDB [inventory]> SELECT count(product.name)
FROM product,manufacturer 
WHERE product.id_manufacturer = manufacturer.id
AND manufacturer.name='Lenovo';

# GROUP BY示例,根据id_category分组,查询每组的存量总和
MariaDB [inventory]> SELECT id_category,sum(stock) FROM product GROUP BY id_category;
4.4.3 创建表
sql 复制代码
MariaDB [inventory]> CREATE TABLE staff(
id INT(11) NOT NULL,
name VARCHAR(100) NOT NULL,
age INT(11)  DEFAULT 10,
id_department INT(11) 
);
Query OK, 0 rows affected (0.017 sec)
MariaDB [inventory]> SHOW TABLES;
4.4.4 插入记录
bash 复制代码
MariaDB [inventory]> INSERT INTO staff (id,name,age,id_department)
VALUES (1,'lzh1',28,10);
MariaDB [inventory]> INSERT INTO staff (id,name,age) VALUES (2,'lzh2',20);
MariaDB [inventory]> INSERT INTO staff (id,name) VALUES (3,'lzh3');
4.4.5 更新记录
bash 复制代码
MariaDB [inventory]> UPDATE staff SET age=30 WHERE id=3;
MariaDB [inventory]> UPDATE staff SET age=30;

注意:如果使用不带WHERE子句的UPDATE,则表中的所有记录都会更新。

4.4.6 删除记录
bash 复制代码
MariaDB [inventory]> DELETE FROM staff WHERE id=3 ;
MariaDB [inventory]> DELETE FROM staff ;

注意:如果使用不带WHERE子句的DELETE子句,则表中的所有记录都会删除。

4.4.7 删除表
bash 复制代码
MariaDB [inventory]> DROP TABLE staff ;

四、管理 MariaDB 用户

4.1 创建用户账户

默认情况下,MariaDB的用户和密码与本地系统用户和密码分开,即名称相同的MariaDB用户和Linux用户是不同的。

创建新用户需以下权限之一:

  • MariaDB的root用户。
  • 被授予全局CREATE USER特权的用户。
  • 被授予对mysql数据库INSERT特权的用户。

使用CREATE USER语句在mysql数据库的user表中创建新记录,用户名格式为**user_name@host_name**,可根据主机源创建同名但特权不同的用户。

bash 复制代码
[root@server ~]# mysql
#  %可以从任意主机登录
MariaDB [(none)]> CREATE USER lzh@'%' IDENTIFIED BY '123';
#权限重载
MariaDB [(none)]>flush privileges 

当前,lzh 帐户只能使用密码123从**%**连接。

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

bash 复制代码
MariaDB [mysql]> SELECT host,user,password FROM user WHERE user = 'lzh';
+-----------+--------+-------------------------------------------+
| host      | user   | password                                  |
+-----------+--------+-------------------------------------------+
| %         | lzh | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 |
+-----------+--------+-------------------------------------------+
1 row in set (0.000 sec)

用户帐户定义示例:

Account Description
lzh或者lzh@'%' 用户lzh可从任何主机连接
lzh@'localhost' 用户lzh只能从本地主机连接
lzh@'192.168.1.5' 用户lzh只能从IP地址192.168.1.5连接
lzh@'192.168.1.%' 用户lzh可从192.168.1.0/24网络的任何地址连接
lzh@'2001:db8:18:b51:c32:a21' 用户lzh可从IP地址2001:db8:18:b51:c32:a21连接

4.2 控制用户权限

新帐户默认被授予最小特权,不授予其他特权时,大多数操作被拒绝。

示例:

bash 复制代码
[root@server ~]# mysql -u lzh -p
Enter password: 123
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 12
mariadb version: 10.3.17-MariaDB MariaDB mariadb

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
#同时看授权身份
MariaDB [(none)]> SELECT USER();
+------------------+
| USER()           |
+------------------+
| lzh@localhost |
+------------------+
1 row in set (0.003 sec)
#列出当前用户可查看的数据库
MariaDB [(none)]> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
+--------------------+
1 row in set (0.004 sec)

MariaDB [(none)]> USE mysql;
ERROR 1044 (42000): Access denied for user 'lzh'@'localhost' to database 'mysql'
MariaDB [(none)]> CREATE DATABASE inventory;
ERROR 1044 (42000): Access denied for user 'lzh'@'localhost' to database 'inventory'
MariaDB [(none)]>

privileges是用户在MariaDB中拥有的能力,确定用户可以做什么以及用户在MariaDB中可以做什么。特权按范围进行组织:

  • 全局特权 ,用于管理MariaDB数据库服务器本身,例如CREATE USER

  • 数据库特权 ,用于在MariaDB服务器上创建数据库和使用数据库,例如CREATE DATABASE

  • 表特权 ,用于在特定数据库中创建表和处理数据,例如CRUD命令。

    CRUD 是指在做计算处理时的增加(Create)、查询(Retrieve)(重新得到数据)、更新(Update)和删除(Delete)几个单词的首字母简写。

  • 列特权,用于授予类似表的命令用法,但用于特定的列(通常很少见)。

详情参考本节末尾引用的MariaDB文档。

4.2.1 查询用户权限
bash 复制代码
MariaDB [(none)]> SHOW GRANTS FOR root@localhost;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*84BB5DF4823DA319BBF86C99624479A198E6EEE9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION                                                                          |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.006 sec)
4.2.2 授予用户权限

GRANT 语句用于授予特权,连接用户需有GRANT OPTION必须具有要授予的特定特权

示例:root用户向lzh用户授予inventory数据库中category表的CRUD特权

bash 复制代码
[root@server ~]# mysql -u root -p
Enter password: 123

MariaDB [(none)]> GRANT SELECT, UPDATE, DELETE, INSERT
    -> ON inventory.category
    -> TO lzh@'%';
Query OK, 0 rows affected (0.006 sec)

MariaDB [inventory]> exit
Bye

验证权限:

bash 复制代码
[root@server ~]# mysql -u lzh -p
Enter password: 123

MariaDB [(none)]> USE inventory;
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 [inventory]> SELECT * FROM category;
+----+------------+
| id | name       |
+----+------------+
|  1 | Networking |
|  2 | Servers    |
|  3 | Ssd        |
+----+------------+
3 rows in set (0.004 sec)

授权示例

Grant Description
GRANT SELECT ON database.table TO username@hostname 向特定用户授予特定数据库中特定表的SELECT特权
GRANT SELECT ON database. TO username@hostname* 向特定用户授予特定数据库中所有表的SELECT特权
GRANT SELECT ON *.* TO username@hostname 向特定用户授予所有数据库中所有表的SELECT特权
GRANT CREATE, ALTER, DROP ON database. to username@hostname* 向特定用户授予特定数据库中创建、修改、删除表的特权
GRANT ALL PRIVILEGES ON *.* to username@hostname 向特定用户授予所有数据库的所有可用特权,相当于超级用户root
4.2.3 回收用户权限

REVOKE 语句从帐户中删除特权,连接用户需有GRANT OPTION且具有被撤消的特定特权。

bash 复制代码
MariaDB [(none)]> REVOKE SELECT, UPDATE, DELETE, INSERT
    -> ON inventory.category FROM lzh@localhost;
Query OK, 0 rows affected (0.011 sec)

4.3 删除用户

不再需要特定用户帐户时,使用DROP USER删除,用户名格式为'user'@'host'

bash 复制代码
MariaDB [(none)]> DROP USER lzh@localhost;
Query OK, 0 rows affected (0.001 sec)

注意:删除当前连接的帐户,在关闭连接后才会生效。

4.4 更改用户密码

bash 复制代码
# root用户修改普通用户账户密码
MariaDB [(none)]> USE mysql;
MariaDB [(mysql)]> UPDATE user SET password=PASSWORD('123') WHERE user='lzh' and host='localhost';

# 或者
MariaDB [(none)]> SET PASSWORD FOR 'lzh'@'localhost' = PASSWORD('123');

# 普通用户修改自己账户密码
MariaDB [(none)]> SET PASSWORD = PASSWORD('123');
MariaDB [(none)]> FLUSH PRIVILEGES;

4.5 排故数据库访问

问题 解决方法
已授予用户从任何主机连接权限,但只能本地连接 若配置文件/etc/my.cnf.d/mariadb-server.cnf中设了skip-networking,删除该指令并重启服务
用户可本地连接,但不能远程连接 确保/etc/my.cnf.d/mariadb-server.cnf中的bind-address配置正确,且用户表包含用户连接主机的条目
用户可连接,但除information_schema外看不到其他数据库 确保已授予用户访问其数据库的权限,新用户默认权限最小会有此问题
用户可连接,但不能创建数据库 考虑授予用户全局CREATE特权(也会授予DROP特权)
用户可连接,但不能读取或写入数据 授予用户所使用数据库的CRUD特权

4.6 忘记 root 用户密码

  1. 编辑**/etc/my.cnf.d/server.cnf**配置文件,在[mysqld]下添加skip-grant-tables=1
  2. 重启mariadb服务。
  3. 执行mysql -u root命令进入mysql命令行,修改root用户密码:
bash 复制代码
[root@server ~]# mysql -u root
MariaDB [(none)]> UPDATE mysql.user SET password=PASSWORD('新密码') where USER='root';
MariaDB [(none)]> exit
  1. 注释掉**/etc/my.cnf.d/mariadb-server.cnf配置文件中的skip-grant-tables=1,重启mariadb**服务。

五、备份和恢复MariaDB

5.1 备份方式

5.1.1 逻辑备份
  • 特点:将数据库导出为包含SQL命令的文本文件,通过查询数据库检索结构,备份速度较慢,可移植性高,服务器联机时执行,不包括日志或配置文件。
5.1.2 物理备份
  • 特点:复制原始数据库目录和文件,可包括日志和配置文件,仅可移植到类似软硬件的计算机,比逻辑备份快,服务器脱机或表锁定时执行以防备份期间更改。

5.2 执行备份

5.2.1 执行逻辑备份

运行mysqldump时连接的MariaDB用户至少需对转储表有SELECT特权,对转储视图有SHOW VIEW,对转储触发器有TRIGGER特权。

语法:

bash 复制代码
Usage: mysqldump [OPTIONS] database [tables]
OR     mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
OR     mysqldump [OPTIONS] --all-databases [OPTIONS]

常用选项:

bash 复制代码
  -A, --all-databases:备份所有数据库
  --ignore-database=name:不备份指定数据库,与--all-databases一起使用
  -B, --databases:备份多个数据库
  -Y, --all-tablespaces:备份所有表空间
  --ignore-table=name:不备份指定表,需指定数据库和表名
  -y, --no-tablespaces:不备份任何表空间信息
  --add-drop-database:每个创建前添加DROP DATABASE
  --add-drop-table:每个创建前添加DROP TABLE
  -x, --lock-all-tables:锁定所有数据库的所有表,关闭--single-transaction和--lock-tables

示例:

bash 复制代码
[root@server ~]# mysqldump -u root -p inventory > /backup/inventory.dump
[root@server ~]# mysqldump -u root -p --all-databases > /backup/mariadb.dump
5.2.2 执行物理备份

mariabackup工具由AppStream存储库中的mariadb-backup包提供,执行完整物理备份。

bash 复制代码
# 安装mariadb-backup
[root@server ~]# yum install mariadb-backup

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

# 执行备份
[root@server ~]# mariabackup --backup --target-dir /var/mariadb/backup/ \
> --user root --password 123

为避免交互式输入密码,可配置在文件中:

bash 复制代码
[root@server ~]# cat /etc/my.cnf.d/mariabackup.cnf
[xtrabackup]
user=root
password=123

也可创建具有RELOAD、LOCK TABLES和REPLICATION CLIENT权限的用户执行备份。

5.3 执行恢复

还原备份会覆盖数据库服务器内容,新数据会丢失。

5.3.1 恢复逻辑备份
bash 复制代码
[root@server ~]# mysql -u root -p inventory < /backup/mariadb.dump
5.3.2 恢复物理备份

mariabackup工具恢复选项:

  • --copy-back:保留原始备份文件。
  • --move-back:将备份文件移动到数据目录,删除原始备份文件。

操作过程:

bash 复制代码
# 停止mariadb服务
[root@server ~]# systemctl stop mariadb

# 确保数据库数据目录是空
[root@server ~]# grep '^datadir' /etc/my.cnf.d/mariadb-server.cnf
datadir=/var/lib/mysql
[root@server ~]# rm -rf /var/lib/mysql/*

# 恢复备份
[root@server ~]# mariabackup --copy-back --target-dir=/var/mariadb/backup/

# 修改数据目录权限
[root@server ~]# chown -R mysql:mysql /var/lib/mysql/

# 启动mariadb服务
[root@server ~]# systemctl start mariadb
相关推荐
宠..1 小时前
创建标签控件
java·服务器·开发语言·前端·c++·qt
_lst_1 小时前
Linux进程切换与调度
linux·运维·服务器
w***95491 小时前
运维实战---多种方式在Linux中部署并初始化MySQL
linux·运维·mysql
n***84071 小时前
防火墙安全策略(基本配置)
服务器·php·apache
双子座断点1 小时前
Ubuntu 硬盘扩容
linux·运维·ubuntu
❀搜不到1 小时前
问题:Ubuntu设置没有WiFi,且蓝牙也无法打开
linux·运维·ubuntu
last demo1 小时前
smb服务器
linux·运维·服务器·nginx
d***9351 小时前
在Linux系统上使用nmcli命令配置各种网络(有线、无线、vlan、vxlan、路由、网桥等)
linux·服务器·网络
聊聊MES那点事1 小时前
Prosys OPC UA Forge:开发OPC UA服务器的工具
服务器·网络·opc·opc ua