第01章 初識MySQL與mysql8.0的安裝

初識 MySQL

文章目錄

  • 初識 MySQL
      • 引言
    • 一、數據庫基礎
      • 1.1 什么是數據庫
      • 1.2 表
      • 1.3 數據類型
      • 1.4 主鍵
    • 二、數據庫技術構成
      • 2.1 數據庫系統
      • 2.2 SQL 語言
        • 2.2.1 數據定義語言(DDL)
        • 2.2.2 數據操作語言(DML)
        • 2.2.3 數據查詢語言(DQL)
        • 2.2.4 數據控制語言(DCL)
      • 2.3 數據庫訪問技術
    • 三、什么是 MySQL
      • 3.1 客戶機 - 服務器軟件(C/S 架構)
      • 3.2 MySQL 版本
      • 3.3 MySQL 的優勢
        • 3.3.1 速度與性能
        • 3.3.2 成本優勢
        • 3.3.3 易用性
        • 3.3.4 可移植性
        • 3.3.5 豐富接口
        • 3.3.6 安全性與連接性
    • 四、MySQL 的安裝
      • 4.1 MySQL 的編譯安裝
        • 4.1.1 準備工作
          • 4.1.1.1 卸載 MariaDB 并安裝依賴包
          • 4.1.1.2 關閉 SELinux 和防火墻
          • 4.1.1.3 安裝 cmake 編譯工具
          • 4.1.1.4 安裝 Boost 庫
        • 4.1.2 源碼編譯及安裝
          • 4.1.2.1 創建運行用戶
          • 4.1.2.2 解包源碼
          • 4.1.2.3 配置編譯參數
          • 4.1.2.4 編譯安裝
        • 4.1.3 安裝后的調整
          • 4.1.3.1 建立配置文件
          • 4.1.3.2 初始化數據庫
          • 4.1.3.3 設置環境變量
        • 4.1.4 添加系統服務
          • 4.1.4.1 復制服務腳本
          • 4.1.4.2 創建 systemd 服務配置
          • 4.1.4.3 驗證服務啟動
      • 4.2 MySQL 的二進制安裝
        • 4.2.1 基礎環境準備
          • 4.2.1.1 安裝基礎工具和依賴包
          • 4.2.1.2 創建運行用戶并關閉安全限制
        • 4.2.2 二進制安裝
          • 4.2.2.1 解壓安裝包并配置
        • 4.2.3 設定配置文件
        • 4.2.4 配置 systemctl 啟動
      • 總結

引言

? 在當今這個數字化飛速發展的時代,數據已經成為了各個行業最為寶貴的資產之一,如同工業時代的石油一樣,驅動著企業的決策、創新和發展。而數據庫作為存儲和管理這些海量數據的核心工具,其重要性不言而喻。它能夠將無序的數據進行結構化組織,使得數據的存儲、查詢、更新和刪除等操作變得高效且可靠。MySQL 作為一款開源的關系型數據庫管理系統,憑借其高性能、易用性和可擴展性等顯著優勢,在眾多領域得到了廣泛的應用。無論是小型企業的業務系統,如小型電商平臺的訂單管理、客戶信息存儲,還是大型互聯網公司的海量數據存儲,像社交媒體平臺的用戶動態、交易記錄等,MySQL 都能發揮出強大的作用。本文將全面且深入地介紹 MySQL 的基礎知識、技術構成、安裝方法以及相關工具的使用,旨在幫助讀者全面了解和掌握 MySQL,為后續的學習和實踐打下堅實的基礎。

一、數據庫基礎

1.1 什么是數據庫

??數據庫,簡單來說,就是按照特定規則組織起來的數據集合。它的本質是對現實世界數據進行抽象建模,將現實中的各種信息以一種結構化的方式存儲起來,以便于管理和使用。從發展歷程來看,數據庫技術經歷了三個重要階段。

??在 20 世紀 60 - 70 年代,數據庫技術處于層次與網狀數據庫階段。這一階段的數據庫以樹形或網絡結構來存儲數據,例如 IBM 的 IMS 系統。這種結構適合處理具有固定層級關系的數據,數據之間的關系就像一棵樹,每個節點有特定的父節點和子節點。然而,它的靈活性較差,當數據關系發生變化時,修改數據庫結構會比較困難。比如,如果要在一個樹形結構的數據庫中添加一個新的分支,可能需要對整個樹的結構進行調整,這會帶來很大的工作量和風險。

??到了 20 世紀 80 年代至今,數據庫技術進入了關系型數據庫階段。基于關系模型,關系型數據庫將數據組織成表的形式,表由行和列組成。通過 SQL(結構化查詢語言)可以方便地對數據進行操作。MySQL、Oracle 等都是這一階段的代表產品。關系型數據庫的優勢在于具備標準化的查詢方式和數據完整性保障機制,能夠有效地處理各種復雜的業務邏輯。例如,在一個電商系統中,可以通過 SQL 語句方便地查詢某個用戶的所有訂單信息,同時通過主鍵、外鍵等約束條件確保訂單數據的準確性和一致性。

??21 世紀初至今,隨著互聯網的發展,出現了海量的非結構化數據,傳統的關系型數據庫在處理這些數據時面臨挑戰。于是,NoSQL 數據庫應運而生,如 MongoDB 等。同時,像 MySQL 也引入了分布式架構,如 MySQL Cluster,以應對大規模數據存儲和高并發訪問的需求。數據庫具有以下核心特點:

??結構化存儲方面,數據按照表結構進行組織,每個表有固定的列和數據類型。這種結構便于對數據進行索引和查詢。例如,電商訂單可以按照表的形式存儲,每一行代表一個訂單,每一列代表訂單的一個屬性,如訂單 ID、客戶姓名、訂單金額等。通過對訂單 ID 建立索引,可以快速地查詢某個特定訂單的信息。

??數據共享支持多個用戶同時訪問數據庫。不同的部門或系統可以同時調用數據庫中的數據。比如,客服系統和物流系統可以同時訪問訂單數據庫,獲取訂單的相關信息,提高工作效率。客服人員可以根據訂單信息為客戶提供服務,物流人員可以根據訂單信息安排發貨和配送。

??完整性控制通過主鍵、外鍵等約束條件確保數據的準確性和一致性。例如,在訂單表中,訂單商品 ID 必須關聯商品表中存在的記錄,這樣可以避免出現無效的商品 ID,保證數據的完整性。如果沒有這種約束,可能會出現訂單中記錄的商品 ID 在商品表中不存在的情況,導致數據混亂。

??安全控制支持用戶權限管理,不同的用戶或用戶組具有不同的訪問權限。例如,僅財務部門的用戶可以查看訂單金額字段,其他部門的用戶只能查看訂單的基本信息,從而保護數據的安全性。通過這種方式,可以防止敏感數據被不相關的人員訪問和泄露。

1.2 表

??數據庫表是關系型數據庫的核心存儲單元,它呈現為二維數組結構,由行(記錄)和列(字段)組成。以電商訂單表為例,列(字段)定義了數據的屬性。例如,order_id(訂單 ID)用于唯一標識一個訂單,customer_name(客戶姓名)記錄下單的客戶姓名。每一列都需要指定數據類型和約束條件,數據類型決定了該列可以存儲的數據格式,約束條件則對數據的取值范圍和規則進行限制。比如,order_id 通常定義為整數類型,并且設置為唯一且非空,以確保每個訂單都有一個唯一的標識。

??行(記錄)代表一條完整的業務數據。例如,某用戶的具體訂單信息就是一行記錄,它包含了該訂單的所有屬性值,并且需要滿足所有列的約束條件。如果一個訂單記錄中的 order_id 與其他記錄重復,或者 customer_name 為空,那么這條記錄就是不符合要求的。

??表設計遵循數據庫范式理論,主要包括以下三種范式:

??第一范式(1NF)要求列不可再分。例如,地址字段通常需要拆分為省、市、區等更細的字段,這樣可以確保每個字段只包含單一的數據信息,便于數據的處理和查詢。如果地址字段不拆分,當需要查詢某個城市的所有訂單時,就會變得非常困難。

??第二范式(2NF)要求非主鍵字段完全依賴主鍵。在訂單明細表中,商品價格依賴于訂單 ID 和商品 ID,只有同時確定這兩個主鍵字段,才能唯一確定商品價格,避免了數據的冗余和不一致性。如果商品價格只依賴于商品 ID,而不考慮訂單 ID,那么在不同的訂單中可能會出現同一商品不同價格的情況,導致數據混亂。

??第三范式(3NF)要求消除傳遞依賴。例如,在員工表中,部門電話通過部門 ID 關聯到部門表中獲取,而不是直接存儲在員工表中,這樣可以減少數據的冗余,提高數據的維護性。如果部門電話直接存儲在員工表中,當部門電話發生變化時,需要更新所有該部門員工的記錄,容易出現遺漏和錯誤。

