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 語句不區分大小寫(
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;