1. 複製切換 1.1. 複製是高可用性的基礎 1.1.1. 總是保留一份持續更新的副本數據,會讓災難恢復更簡單 1.2. “切換副本”(promoting a replica)和“故障切換”(failing over)是同義詞 1.2.1. 意味著源伺服器不再接收寫入,並將副本提升為新的源伺服器 ...
實驗一 MySQL資料庫操作
實驗目的:
掌握MySQL安裝、配置與登錄方法,使用MySQL客戶創建資料庫及對資料庫表完成各種操作
實驗內容:
1、 安裝MySQL資料庫管理系統,5.7.X(建議5.7.23及以上)或8.X版本都可以。客戶端不限。
2、 使用MySQL客戶端創建資料庫,並且在庫中按照設計創建資料庫表,並把數據插入各表中。
實驗過程及要求:
1、學習並掌握MySQL的登錄方法,能夠使用官方的MySQL客戶端(或者其他能夠連接MySQL的客戶端)連接並登錄到MySQL伺服器,能夠在伺服器上進行各種操作。
2、創建資料庫LearnMySQL,按照給定Excel文件中表定義創建各數據表,建立表的各約束關係,創建索引。(創建表、約束關係、索引的SQL命令寫在下麵的空白處)
3、把給定Excel文件中的數據錄入(導入)到各數據表。
4、往資料庫的honor表中插入至少20條以上有效記錄,在該表上創建全文索引。
(1)使用Select命令列出honor表所有記錄,結果貼在下麵。
(2)寫出創建全文索引的過程與對應命令。
(3)基於全文索引寫至少3條查詢語句,並且貼出查詢結果。
實現操作過程
前提說明 -> 在操作過程中遇到的一些小問題,以及這些問題的解決方法:
- a. mysql 報錯:Loading local data is disabled; this must be enabled on both the client and
- 通常表示在伺服器端和客戶端都沒有啟用載入本地數據的功能。這可能是由於安全設置或配置限制所致
- 一般情況下是 local_infile=OFF 導致不能從本地導入
- 未啟用的話會導致 Mysql對其安全性的保護,從而拒絕連接
原因分析:
show global variables like 'local_infile';
-- 表示找到全局配置中的local file文件所在
顯然會顯示 OFF
需要對其進行修改為 true
SET GLOBAL local_infile = true; -- 將local_file的值修改為 ON
值得註意的是 在我們重啟之後依舊是OFF,所有我們需要對my.ini進行修改
my.ini是在Window下麵的文件
Docker和Linux中的文件是叫my.cnf,文件路徑在/etc/mysql/my.cnf
這裡增加配置 copy到配置文件就可以了
[mysql]
local_infile=ON
[client]
local_infile=ON
這個樣子我們就對其local_file的讀許可權打開了
b. secure-file-priv 所示文件路徑對讀取的位置限制問題
原因分析:
如果是這個樣子的 我們不能直接對全局的文件進行隨意讀取
否則會報錯,mysql為保護安全性而設置的,這裡我們需要進入配置文件 mysql.ini
MySQL伺服器配置了--secure-file-priv選項,限制了從文件載入數據的操作
本質是為了增加資料庫的安全性而採取的一項措施。
解決方法
- 選擇一個允許載入數據的目錄:可以通過修改MySQL的配置文件,將--secure-file-priv選項設置 為一個允許載入數據的目錄。你可以在配置文件中找到該選項並修改它。修改後,重新啟動 MySQL伺服器使更改生效 解決方法
- 將數據文件移動到允許的目錄:另一種方法是將數據文件移動到MySQL允許載入數據的目錄 中。你可以通過查看MySQL配置文件中--secure-file-priv選項指定的目錄,或者使用以下SQL查詢 來獲取允許的目錄位置
這裡我使用修改 --secure-file-priv的方法 找到my.ini配置文件 修改secure_file_priv
用管理員許可權 覆蓋my.ini
show variables like "secure_file_priv"; -- 顯示配置路徑
這個樣子我們可以對文件進行讀取了 ,我修改了文件名字,叫test.csv
這裡可以做個瞭解:
secure_file_priv="null" -- 對全局所有的文件都不能讀取
secure_file_priv="指定路徑" -- 只能讀取當前指定路徑下的文件夾內容 也就是信任
secure_file_priv="" -- 對讀取文件夾位置不做限制
c. ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
先quit出MySQL的控制台,再使用如下命令登入:
```sql
mysql -u root -p --local-infile
```
d. 對文件的指定列進行選擇性讀入,一些非法情況引發的ERROR
首先先瞭解對參數的認識,這些是LOAD DATA 語法的介紹
load data [low_priority] [local] infile 'file_name txt' [replace | ignore]
into table tbl_name
[fields
[terminated by't']
[OPTIONALLY] enclosed by '']
[escaped by'\' ]]
[lines terminated by'n']
[ignore number lines]
[(col_name, )]
這個 是ChatGPT 給出的解釋
LOAD DATA INFILE` 是一個 MySQL 的語句,用於將外部數據文件載入到資料庫表中。
[low_priority] -- (可選):使用低優先順序執行載入操作,以允許其他操作在載入過程中進行。
[local] -- (可選):指定數據文件位於本地客戶端而不是伺服器上。
infile 'file_name.txt' -- :指定要載入的數據文件的路徑和名稱。
[replace|ignore] -- (可選):指定當載入的數據與表中的數據衝突時的處理方式。`REPLACE` 表示替換衝突的數據,`IGNORE` 表示忽略衝突的數據。
into table tbl_name -- :指定要載入數據的目標表的名稱。
[fields terminated by 't'] -- (可選):指定欄位之間的分隔符。預設為製表符。
[OPTIONALLY] enclosed by '' -- (可選):指定欄位值的包圍符號。預設為空。
[escaped by '\''] -- (可選):指定轉義字元。預設為反斜杠。
[lines terminated by 'n'] -- (可選):指定行之間的分隔符。預設為換行符。
[ignore number lines] -- (可選):指定要忽略的行數。
[(col_name, )] -- (可選):指定要載入的列的列表。如果省略,則預設載入所有列。
這些參數允許你根據數據文件的格式和需求來配置載入操作。你可以根據實際情況提供適當的參數。
請註意,使用 LOAD DATA INFILE
進行數據載入需要適當的許可權,並且在安全性方面要謹慎。確保僅從可信的來源載入數據,並仔細驗證數據的格式和內容,以避免潛在的安全問題。
- 在MySQL中將數據載入到表中並指定列:
LOAD DATA LOCAL INFILE 'file.csv' INTO TABLE t1
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
(@col1,@col2,@col3,@col4) set name=@col4,id=@col2 ;
- 如果我有100列並且我只想導入2列
LOAD DATA INFILE 'file.csv'
INTO TABLE t1
(column1, @dummy, column2, @dummy, column3, ...)
FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '"'
LINES TERMINATED BY '\r\n';
只需將column1,column2等替換為您的列名,然後將@dummy放在CSV中您要忽略的列中.
- 在load data infile語句中指定CSV中的列名稱.
LOAD DATA INFILE '/path/filename.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\r\n'
(column_name3, column_name5);
測試指定讀取成功 代碼演示
數據表
實現代碼
create table test1 (
pid varchar(255)
); -- 建立測試表
LOAD DATA LOCAL INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\FILE_Data\\CSV\\test.csv'
INTO TABLE test1
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(@col1, @col2, @col3, @col4, @col5,@col6,@col7,@col8)
set pid=@col2; -- 讀取表數據並指定
實現結果
至此 目前的一些問題全部被解決 接下來是這次實驗報告的具體實現
1、連接並登錄MySQL客戶端,併在終端進行操作
2、創建資料庫LearnMySQL,按照給定Excel文件中表定義創建各數據表,建立表的各約束關係,創建索引。(創建表、約束關係、索引的SQL命令寫在下麵的空白處)
-
建立資料庫LearnMySQL
create database if not exists LearnMySQL; use LearnMySQL;
-
建立表的結構
這裡我設計的是3NF的結構
-- 創建 Course 表 CREATE TABLE Course ( cid INT PRIMARY KEY, cname VARCHAR(255), credit INT, pcid INT, chour INT, cattr VARCHAR(255), cnum INT, did VARCHAR(2) ); -- 創建 Department 表 CREATE TABLE Department ( did VARCHAR(2) PRIMARY KEY, dname VARCHAR(255) ); -- 創建 CourseHour 表 CREATE TABLE CourseHour ( chour INT PRIMARY KEY, cid INT );
-
創建各表的約束關係
-- 創建外鍵約束關係 ALTER TABLE Course ADD CONSTRAINT fk_course_pcid FOREIGN KEY (pcid) REFERENCES Course (cid); ALTER TABLE CourseHour ADD CONSTRAINT fk_coursehour_cid FOREIGN KEY (cid) REFERENCES Course (cid);
-
創建索引
-- 創建索引 CREATE INDEX idx_course_did ON Course (did);
3、把給定Excel文件中的數據錄入(導入)到各數據表。
因為給定實驗數據表有點問題 我這裡自己造了組數據
這裡我們使用 LOAD DATA 的方法
LOAD DATA LOCAL INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\FILE_Data\\CSV\\test.csv'
INTO TABLE course
FIELDS TERMINATED BY ',' -- 列分割
LINES TERMINATED BY '\n' -- 行分割
IGNORE 1 LINES ;
LOAD DATA LOCAL INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\FILE_Data\\CSV\\test.csv'
INTO TABLE CourseHour
FIELDS TERMINATED BY ',' -- 列分割
LINES TERMINATED BY '\n' -- 行分割
IGNORE 1 LINES
(@col1, @col2, @col3, @col4, @col5,@col6,@col7,@col8)
set chour=@col5,cid=@col2;
LOAD DATA LOCAL INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\FILE_Data\\CSV\\test.csv'
INTO TABLE Department
FIELDS TERMINATED BY ',' -- 列分割
LINES TERMINATED BY '\n' -- 行分割
IGNORE 1 LINES
(@col1, @col2, @col3, @col4, @col5,@col6,@col7,@col8)
set did=@col8,dname=@col2;
4、往資料庫的honor表中插入至少20條以上有效記錄,在該表上創建全文索引。
(1)使用Select命令列出honor表所有記錄,結果貼在下麵。
(2)寫出創建全文索引的過程與對應命令。
(3)基於全文索引寫至少3條查詢語句,並且貼出查詢結果。
-- 創建"honor"表
CREATE TABLE honor (
cid INT,
cname VARCHAR(50),
credit INT,
pcid INT,
chour INT,
cattr VARCHAR(50),
cnum INT,
did INT,
PRIMARY KEY (cid)
);
-- 插入記錄
INSERT INTO honor (cid, cname, credit, pcid, chour, cattr, cnum, did)
VALUES
(1, 'Mathematics', 3, NULL, 36, 'Science', 100, 1),
(2, 'English', 3, NULL, 48, 'General Education', 80, 2),
(3, 'Physics', 4, 1, 48, 'Science', 60, 1),
(4, 'Computer Science', 3, NULL, 36, 'Science', 120, 3),
(5, 'History', 3, 2, 36, 'General Education', 90, 2),
(6, 'Chemistry', 4, 1, 48, 'Science', 70, 1),
(7, 'Biology', 4, 1, 48, 'Science', 80, 1),
(8, 'Art', 2, NULL, 24, 'General Education', 50, 4),
(9, 'Geography', 3, 2, 36, 'General Education', 60, 2),
(10, 'Physical Education', 2, NULL, 24, 'General Education', 120, 5),
(11, 'Economics', 3, NULL, 36, 'Social Science', 70, 6),
(12, 'Music', 2, NULL, 24, 'General Education', 40, 4),
(13, 'Psychology', 3, 11, 36, 'Social Science', 60, 6),
(14, 'Sociology', 3, 11, 36, 'Social Science', 50, 6),
(15, 'Statistics', 3, 1, 36, 'Science', 80, 1),
(16, 'Literature', 3, 2, 36, 'General Education', 70, 2),
(17, 'Political Science', 3, 11, 36, 'Social Science', 60, 6),
(18, 'Philosophy', 3, NULL, 36, 'General Education', 40, 7),
(19, 'Engineering', 4, 4, 48, 'Science', 90, 3),
(20, 'Foreign Language', 3, 2, 36, 'General Education', 80, 2);
-- 在"honor"表的"cattr"列上創建全文索引
ALTER TABLE honor ADD FULLTEXT INDEX idx_cattr (cattr);
基於全文索引的三個查詢示例:
- 查找包含關鍵詞"Science"的課程:
SELECT * FROM honor WHERE MATCH(cattr) AGAINST('Science');
- 查找屬於"General Education"類別且學分大於等於3的課程:
SELECT * FROM honor WHERE MATCH(cattr) AGAINST('General Education') AND credit >= 3;
- 查找屬於"Social Science"類別且教學單位編號為6的課程:
SELECT * FROM honor WHERE MATCH(cattr) AGAINST('Social Science') AND did = 6;