1.3 數據類型

??MySQL 8.0 支持豐富的數據類型,合理選擇數據類型可以優化存儲和查詢性能。以下是一些常見的數據類型及其特點和應用場景:

??整數類型包括 TINYINT、SMALLINT、INT/INTEGER 和 BIGINT。TINYINT 占用 1 字節,取值范圍為 -128 到 127,常用于表示布爾值(0/1)、狀態碼等,占用空間小。例如,在一個用戶表中,可以用 TINYINT 來表示用戶的是否激活狀態,0 表示未激活,1 表示激活。SMALLINT 占用 2 字節,取值范圍為 -32768 到 32767,可用于存儲年齡、非跨世紀年份等數據。INT/INTEGER 占用 4 字節,取值范圍約為 ±21 億,適合作為用戶 ID、訂單編號等唯一標識。BIGINT 占用 8 字節,取值范圍約為 ±9.2×10^18,用于存儲分布式 ID、天文數據等大數值。

??浮點數類型有 FLOAT 和 DOUBLE。FLOAT 占用 4 字節,是單精度浮點,適用于商品評分等非精確計算的場景,精度相對較低。例如,在一個商品評價系統中,可以用 FLOAT 來存儲商品的評分,因為評分不需要非常高的精度。DOUBLE 占用 8 字節,是雙精度浮點,可用于科學計算、高精度數值等需要較高精度的場景。

??定點小數類型為 DECIMAL(p, s),其中 p 為總位數,s 為小數位。常用于財務數據,如金額(¥199.99),可以精確表示小數。在處理財務數據時,精確的小數表示非常重要,因為一點小的誤差可能會導致嚴重的財務問題。

??二進制類型包括 BINARY 和 VARBINARY。BINARY 是固定長度二進制,最大 255 字節,可用于存儲加密數據、圖片二進制流等。VARBINARY 是可變長度二進制,最大 65535 字節,適用于存儲動態二進制數據,根據實際數據長度分配空間。

??日期/時間類型有 DATE、TIME、DATETIME 和 TIMESTAMP。DATE 格式為 YYYY - MM - DD,常用于記錄生日、訂單日期等只需要日期信息的場景。TIME 格式為 HH:MM:SS,可用于表示營業時間、航班時刻等時間信息。DATETIME 格式為 YYYY - MM - DD HH:MM:SS,用于記錄訂單創建時間等同時包含日期和時間的信息。TIMESTAMP 自動更新當前時間,時間范圍為 1970 - 2038 年,通常用于記錄數據的最后修改時間,當數據更新時會自動更新該字段的值。

??字符串類型包括 CHAR(n)、VARCHAR(n)、TEXT 和 JSON。CHAR(n) 是固定長度字符串,適用于存儲長度固定的數據,如身份證號(固定 18 位),不足長度時會用空格填充。VARCHAR(n) 是可變長度字符串,常用于存儲用戶名等長度可變的數據,根據實際存儲的字符串長度分配空間。TEXT 是長文本,最大 65535 字節,可用于存儲商品描述、文章內容等較長的文本信息。JSON 是結構化 JSON 數據,用于存儲配置項、非結構化元數據等,方便處理和查詢復雜的嵌套數據。

1.4 主鍵

??主鍵是表中唯一標識每條記錄的字段或字段組合,是關系型數據庫的核心約束之一,具有以下特性:

??唯一性方面,主鍵值在表中不能重復,每個值只能對應一條記錄。例如,user_id 作為用戶表的主鍵,每個 user_id 值只能對應一個用戶,確保了數據的唯一性。如果出現重復的 user_id,就無法準確區分不同的用戶。

??非空性要求主鍵字段不允許為 NULL,這是為了確保每條記錄都有一個有效的標識。如果主鍵字段可以為 NULL,那么就無法唯一確定一條記錄。比如,在一個訂單表中,如果 order_id 可以為 NULL,那么就無法確定哪些記錄是有效的訂單。

??永久性方面,主鍵值盡量不要隨著業務的變化而修改,因為修改主鍵值可能會導致關聯表的引用失效。例如,如果修改了訂單表的 order_id,那么與之關聯的訂單明細表中的 order_id 也需要相應修改,否則會出現數據不一致的問題。

??MySQL 8.0 支持以下兩種主鍵類型:

??單列主鍵使用單個字段作為主鍵。例如,order_id 可以作為訂單表的主鍵,并且可以設置為自增字段(AUTO_INCREMENT 屬性),這樣在插入新記錄時,order_id 會自動遞增,方便管理和維護。以下是創建一個包含單列主鍵的訂單表的示例:

CREATE TABLE orders (order_id INT AUTO_INCREMENT PRIMARY KEY,customer_name VARCHAR(50),order_date DATE
);

??在這個例子中,order_id 是單列主鍵,并且使用了 AUTO_INCREMENT 屬性。當插入新記錄時,order_id 會自動分配一個唯一的值。CREATE TABLE 是用于創建表的 SQL 命令,orders 是表的名稱。order_id 是列名,INT 表示整數類型,AUTO_INCREMENT 表示自增屬性,PRIMARY KEY 表示該列為主鍵。customer_name 是列名,VARCHAR(50) 表示可變長度字符串,最大長度為 50。order_date 是列名,DATE 表示日期類型。

??復合主鍵由多個字段組合作為主鍵。例如,在訂單明細表中,(order_id, product_id) 可以作為復合主鍵,確保每個訂單中的每個商品都是唯一的。以下是創建一個包含復合主鍵的訂單明細表的示例:

CREATE TABLE order_details (order_id INT,product_id INT,quantity INT,PRIMARY KEY (order_id, product_id)
);

??在這個例子中,order_idproduct_id 組合成復合主鍵,只有這兩個字段的值都相同時,才認為是重復記錄。CREATE TABLE 是用于創建表的 SQL 命令,order_details 是表的名稱。order_idproduct_id 是列名,INT 表示整數類型。quantity 是列名,INT 表示整數類型。PRIMARY KEY (order_id, product_id) 表示 order_idproduct_id 組合為主鍵。

??需要注意的是,MySQL 建議每張表都設置主鍵。如果沒有顯式設置主鍵,InnoDB 會自動生成一個隱藏的 ROW_ID,但這可能會影響性能。

二、數據庫技術構成

2.1 數據庫系統

??數據庫系統由硬件、軟件、數據和用戶四個部分構成,其核心組件包括:

??數據庫(Database)是物理存儲數據的文件集合。在 MySQL 中,根據不同的存儲引擎,數據庫表現為不同的文件格式,如 InnoDB 存儲引擎使用 .ibd 文件,MyISAM 存儲引擎使用 .MYD 文件。不同的存儲引擎具有不同的物理結構和特點,用戶可以根據實際需求選擇合適的存儲引擎。例如,InnoDB 支持事務和外鍵,適合處理高并發的事務性應用;MyISAM 不支持事務,但具有較高的讀寫性能,適合處理大量的只讀數據。

??數據庫管理系統(DBMS)是數據庫系統的核心軟件層,負責數據的存儲、查詢、更新和安全控制等操作。MySQL 8.0 提供了 Query Optimizer(查詢優化器)、Transaction Engine(事務引擎)等組件,這些組件協同工作,提高了數據庫的性能和可靠性。查詢優化器可以根據 SQL 語句和數據庫的統計信息,選擇最優的查詢執行計劃,從而提高查詢性能。事務引擎可以保證事務的原子性、一致性、隔離性和持久性,確保數據的完整性和一致性。

??數據庫應用程序是面向用戶的應用層,通過 API 或框架與數據庫進行交互。例如,Java 可以通過 JDBC(Java Database Connectivity)連接 MySQL 數據庫,Python 可以通過 pymysql 庫連接 MySQL 數據庫,方便開發人員進行數據的讀寫操作。開發人員可以使用這些 API 或框架,將數據庫操作集成到自己的應用程序中,實現各種業務功能。

2.2 SQL 語言

??SQL(Structured Query Language)是操作關系型數據庫的標準語言,MySQL 8.0 完全兼容并擴展了 SQL 語言,它可以分為四大類:

2.2.1 數據定義語言(DDL)

??用于定義數據庫對象,如數據庫、表、索引、視圖等。常見的 DDL 命令及其說明如下:

??CREATE DATABASE db_name; 用于創建一個新的數據庫。以下是創建一個名為 e_commerce 的數據庫的示例:

CREATE DATABASE e_commerce;

??CREATE DATABASE 是用于創建數據庫的 SQL 命令,e_commerce 是數據庫的名稱。執行這個命令后,系統會在磁盤上創建一個新的數據庫目錄,用于存儲該數據庫的數據和元數據。

