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
英文地址,請注明出處:http://en.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;天然線程安全&…