??CREATE TABLE table_name (col1 INT PRIMARY KEY, col2 VARCHAR(50)); 用于創建一個新的表,需要指定表名和列的定義。以下是創建一個名為 users 的表,包含 user_iduser_name 兩列的示例:

CREATE TABLE users (user_id INT PRIMARY KEY,user_name VARCHAR(50)
);

??CREATE TABLE 是用于創建表的 SQL 命令,users 是表的名稱。user_id 是列名,INT 表示整數類型,PRIMARY KEY 表示該列為主鍵。user_name 是列名,VARCHAR(50) 表示可變長度字符串,最大長度為 50。執行這個命令后,系統會在指定的數據庫中創建一個新的表,用于存儲用戶數據。

??ALTER TABLE table_name ADD COLUMN new_col DATETIME; 用于修改表的結構,如添加列。以下是在 users 表中添加一個 register_time 列的示例:

ALTER TABLE users ADD COLUMN register_time DATETIME;

??ALTER TABLE 是用于修改表結構的 SQL 命令,users 是表的名稱。ADD COLUMN 表示添加列,register_time 是新列的名稱,DATETIME 表示日期時間類型。執行這個命令后,系統會在 users 表中添加一個新的列,用于存儲用戶的注冊時間。

??DROP TABLE table_name; 用于刪除指定的表。以下是刪除 users 表的示例:

DROP TABLE users;

??DROP TABLE 是用于刪除表的 SQL 命令,users 是表的名稱。執行這個命令后,系統會從數據庫中刪除指定的表及其所有數據和元數據。

??CREATE INDEX idx_name ON table_name(col); 用于創建索引,提高查詢性能。以下是在 users 表的 user_name 列上創建一個索引的示例:

CREATE INDEX idx_user_name ON users(user_name);

??CREATE INDEX 是用于創建索引的 SQL 命令,idx_user_name 是索引的名稱,users 是表的名稱,user_name 是要創建索引的列名。執行這個命令后,系統會在 users 表的 user_name 列上創建一個索引,加快對該列的查詢速度。

2.2.2 數據操作語言(DML)

??用于操作表中的數據,常見的 DML 命令及其說明如下:

??INSERT INTO table_name (col1, col2) VALUES (val1, val2); 用于向表中插入新的數據。以下是向 users 表中插入一條記錄的示例:

INSERT INTO users (user_id, user_name) VALUES (1, 'John');

??INSERT INTO 是用于向表中插入數據的 SQL 命令,users 是表的名稱。(user_id, user_name) 是要插入數據的列名,(1, 'John') 是要插入的數據值。執行這個命令后,系統會在 users 表中插入一條新的記錄,包含 user_id 為 1 和 user_name 為 ‘John’ 的數據。

??UPDATE table_name SET col1 = new_val WHERE condition; 用于更新表中的數據,需要指定更新的列和更新條件。以下是將 users 表中 user_id 為 1 的記錄的 user_name 更新為 Mike 的示例:

UPDATE users SET user_name = 'Mike' WHERE user_id = 1;

??UPDATE 是用于更新表中數據的 SQL 命令,users 是表的名稱。SET user_name = 'Mike' 表示將 user_name 列的值更新為 ‘Mike’,WHERE user_id = 1 表示更新 user_id 為 1 的記錄。執行這個命令后,系統會將 users 表中 user_id 為 1 的記錄的 user_name 更新為 ‘Mike’。

??DELETE FROM table_name WHERE condition; 用于刪除表中滿足條件的數據。以下是刪除 users 表中 user_id 為 1 的記錄的示例:

DELETE FROM users WHERE user_id = 1;

??DELETE FROM 是用于刪除表中數據的 SQL 命令,users 是表的名稱,WHERE user_id = 1 表示刪除 user_id 為 1 的記錄。執行這個命令后,系統會從 users 表中刪除 user_id 為 1 的記錄。

??TRUNCATE TABLE table_name; 用于清空表中的所有數據,比 DELETE 命令更高效,因為它不會記錄刪除操作的日志。以下是清空 users 表的示例:

TRUNCATE TABLE users;

??TRUNCATE TABLE 是用于清空表中數據的 SQL 命令,users 是表的名稱。執行這個命令后,系統會快速清空 users 表中的所有數據,并且不會記錄刪除操作的日志。

2.2.3 數據查詢語言(DQL)

??用于檢索表中的數據,核心命令是 SELECT。MySQL 8.0 增強了查詢功能,如支持 CTE(公共表表達式)。以下是查詢年齡大于 18 歲的用戶的姓名和郵箱,按注冊時間降序排列,取前 10 條記錄的示例:

SELECT user_name, email 
FROM users 
WHERE age > 18 
ORDER BY register_time DESC 
LIMIT 10;

??SELECT 是用于查詢數據的 SQL 命令,user_name, email 是要查詢的列名。FROM users 表示從 users 表中查詢數據。WHERE age > 18 表示查詢 age 大于 18 的記錄。ORDER BY register_time DESC 表示按 register_time 列降序排列。LIMIT 10 表示取前 10 條記錄。執行這個命令后,系統會從 users 表中查詢出 age 大于 18 的記錄,按 register_time 降序排列,取前 10 條記錄,并返回 user_nameemail 列的值。

??以下是使用 CTE 查詢銷量前十的商品名稱的示例:

WITH top_sales AS (SELECT product_id, SUM(quantity) total_soldFROM ordersGROUP BY product_idORDER BY total_sold DESCLIMIT 10
)
SELECT p.product_name, t.total_sold
FROM products p JOIN top_sales t ON p.product_id = t.product_id;

??WITH 關鍵字定義了一個臨時結果集 top_sales,它從 orders 表中查詢每個 product_id 的銷售總量,并按銷售總量降序排列,取前 10 條記錄。然后在主查詢中,將 products 表和 top_sales 臨時結果集進行連接,查詢出銷量前十的商品名稱和銷售總量。執行這個命令后,系統會先計算出 top_sales 臨時結果集,然后將其與 products 表進行連接,返回銷量前十的商品名稱和銷售總量。

2.2.4 數據控制語言(DCL)

??用于控制數據庫的訪問權限,常見的 DCL 命令及其說明如下:

??GRANT SELECT, INSERT ON db_name.table_name TO 'user'@'localhost'; 用于授予用戶對指定數據庫和表的特定權限。以下是授予用戶 test_usere_commerce 數據庫中 orders 表的 SELECTINSERT 權限的示例:

GRANT SELECT, INSERT ON e_commerce.orders TO 'test_user'@'localhost';

??GRANT 是用于授予權限的 SQL 命令,SELECT, INSERT 是要授予的權限,e_commerce.orders 是要授予權限的數據庫和表,'test_user'@'localhost' 是要授予權限的用戶。執行這個命令后,用戶 test_user 就可以在本地主機上對 e_commerce 數據庫中的 orders 表進行 SELECTINSERT 操作。

??REVOKE DELETE ON db_name.* FROM 'user'@'localhost'; 用于收回用戶對指定數據庫和表的特定權限。以下是收回用戶 test_usere_commerce 數據庫中所有表的 DELETE 權限的示例:

REVOKE DELETE ON e_commerce.* FROM 'test_user'@'localhost';

??REVOKE 是用于收回權限的 SQL 命令,DELETE 是要收回的權限,e_commerce.* 表示 e_commerce 數據庫中的所有表,'test_user'@'localhost' 是要收回權限的用戶。執行這個命令后,用戶 test_user 就不能在本地主機上對 e_commerce 數據庫中的任何表進行 DELETE 操作。

??CREATE ROLE 'admin_role'; 用于創建一個新的角色,MySQL 8.0 新增了角色管理功能。以下是創建一個名為 admin_role 的角色的示例:

CREATE ROLE 'admin_role';

??CREATE ROLE 是用于創建角色的 SQL 命令,'admin_role' 是要創建的角色名稱。執行這個命令后,系統會創建一個名為 admin_role 的角色。

??GRANT 'admin_role' TO 'user'@'localhost'; 用于為用戶分配角色。以下是將 admin_role 角色分配給用戶 test_user 的示例:

GRANT 'admin_role' TO 'test_user'@'localhost';

??GRANT 是用于分配角色的 SQL 命令,'admin_role' 是要分配的角色,'test_user'@'localhost' 是要分配角色的用戶。執行這個命令后,用戶 test_user 就擁有了 admin_role 角色的所有權限。

2.3 數據庫訪問技術

??MySQL 提供了多種方式實現應用程序與數據庫的連接,不同的編程語言有對應的接口:

??JDBC(Java):Java 可以通過 com.mysql.cj.jdbc.Driver 驅動連接 MySQL 數據庫,支持 SSL 加密和連接池。連接池可以提高數據庫連接的復用性,減少連接開銷。以下是 Java 代碼示例:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class JdbcExample {public static void main(String[] args) {try {// 加載驅動Class.forName("com.mysql.cj.jdbc.Driver");// 建立連接Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/e_commerce", "root", "password");// 創建 Statement 對象Statement stmt = conn.createStatement();// 執行查詢ResultSet rs = stmt.executeQuery("SELECT * FROM users");// 處理結果集while (rs.next()) {System.out.println(rs.getString("user_name"));}// 關閉資源rs.close();stmt.close();conn.close();} catch (Exception e) {e.printStackTrace();}}
}

??在這個示例中,首先使用 Class.forName("com.mysql.cj.jdbc.Driver") 加載 MySQL JDBC 驅動。然后使用 DriverManager.getConnection 方法建立與數據庫的連接,需要提供數據庫的 URL、用戶名和密碼。接著創建 Statement 對象,用于執行 SQL 語句。使用 executeQuery 方法執行查詢語句,并返回結果集 ResultSet。通過 while (rs.next()) 遍歷結果集,并使用 rs.getString("user_name") 獲取 user_name 列的值。最后,關閉結果集、Statement 對象和連接,釋放資源。

??ODBC:是一種跨語言的數據庫連接接口,C++、Python 等語言可以通過 ODBC 驅動連接 MySQL 數據庫。例如,Python 可以使用 pyodbc 庫。以下是 Python 代碼示例:

import pyodbc# 建立連接
conn = pyodbc.connect('DRIVER={MySQL ODBC 8.0 ANSI Driver};SERVER=localhost;DATABASE=e_commerce;UID=root;PWD=password')
# 創建游標
cursor = conn.cursor()
# 執行查詢
cursor.execute('SELECT * FROM users')
# 處理結果集
for row in cursor.fetchall():print(row[1])
# 關閉連接
conn.close()

??在這個示例中,使用 pyodbc.connect 方法建立與數據庫的連接,需要提供 ODBC 驅動、服務器地址、數據庫名稱、用戶名和密碼。然后創建游標 cursor,用于執行 SQL 語句。使用 cursor.execute 方法執行查詢語句,并使用 cursor.fetchall 方法獲取所有結果。通過 for row in cursor.fetchall() 遍歷結果集,并打印每行的第二個元素。最后,關閉連接,釋放資源。

??MySQL Connector/NET:是 .NET 平臺專用的接口,支持 Entity Framework 等 ORM(對象關系映射)框架。通過 ORM 框架,開發人員可以使用面向對象的方式操作數據庫,提高開發效率。

??Node.js Connector:是 Node.js 環境的官方驅動,支持異步查詢和 Promise 接口,適合開發高性能的 Node.js 應用程序。以下是 Node.js 代碼示例:

const mysql = require('mysql2/promise');async function main() {const connection = await mysql.createConnection({host: 'localhost',user: 'root',password: 'password',database: 'e_commerce'});const [rows, fields] = await connection.execute('SELECT * FROM users');console.log(rows);connection.end();
}main().catch(console.error);

??在這個示例中,使用 mysql2/promise 模塊創建一個異步連接。通過 mysql.createConnection 方法建立與數據庫的連接,需要提供主機地址、用戶名、密碼和數據庫名稱。使用 connection.execute 方法執行查詢語句,并返回結果集和字段信息。通過 console.log(rows) 打印結果集。最后,使用 connection.end 方法關閉連接。

三、什么是 MySQL

3.1 客戶機 - 服務器軟件(C/S 架構)

??MySQL 采用主從式架構,由客戶端和服務器端組成:

??服務器端(Server)運行 mysqld 進程,負責管理數據庫文件、處理查詢請求、維護事務和連接池等操作。服務器端可以部署在獨立的服務器上,以提供更好的性能和穩定性。mysqld 進程是 MySQL 服務器的核心進程,它監聽客戶端的連接請求,處理客戶端發送的 SQL 語句,并將查詢結果返回給客戶端。同時,它還負責管理數據庫文件的存儲和維護,確保數據的安全性和完整性。

??客戶端(Client)通過 TCP/IP 協議連接到服務器端,向服務器發送 SQL 請求并接收處理結果。客戶端可以是命令行工具(如 mysql)、圖形化工具(如 Workbench)或應用程序接口。命令行工具 mysql 是一個常用的客戶端工具,用戶可以通過它輸入 SQL 語句并執行。圖形化工具 Workbench 提供了直觀的界面,方便用戶進行數據庫管理和開發。應用程序接口則允許開發人員將 MySQL 集成到自己的應用程序中,實現數據的讀寫操作。

??C/S 架構的工作流程如下:

??首先,客戶端向服務器發送連接請求,包含服務器的 IP 地址、端口號、用戶名和密碼等信息。客戶端需要知道服務器的地址和端口號,才能與服務器建立連接。用戶名和密碼用于身份驗證,確保只有授權的用戶才能訪問數據庫。

??服務器接收到連接請求后,驗證客戶端的身份信息。如果身份驗證通過,服務器與客戶端建立連接,并開始接收客戶端發送的 SQL 語句。服務器會檢查用戶名和密碼是否正確,如果正確則建立連接,并為客戶端分配一個會話。

??服務器接收到 SQL 語句后,由查詢優化器對 SQL 語句進行解析和優化,生成最優的執行計劃。然后,存儲引擎根據執行計劃從數據庫文件中讀取數據。查詢優化器會分析 SQL 語句的語義和語法,根據數據庫的統計信息和索引情況,選擇最優的執行計劃。存儲引擎負責實際的數據存儲和讀取操作,不同的存儲引擎有不同的實現方式。

??最后,服務器將查詢結果集返回給客戶端,客戶端接收到結果集后,根據需要進行渲染或處理。客戶端可以將結果集顯示在界面上,或者進行進一步的計算和處理。

3.2 MySQL 版本

??MySQL 8.0 是目前主流的穩定版本,于 2018 年發布,相比 5.7 版本有以下重要改進:

??性能提升方面,優化了 JSON 處理、CTE 查詢和哈希索引等功能,事務處理速度提升約 2 倍。例如,在處理包含大量 JSON 數據的查詢時,性能有顯著提升。JSON 是一種常用的數據格式,在現代應用中廣泛使用。MySQL 8.0 對 JSON 處理的優化,使得處理 JSON 數據更加高效。CTE 查詢允許在查詢中定義臨時結果集,提高了 SQL 語句的可讀性和可維護性。哈希索引可以加快某些類型的查詢速度。

??安全性增強方面,默認使用 caching_sha2_password 加密算法,提高了密碼的安全性。同時,支持角色管理和行級權限控制,方便管理員進行精細的權限管理。caching_sha2_password 是一種更安全的加密算法,可以有效防止密碼泄露。角色管理允許管理員創建不同的角色,并為角色分配不同的權限。行級權限控制可以對表中的每一行數據進行權限控制,確保只有授權的用戶才能訪問特定的數據。

??JSON 增強方面,支持 JSON 文檔鍵排序、路徑表達式(JSON_PATH)和 JSON_TABLE 函數,可以將 JSON 數據映射為表結構,方便進行查詢和分析。JSON 文檔鍵排序可以按照指定的順序對 JSON 文檔中的鍵進行排序。路徑表達式(JSON_PATH)允許用戶使用類似于 XPath 的語法來查詢 JSON 數據。JSON_TABLE 函數可以將 JSON 數據轉換為表結構,方便進行 SQL 查詢。

??窗口函數方面,新增了 ROW_NUMBER()RANK()DENSE_RANK() 等窗口函數,簡化了復雜的排名和分組統計操作。窗口函數可以在不使用子查詢的情況下進行排名和分組統計,提高了查詢的效率和可讀性。

??CTE 支持方面,允許在查詢中定義臨時結果集,提高了 SQL 語句的可讀性和可維護性。CTE 可以將復雜的查詢拆分為多個簡單的步驟,每個步驟使用一個臨時結果集,使得查詢更加清晰和易于理解。

??MySQL 的版本命名規則為 主版本號.次版本號.修訂號,如 8.0.36。開發版本通常會標注 alphabeta,表示該版本處于開發測試階段;穩定版本會標注 GA(General Availability),表示該版本可以正式投入使用。

3.3 MySQL 的優勢

3.3.1 速度與性能

??查詢優化器方面,MySQL 8.0 的查詢優化器支持基于成本的查詢計劃,能夠自動選擇最優的索引和連接方式,提高查詢性能。例如,在處理復雜的多表連接查詢時,查詢優化器可以快速找到最優的執行路徑。查詢優化器會根據數據庫的統計信息和索引情況,計算不同執行計劃的成本,并選擇成本最低的執行計劃。

??InnoDB 存儲引擎支持行級鎖、ACID 事務和聚簇索引,適合高并發事務處理。在電商下單等場景中,行級鎖可以減少鎖沖突,提高并發性能;ACID 事務可以保證數據的一致性和完整性;聚簇索引可以提高數據的檢索效率。行級鎖只鎖定需要操作的行,而不是整個表,從而減少了鎖沖突。ACID 事務確保了事務的原子性、一致性、隔離性和持久性,保證了數據的正確性。聚簇索引將數據行按照主鍵的順序存儲,提高了主鍵查詢的效率。

??原生 JSON 支持方面,可以直接操作 JSON 數據,避免了傳統字符串解析的性能損耗。例如,在處理包含 JSON 數據的查詢時,無需先將 JSON 數據轉換為字符串進行解析,提高了查詢效率。MySQL 8.0 提供了一系列的 JSON 函數和操作符,方便對 JSON 數據進行查詢和修改。

3.3.2 成本優勢

??開源免費方面,MySQL 的社區版完全免費,企業可以根據自身需求選擇是否購買商業版。商業版提供了一些高級功能,如技術支持、安全審計等,但對于大多數小型和中型企業來說,社區版已經足夠滿足需求,節省了軟件采購成本。開源免費使得 MySQL 成為了很多企業的首選數據庫,尤其是對于預算有限的企業。

??低硬件要求方面,MySQL 采用輕量級設計,對硬件資源的要求較低,可以在低配服務器(如 2 核 4G)上運行,節省了硬件采購和維護成本。輕量級設計使得 MySQL 在資源有限的環境下也能高效運行,降低了企業的硬件成本。

3.3.3 易用性

??SQL 兼容性方面,支持標準 SQL 語法,學習成本低。對于已經熟悉 SQL 語言的開發人員來說,可以快速上手 MySQL。標準 SQL 語法使得開發人員可以使用他們熟悉的 SQL 語句進行數據庫操作,減少了學習成本。

??豐富文檔方面,MySQL 的官方文檔詳細且更新及時,同時社區也非常活躍,如 Stack Overflow、MySQL 論壇等,開發人員可以在這些社區中獲取幫助和交流經驗。官方文檔提供了詳細的使用說明和示例,社區則為開發人員提供了一個交流和學習的平臺。

3.3.4 可移植性

??跨平臺支持方面,支持 Windows、Linux、macOS、Solaris 等多種操作系統,應用程序可以在不同的操作系統之間無縫遷移,提高了開發和部署的靈活性。跨平臺支持使得開發人員可以根據自己的需求選擇合適的操作系統進行開發和部署,同時也方便了應用程序的遷移和擴展。

??容器化支持方面,原生支持 Docker 部署,通過 docker-compose 可以快速搭建主從集群,方便進行開發、測試和生產環境的部署。Docker 是一種輕量級的容器化技術,可以將應用程序和其依賴的環境打包成一個容器,方便部署和管理。docker-compose 可以幫助用戶快速搭建多個容器組成的集群,提高了開發和測試的效率。

3.3.5 豐富接口

??支持 JDBC、ODBC、Python、PHP 等幾乎所有主流編程語言的接口,方便開發人員將 MySQL 集成到不同的技術棧中,提高了開發效率。豐富的接口使得開發人員可以使用自己熟悉的編程語言進行數據庫操作,無需學習新的接口和技術。

3.3.6 安全性與連接性

??細粒度權限控制方面,可以按數據庫、表、列級別進行授權,8.0 版本新增了角色管理功能,簡化了權限分配過程。管理員可以根據用戶的職責和需求,為用戶分配不同的權限,確保數據的安全性。細粒度權限控制可以精確地控制用戶對數據庫的訪問權限,防止敏感數據的泄露。

??加密連接方面,支持 SSL/TLS 加密傳輸,防止數據在網絡傳輸過程中被竊取。在生產環境中,建議使用加密連接,提高數據傳輸的安全性。SSL/TLS 加密可以對數據進行加密,確保數據在傳輸過程中不被竊取和篡改。

四、MySQL 的安裝

4.1 MySQL 的編譯安裝

4.1.1 準備工作

??在 OpenEuler 系統中通過源碼編譯安裝 MySQL 8.0.36,需要先完成以下準備工作:

4.1.1.1 卸載 MariaDB 并安裝依賴包

??在安裝 MySQL 之前,需要檢查系統中是否已經安裝了 MariaDB,如果安裝了,需要先卸載。同時,需要安裝編譯所需的依賴包。以下是具體的命令和說明:

# 檢查是否安裝 MariaDB
[root@localhost ~]# rpm -q mariadb
mariadb-5.5.52-1.el7.x86_64# 卸載 MariaDB
[root@localhost ~]# dnf remove mariadb# 安裝編譯依賴包
[root@localhost ~]# dnf install -y gcc gcc-c++ make cmake autoconf libtool bison re2c \
openssl-devel libxml2-devel zlib-devel curl-devel libpng-devel \
libjpeg-turbo-devel freetype-devel libicu-devel oniguruma-devel \
sqlite-devel libxslt-devel libzip-devel pcre-devel apr-devel apr-util-devel \
ncurses-devel wget libtirpc-devel rpcgen

??rpm -q mariadb 用于檢查系統中是否安裝了 MariaDB。如果安裝了,會顯示 MariaDB 的版本信息。dnf remove mariadb 用于卸載 MariaDB。dnf install -y 用于安裝指定的依賴包,-y 表示自動確認安裝。gccgcc-c++ 是編譯工具,用于將源代碼編譯成可執行文件。openssl-devel 提供加密支持,確保 MySQL 數據庫的安全性。libxml2-devel 用于 XML 處理,MySQL 可能會使用到 XML 相關的功能。其他依賴包也都是為了確保 MySQL 的各項功能能夠正常運行。

4.1.1.2 關閉 SELinux 和防火墻

??SELinux 和防火墻可能會阻止 MySQL 服務的正常運行,在安裝過程中建議關閉,在生產環境中可以后續配置白名單。以下是具體的命令和說明:

# 修改 SELinux 配置為禁用
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  
[root@localhost ~]# setenforce 0  # 立即生效# 關閉防火墻并禁止開機啟動
[root@localhost ~]# systemctl disable firewalld 
[root@localhost ~]# systemctl stop firewalld

??sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 用于修改 SELinux 的配置文件,將 SELINUX=enforcing 改為 SELINUX=disabled,表示禁用 SELinux。setenforce 0 用于立即生效 SELinux 的禁用配置。systemctl disable firewalld 用于禁止防火墻開機啟動,systemctl stop firewalld 用于停止防火墻服務。

4.1.1.3 安裝 cmake 編譯工具

??cmake 是一個跨平臺的編譯工具,MySQL 8.0 的源碼編譯必須使用 cmake 生成 Makefile。以下是具體的命令和說明:

# 下載 cmake-3.16.2(最新穩定版)
[root@localhost ~]# wget https://cmake.org/files/v3.16/cmake-3.16.2.tar.gz
[root@localhost ~]# tar zxf cmake-3.16.2.tar.gz 
[root@localhost ~]# cd cmake-3.16.2# 配置、編譯、安裝
[root@www cmake-3.16.2]# ./configure
[root@www cmake-3.16.2]# gmake && gmake install

??wget https://cmake.org/files/v3.16/cmake-3.16.2.tar.gz 用于下載 cmake-3.16.2 的壓縮包。tar zxf cmake-3.16.2.tar.gz 用于解壓壓縮包。cd cmake-3.16.2 用于進入解壓后的目錄。./configure 用于配置 cmake 的編譯選項。gmake && gmake install 用于編譯和安裝 cmake。gmake 是 GNU Make 的別名,用于執行 Makefile 中的編譯規則。

4.1.1.4 安裝 Boost 庫

??MySQL 5.7 及以上版本依賴 Boost 庫,編譯時需要通過 -DWITH_BOOST 指定 Boost 庫的路徑。以下是具體的命令和說明:

# 下載 Boost 1.77.0(與 MySQL 8.0 兼容)
[root@localhost ~]# wget http://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz
[root@localhost ~]# tar -zxf boost_1_77_0.tar.gz
[root@localhost ~]# mv boost_1_77_0 /usr/local/boost

??wget http://sourceforge.net/projects/boost/files/boost/1.77.0/boost_1_77_0.tar.gz 用于下載 Boost 1.77.0 的壓縮包。tar -zxf boost_1_77_0.tar.gz 用于解壓壓縮包。mv boost_1_77_0 /usr/local/boost 用于將解壓后的目錄移動到 /usr/local/boost 目錄下。

4.1.2 源碼編譯及安裝
4.1.2.1 創建運行用戶

??為了增強安全性,建議使用獨立的用戶運行 MySQL 服務,避免以 root 權限運行。以下是具體的命令和說明:

# 創建 mysql 用戶組和用戶(不允許登錄系統)
[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -M -s /sbin/nologin mysql -g mysql

??groupadd mysql 用于創建 mysql 用戶組。useradd -M -s /sbin/nologin mysql -g mysql 用于創建 mysql 用戶,-M 表示不創建用戶的主目錄,-s /sbin/nologin 表示不允許用戶登錄系統,-g mysql 表示將用戶添加到 mysql 用戶組中。

4.1.2.2 解包源碼

??將 MySQL 源碼解壓到 /usr/src 目錄,并進入該目錄。以下是具體的命令和說明:

# 解壓 MySQL 源碼到 /usr/src 并進入目錄
[root@localhost ~]# tar zxf mysql-8.0.36.tar.gz -C /usr/src 
[root@localhost ~]# cd /usr/src/mysql-8.0.36

??tar zxf mysql-8.0.36.tar.gz -C /usr/src 用于將 MySQL 源碼解壓到 /usr/src 目錄下。cd /usr/src/mysql-8.0.36 用于進入解壓后的目錄。

4.1.2.3 配置編譯參數

??創建一個獨立的構建目錄,避免污染源碼,然后使用 cmake 配置編譯參數。以下是具體的命令和說明:

# 創建獨立構建目錄(避免源碼污染)
[root@localhost ~]# mkdir build && cd build  # 執行 cmake 配置
[root@www mysql-8.0.36]# cmake .. \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \        # 安裝目錄
-DSYSCONFDIR=/etc \                             # 配置文件目錄
-DMYSQL_DATADIR=/usr/local/mysql/data \         # 數據文件目錄
-DWITH_SSL=system \                             # 使用系統 SSL 庫
-DENABLED_LOCAL_INFILE=ON \                     # 允許本地文件導入
-DWITH_BOOST=/usr/local/boost \                 # Boost 庫路徑
-DDEFAULT_CHARSET=utf8 \                        # 默認字符集
-DDEFAULT_COLLATION=utf8_general_ci \           # 默認排序規則
-DWITH_EXTRA_CHARSETS=all                       # 支持所有額外字符集

??mkdir build && cd build 用于創建獨立的構建目錄并進入該目錄。cmake .. 用于執行 cmake 配置,.. 表示上級目錄,即 MySQL 源碼目錄。-DCMAKE_INSTALL_PREFIX=/usr/local/mysql 指定了 MySQL 的安裝位置。-WITH_BOOST=/usr/local/boost 是 MySQL 8.0 編譯必須的參數,指定了 Boost 庫的路徑。utf8 字符集支持中文等多語言,確保數據庫可以存儲和處理各種語言的數據。

4.1.2.4 編譯安裝

??使用 make -j$(nproc) 命令進行并行編譯,利用系統的所有 CPU 核心,加快編譯速度。以下是具體的命令和說明:

# 并行編譯(利用所有 CPU 核心加快速度)
[root@localhost build]# make -j$(nproc)    
[root@localhost build]# make install

??make -j$(nproc) 中的 $(nproc) 會返回系統的 CPU 核心數,-j 表示并行編譯的線程數,因此 make -j$(nproc) 會利用系統的所有 CPU 核心進行并行編譯,大幅縮短了編譯時間。在生產環境中,編譯過程可能需要數小時。make install 用于安裝編譯好的 MySQL 程序。

4.1.3 安裝后的調整
4.1.3.1 建立配置文件

??創建 my.cnf 配置文件,配置 MySQL 的相關參數。以下是具體的命令和說明:

# 創建 my.cnf 配置文件
[root@localhost ~]# vi /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0       # 監聽所有 IP
skip-name-resolve            # 禁用 DNS 解析
port = 3306                  # 端口號
basedir=/usr/local/mysql     # 安裝目錄
datadir=/usr/local/mysql/data # 數據目錄
max_connections=2048         # 最大連接數
character-set-server=utf8    # 服務端字符集
default-storage-engine=INNODB # 默認存儲引擎
max_allowed_packet=16M       # 最大數據包大小

??vi /etc/my.cnf 用于編輯 my.cnf 配置文件。[client] 部分配置客戶端連接的參數,socket=/usr/local/mysql/data/mysql.sock 表示客戶端通過該套接字文件連接到 MySQL 服務器。[mysqld] 部分配置 MySQL 服務器的參數,bind-address = 0.0.0.0 允許遠程連接,方便不同主機的客戶端連接到 MySQL 服務器。skip-name-resolve 避免了 DNS 解析延遲,提高了連接速度。port = 3306 是 MySQL 服務器的默認端口號。basedir=/usr/local/mysql 指定了 MySQL 的安裝目錄。datadir=/usr/local/mysql/data 指定了 MySQL 的數據目錄。max_connections=2048 表示 MySQL 服務器允許的最大連接數。character-set-server=utf8 表示服務端使用 utf8 字符集。default-storage-engine=INNODB 表示默認使用 InnoDB 存儲引擎。max_allowed_packet=16M 表示 MySQL 服務器允許的最大數據包大小。

4.1.3.2 初始化數據庫

??可以選擇無密碼模式或帶密碼模式初始化數據庫。在生產環境中,建議使用帶密碼模式。以下是具體的命令和說明:

# 無密碼模式初始化(生產環境建議使用默認密碼模式)
[root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql \
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 帶密碼模式初始化(生成隨機密碼)
[root@localhost ~]# /usr/local/mysql/bin/mysqld --initialize --user=mysql \
--basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
# 初始化后會顯示類似 "A temporary password is generated for root@localhost: Xr6:Gg*u8?/8"

??/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 用于無密碼模式初始化數據庫,--initialize-insecure 選項會生成無密碼的 root 用戶,在生產環境中不建議使用,因為這會存在安全風險。/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 用于帶密碼模式初始化數據庫,會生成一個隨機密碼,需要妥善保存這個密碼,用于后續登錄 MySQL 服務器。

4.1.3.3 設置環境變量

??將 MySQL 命令添加到系統的 PATH 環境變量中,這樣可以在任意目錄執行 mysqlmysqldump 等命令。以下是具體的命令和說明:

# 將 MySQL 命令添加到 PATH
[root@www mysql-8.0.36]# echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
[root@www mysql-8.0.36]# . /etc/profile  # 立即生效

??echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile 用于將 /usr/local/mysql/bin 目錄添加到 PATH 環境變量中。>> 表示追加內容到文件末尾。/etc/profile 是系統的環境變量配置文件。. /etc/profile 用于立即生效環境變量的配置。

4.1.4 添加系統服務
4.1.4.1 復制服務腳本

??復制 MySQL 的啟動腳本到 /etc/rc.d/init.d 目錄,并賦予執行權限。以下是具體的命令和說明:

# 復制啟動腳本并賦予執行權限
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld  
[root@localhost ~]# chmod +x /etc/rc.d/init.d/mysqld

??cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld 用于將 MySQL 的啟動腳本復制到 /etc/rc.d/init.d 目錄下,并命名為 mysqldchmod +x /etc/rc.d/init.d/mysqld 用于賦予 mysqld 腳本執行權限。

4.1.4.2 創建 systemd 服務配置

??編輯 mysqld.service 文件,配置 systemd 服務。以下是具體的命令和說明:

# 編輯 mysqld.service
[root@localhost ~]# vi /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true[Install]
WantedBy=multi-user.target# 重載 systemd 配置并啟用服務
[root@localhost ~]# systemctl daemon-reload 
[root@localhost ~]# systemctl enable mysqld 
[root@localhost ~]# systemctl start mysqld 

??vi /lib/systemd/system/mysqld.service 用于編輯 mysqld.service 文件。[Unit] 部分配置服務的基本信息,Description=mysqld 是服務的描述信息,After=network.target 表示該服務在網絡服務啟動后啟動。[Service] 部分配置服務的啟動、重啟和停止命令,Type=forking 表示服務以分叉的方式啟動。ExecStart=/etc/rc.d/init.d/mysqld start 表示啟動服務的命令。ExecReload=/etc/rc.d/init.d/mysqld restart 表示重啟服務的命令。ExecStop=/etc/rc.d/init.d/mysqld stop 表示停止服務的命令。PrivateTmp=true 表示為服務創建一個私有的臨時目錄。[Install] 部分配置服務的安裝信息,WantedBy=multi-user.target 表示該服務在多用戶模式下啟動。systemctl daemon-reload 用于重載 systemd 的配置文件。systemctl enable mysqld 用于啟用 mysqld 服務,使其在開機時自動啟動。systemctl start mysqld 用于啟動 mysqld 服務。

4.1.4.3 驗證服務啟動

??查看 MySQL 服務的狀態和端口監聽情況,確保服務正常啟動。以下是具體的命令和說明:

# 查看服務狀態
[root@localhost ~]# systemctl status mysqld.service 
● mysqld.service - mysqld
Loaded: loaded (/usr/lib/systemd/system/mysqld.service ; enabled ; vendor preset: disabled)
Active: active (running) since Sun 2017-02-19 19:43:37 CST ; 2min 58s ago# 查看端口監聽
[root@localhost ~]# netstat -anpt | grep mysqld
tcp6    0    0 0.0.0.0:3306      0.0.0.0:*     LISTEN      133192/mysqld

??systemctl status mysqld.service 用于查看 mysqld 服務的狀態。如果服務正常啟動,會顯示 Active: active (running)netstat -anpt | grep mysqld 用于查看端口監聽情況,netstat -anpt 用于顯示所有網絡連接和端口監聽信息,| grep mysqld 用于過濾出與 mysqld 相關的信息。如果服務正常啟動,會顯示 0.0.0.0:3306 處于監聽狀態。

4.2 MySQL 的二進制安裝

4.2.1 基礎環境準備
4.2.1.1 安裝基礎工具和依賴包

??安裝基礎工具和 MySQL 依賴包,確保系統具備安裝和運行 MySQL 的環境。以下是具體的命令和說明:

# 安裝基礎工具
[root@localhost ~]# dnf -y install gcc vim wget net-tools lrzsz tar# 安裝 MySQL 依賴包
[root@localhost ~]# dnf install -y libaio numactl openssl ncurses-compat-libs

??dnf -y install gcc vim wget net-tools lrzsz tar 用于安裝基礎工具,-y 表示自動確認安裝。gcc 是編譯工具,vim 是文本編輯器,wget 用于下載文件,net-tools 包含網絡工具,lrzsz 用于文件傳輸,tar 用于文件壓縮和解壓。dnf install -y libaio numactl openssl ncurses-compat-libs 用于安裝 MySQL 依賴包,libaio 提供異步 I/O 支持,提高了數據庫的 I/O 性能。numactl 用于優化多處理器內存分配,確保 MySQL 在多處理器系統上能夠高效運行。openssl 用于加密連接,保障數據傳輸的安全性。ncurses-compat-libs 提供兼容的終端庫。

4.2.1.2 創建運行用戶并關閉安全限制

??創建 mysql 用戶,并關閉 SELinux 和防火墻,避免對 MySQL 服務造成干擾。以下是具體的命令和說明:

# 創建 mysql 用戶
[root@localhost ~]# useradd -M -s /sbin/nologin mysql# 關閉 SELinux 和防火墻(同編譯安裝步驟)
[root@localhost ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config  
[root@localhost ~]# setenforce 0
[root@localhost ~]# systemctl disable firewalld 
[root@localhost ~]# systemctl stop firewalld

??useradd -M -s /sbin/nologin mysql 用于創建 mysql 用戶,-M 表示不創建用戶的主目錄,-s /sbin/nologin 表示不允許用戶登錄系統。sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config 用于修改 SELinux 的配置文件,將 SELINUX=enforcing 改為 SELINUX=disabled,表示禁用 SELinux。setenforce 0 用于立即生效 SELinux 的禁用配置。systemctl disable firewalld 用于禁止防火墻開機啟動,systemctl stop firewalld 用于停止防火墻服務。

4.2.2 二進制安裝
4.2.2.1 解壓安裝包并配置

??解壓 MySQL 二進制包,并創建數據目錄,設置目錄權限。然后初始化數據庫,生成 root 用戶的隨機密碼。以下是具體的命令和說明:

# 解壓二進制包
[root@localhost ~]# tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz
[root@localhost ~]# mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql# 創建數據目錄并設置權限
[root@localhost ~]# mkdir /usr/local/mysql/data
[root@localhost ~]# chown -R mysql:mysql /usr/local/mysql # 初始化數據庫(帶密碼模式,生成隨機密碼)
[root@localhost ~]# cd /usr/local/mysql/bin
[root@localhost ~]# ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

??tar xf mysql-8.0.36-linux-glibc2.28-x86_64.tar.xz 用于解壓 MySQL 二進制包。mv mysql-8.0.36-linux-glibc2.28-x86_64 /usr/local/mysql 用于將解壓后的目錄移動到 /usr/local/mysql 目錄下。mkdir /usr/local/mysql/data 用于創建數據目錄。chown -R mysql:mysql /usr/local/mysql 用于將 /usr/local/mysql 目錄及其子目錄的所有權設置為 mysql 用戶和 mysql 用戶組。cd /usr/local/mysql/bin 用于進入 /usr/local/mysql/bin 目錄。./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 用于初始化數據庫,會生成一個隨機密碼,需要妥善保存這個密碼,用于后續登錄 MySQL 服務器。

4.2.3 設定配置文件

??創建 my.cnf 配置文件,配置內容與編譯安裝一致。然后設置環境變量,將 MySQL 命令添加到 PATH 中。以下是具體的命令和說明:

# 創建 my.cnf(配置內容與編譯安裝一致)
[root@localhost ~]# vi /etc/my.cnf
[client]
socket=/usr/local/mysql/data/mysql.sock
[mysqld]
socket=/usr/local/mysql/data/mysql.sock
bind-address = 0.0.0.0
skip-name-resolve
port = 3306
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
max_connections=2048
character-set-server=utf8
default-storage-engine=INNODB
max_allowed_packet=16M# 設置環境變量
[root@localhost ~]# echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile
[root@localhost ~]# . /etc/profile

??vi /etc/my.cnf 用于編輯 my.cnf 配置文件,配置內容與編譯安裝一致。echo "export PATH=$PATH:/usr/local/mysql/bin">> /etc/profile 用于將 /usr/local/mysql/bin 目錄添加到 PATH 環境變量中。>> 表示追加內容到文件末尾。/etc/profile 是系統的環境變量配置文件。. /etc/profile 用于立即生效環境變量的配置。

4.2.4 配置 systemctl 啟動

??復制服務腳本并創建 systemd 服務,配置與編譯安裝一致。然后重載 systemd 配置,啟用并啟動 MySQL 服務,最后驗證端口監聽情況。以下是具體的命令和說明:

# 復制服務腳本并創建 systemd 服務(同編譯安裝步驟)
[root@localhost ~]# cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld  
[root@localhost ~]# chmod +x /etc/rc.d/init.d/mysqld[root@localhost ~]# vi /lib/systemd/system/mysqld.service
[Unit]
Description=mysqld
After=network.target[Service]
Type=forking
ExecStart=/etc/rc.d/init.d/mysqld start
ExecReload=/etc/rc.d/init.d/mysqld restart
ExecStop=/etc/rc.d/init.d/mysqld stop
PrivateTmp=true[Install]
WantedBy=multi-user.target# 重載 systemd 配置
[root@localhost ~]# systemctl daemon-reload 
# 啟用服務
[root@localhost ~]# systemctl enable mysqld 
# 啟動服務
[root@localhost ~]# systemctl start mysqld 
# 驗證端口監聽情況
[root@localhost ~]# netstat -anpt | grep mysqld

cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld 用于將 MySQL 的啟動腳本復制到 /etc/rc.d/init.d 目錄下,并命名為 mysqldchmod +x /etc/rc.d/init.d/mysqld 用于賦予 mysqld 腳本執行權限。vi /lib/systemd/system/mysqld.service 用于編輯 mysqld.service 文件,配置與編譯安裝一致。systemctl daemon-reload 用于重載 systemd 的配置文件。systemctl enable mysqld 用于啟用 mysqld 服務,使其在開機時自動啟動。systemctl start mysqld 用于啟動 mysqld 服務。netstat -anpt | grep mysqld 用于查看端口監聽情況,如果服務正常啟動,會顯示 0.0.0.0:3306 處于監聽狀態。

總結

本文全面且深入地介紹了 MySQL 的相關知識,從數據庫基礎入手,詳細闡述了數據庫的定義、發展歷程、核心特點,以及表、數據類型和主鍵等基本概念。接著介紹了數據庫技術構成,包括數據庫系統的組成、SQL 語言的四大類以及數據庫訪問技術。然后對 MySQL 進行了詳細介紹,包括其 C/S 架構、版本特點和優勢。最后,詳細說明了 MySQL 8.0 在 OpenEuler 系統上的編譯安裝和二進制安裝方法,包括準備工作、安裝過程、安裝后的調整以及系統服務的配置和驗證。通過本文的學習,讀者可以全面了解 MySQL 的基礎知識和安裝方法,為進一步學習和使用 MySQL 打下堅實的基礎。在實際應用中,讀者可以根據自己的需求選擇合適的安裝方式,并合理運用 MySQL 的各項功能,提高數據管理和處理的效率。同時,需要注意數據庫的安全性和性能優化,確保數據的安全和穩定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/98557.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/98557.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/98557.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【數據結構基礎習題】-1- 數據結構基本操作

一、順序表和鏈表習題 1. 順序表就地逆置#include <stdio.h> // 定義順序表結構 #define MAXSIZE 100 typedef struct {int data[MAXSIZE];int length; } SqList; // 就地逆置順序表 void reverseList(SqList *L) {int i, temp;for (i 0; i < L->length / 2; i) {…

【Java實戰?】從0到1:Spring Boot Web開發與接口設計實戰

目錄一、Spring Boot Web 基礎配置1.1 Web 起步依賴&#xff08;spring-boot-starter-web 導入與核心組件&#xff09;1.2 內置服務器配置&#xff08;Tomcat 端口、線程池、連接超時設置&#xff09;1.3 靜態資源訪問&#xff08;靜態資源存放路徑、自定義資源映射&#xff09…

房屋安全鑒定機構評價

房屋安全鑒定機構評價&#xff1a;如何選擇專業可靠的檢測服務在建筑行業快速發展的今天&#xff0c;房屋安全鑒定已成為保障建筑安全、預防事故的重要環節。面對市場上眾多的房屋安全鑒定機構&#xff0c;如何科學評價并選擇一家專業可靠的服務提供方&#xff0c;是許多業主、…

【算法專題訓練】19、哈希表

1、哈希表基礎知識 以鍵值對的方式進行數據存儲優點&#xff1a;哈希表數據結構在插入、刪除或查找一個元素時&#xff0c;都只需要O(1)的時間 哈希表設計三要點&#xff1a; 為了快速確定一個元素在哈希表中的位置&#xff0c;可以使用一個數組&#xff0c;元素的位置為他的…

某光伏電力監控系統網絡安全監測項目:智能組網技術優化方案實踐

背景與挑戰隨著光伏電力行業的快速發展&#xff0c;光伏電站的規模和分布范圍日益擴大。電力監控系統作為光伏電站的核心平臺&#xff0c;其網絡安全直接關系到電力生產的穩定性與可靠性。然而&#xff0c;光伏場站通常分布在偏遠地區&#xff0c;網絡環境復雜&#xff0c;傳統…

GEE訓練教程:基于Landsat 8衛星影像識別并提取指定區域內無云覆蓋的區域多邊形,最終導出為矢量文件

簡介 本文使用Google Earth Engine平臺,通過Landsat 8衛星影像識別并提取指定區域內無云覆蓋的區域多邊形,最終導出為矢量文件。主要步驟包括:定義研究區域、創建云檢測算法、篩選高質量影像、將無云區域轉換為矢量多邊形,并進行可視化檢查和數據導出。 使用Google Earth…

UniApp 頁面通訊方案全解析:從 API 到狀態管理的最佳實踐

在 UniApp 跨端開發中&#xff0c;組件與頁面間的通訊是核心需求。無論是父子組件交互、跨頁面數據傳遞&#xff0c;還是全局狀態共享&#xff0c;選擇合適的通訊方案直接影響代碼的可維護性和性能。本文將系統對比 uni.$emit 系列 API、狀態管理庫&#xff08;Vuex/Pinia&…

【c++進階系列】:萬字詳解AVL樹(附源碼實現)

&#x1f525; 本文專欄&#xff1a;c &#x1f338;作者主頁&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客勵志語錄&#xff1a; 路在腳下延伸時&#xff0c;不必追問終點何在。你邁出的每一步&#xff0c;都在重新定義世界的邊界 ★★★ 本文前置知識&#xff1a; …

前端日志回撈系統的性能優化實踐|得物技術

一、前言在現代前端應用中&#xff0c;日志回撈系統是排查線上問題的重要工具。然而&#xff0c;傳統的日志系統往往面臨著包體積過大、存儲無限膨脹、性能影響用戶體驗等問題。本文將深入分析我們在dw/log和dw/log-upload兩個庫中實施的關鍵性能優化&#xff0c;以及改造過程中…

【QT隨筆】結合應用案例一文完美概括QT中的隊列(Queue)

【QT隨筆】結合應用案例一文完美概括QT中的隊列&#xff08;Queue&#xff09; 隊列&#xff08;Queue&#xff09;是一種線性數據結構&#xff0c;其核心規則為先進先出&#xff08;FIFO, First-In-First-Out&#xff09;&#xff1a; 新元素在隊尾插入&#xff08;enqueue&a…

At least one <template> or <script> is required in a single file component

環境rspack vue3原因rule 中配置了兩個vue-loader刪掉一個即可。

LangChain實戰(十八):構建ReAct模式的網頁內容摘要與分析Agent

本文是《LangChain實戰課》系列的第十八篇,將深入講解如何構建一個基于ReAct模式的智能網頁內容摘要與分析Agent。這個Agent能夠自主瀏覽網頁、提取關鍵信息、生成智能摘要,并進行深入的內容分析,讓信息獲取和理解變得更加高效。 前言 在信息爆炸的時代,我們每天都需要處理…

debian11 ubuntu24 armbian24 apt install pure-ftpd被動模式的正確配置方法

debian11 ubuntu24 armbian24 apt install pure-ftpd被動模式的正確配置方法 安裝方法請看&#xff1a;https://www.itbulu.com/pure-ftpd.html 疑難問題解決 原本以為配置很簡單的&#xff0c;無非是修改 ForcePassiveIP MinUID PassivePortRange PureDB這幾個配置項就行了…

量化金融|基于算法和模型的預測研究綜述

一、研究背景與發展歷程??1.??量化投資理論演進???奠基階段&#xff08;1950s-1960s&#xff09;??&#xff1a;Markowitz均值方差理論&#xff08;1952&#xff09;、CAPM模型&#xff08;1964&#xff09;奠定現代量化投資基礎?衍生品定價&#xff08;1970s-1980s&…

從零開始的云計算生活——第六十天,志在千里,使用Jenkins部署K8S

一.安裝kubectl1、配置yum源cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo [kubernetes] nameKubernetes baseurlhttps://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/ enabled1 gpgcheck1 gpgkeyhttps://mirrors.aliyun.com/kubernetes-new/core/sta…

無人機電壓模塊技術剖析

無人機電源模塊的基本運行方式無人機電壓模塊的核心任務是對動力電源&#xff08;通常是鋰電池&#xff09;進行轉換、調節和分配&#xff0c;為飛控、圖傳、攝像頭、舵機等各個子系統提供穩定可靠的電能。其運行方式可以概括為&#xff1a;電壓轉換與調控&#xff1a;無人機動…

MATLAB基于GM(灰色模型)與LSTM(長短期記憶網絡)的組合預測方法

一、GM與LSTM的基本原理及互補性 1. GM模型的核心特點基本原理&#xff1a;通過累加生成&#xff08;AGO&#xff09;將原始無序序列轉化為具有指數規律的光滑序列&#xff0c;建立一階微分方程&#xff08;如GM(1,1)&#xff09;進行預測。其數學形式為&#xff1a; dx(1)dtax…

【菜狗每日記錄】啟發式算法、傅里葉變換、AC-DTC、Xmeans—20250909

&#x1f431;1、啟發式算法 ① 定義 ② 特點 ③ 案例 &#x1f431;2、快速傅里葉變換FFT ① DFT離散傅里葉變換 ② FFT快速傅里葉變換 &#x1f431;3、AC-DTC聚類 &#x1f431;4、Xmeans &#x1f431;1、啟發式算法 啟發式算法是和最優化算法相對的。 一般而言&am…

Axure移動端選擇器案例:多類型選擇器設計與動態效果實現

在移動端交互設計中&#xff0c;選擇器是用戶輸入的核心組件。Axure移動端高保真元件庫提供了四種關鍵選擇器解決方案&#xff0c;通過動態效果提升操作真實感&#xff1a; 預覽地址&#xff1a;Axure 1. 基礎選擇器 采用底部彈窗設計&#xff0c;支持單選項快速選擇。點擊觸發…

Spring Boot圖片驗證碼功能實現詳解 - 從零開始到完美運行

Spring Boot圖片驗證碼功能實現詳解 - 從零開始到完美運行 &#x1f4d6; 前言 大家好&#xff01;今天我要和大家分享一個非常實用的功能&#xff1a;Spring Boot圖片驗證碼。這個功能可以防止惡意攻擊&#xff0c;比如暴力破解、刷票等。我們實現的是一個帶有加減法運算的圖片…