1.目標
1> 了解mysqlId服務端程序
2> 掌握mysql客戶端程序的使用
3> 了解工具包中的其他程序
2. MySQL程序簡介
本章介紹 MySQL 命令?程序以及在運?這些程序時指定選項的?般語法(如:mysql -uroot -p)。 對常?程序進?詳細的講解(實用工具的使用方法),包括它們的選項。
MySQL安裝完成通常會包含如下程序:
? Linux系統程序(工具類程序)?般在 /usr/bin?錄下,可以通過命令查看:ll /usr/bin/mysql*
?然后還有一個:ll /usr/sbin/mysql* 命令,執行如下
? windows系統?錄:你的安裝路徑\MySQL Server 8.0\bin,可以通過命令查看:dir "D:\mysql\mysql-8.3.0-winx64\bin\*.exe"
每個 MySQL 程序都有許多不同的選項。?多數程序都提供?個 --help 選項,可以使?該選項
來獲取程序不同選項的描述。例如: mysql --help,可以通過在命令?或配置?件中指定選項來覆
蓋 MySQL 程序的默認選項值
后續會詳細學習以下MySQL程序
注意: 除了mysqlIds是服務端程序,后面的都是客戶端工具
程序名 | 作? |
mysqld(d表示daemon 表示后臺程序) | MySQL的守護進程即 MySQL 服務器,要使?MySQL 服務器 mysqld 必須正在運?狀態 |
mysql | MySQL客?端程序,?于交互式輸? SQL 語句或以批處理模式從?件執?SQL的命令??具(登錄數據庫服務,輸入sql語句,展示響應結果) |
mysqlcheck | ?于檢查、修復、分析和優化表的表維護客?端 |
mysqldump | 將 MySQL 數據庫轉儲到 SQL、?本或 XML ?件中的客?端(便于在不同的系統之間來回傳輸) |
mysqlimport | 將?本?件導?到表的客?端?具(備份和恢復再介紹) |
mysqladmin | 執?管理操作的客?端,例如創建或刪除數據庫、重新加載授權表、將表刷新到磁盤以及重新打開?志?件。Mysqladmin還可以?于從服務器檢索版本、進程和狀態信息。 |
mysqlshow | 顯?數據庫、表、列和索引信息的客?端(和mysql執行的show語法效果一樣,區別是不需要登錄,直接發送請求即可) |
mysqldumpslow | ?于讀取和匯總慢速查詢?志內容的實?程序(慢查詢: 查詢時間超過閾值,然后記錄下來) |
mysqlbinlog | 從?進制?志中讀取SQL語句的實?程序(處理二進制日志)。mysqlbinlog ?件中包含的已執?SQL語句的?志,可?于從崩潰中恢復數據。 |
mysqlslap | 客?端負載?具,模擬多個客?端同時訪問MySQL服務器,并報告每個階段的使?時間。 |
其他程序可以去官方網站看:MySQL :: MySQL 8.4 Reference Manual :: 6.5.1 mysql — The MySQL Command-Line Client
3. mysqlId - MySQL 服務器(介紹)
??mysqlId也被稱為MySQL服務器(是一個服務器程序),?是?個多線程程序,對數據目錄(mysql主要的工作目錄)進?訪問管理(包含數據庫和表)。數據?錄也是其他信息(如?志?件和狀態?件)的默認存儲位置。
? 當 MySQL 服務器啟動時,會偵聽指定的端?、處理來?客?端程序的?絡連接,并管理不同客戶
端對數據庫的訪問
? mysqlId 程序又很多選項可以在啟動的時候指定, 可以運行下面命令進行查看
mysqld --verbose --help?注意這里不需要連接mysql服務器的
4. mysql-MySQL 命令行客戶端
mysql 客戶端簡介
mysql 是一個簡單的sql shell, 可以輸入命令和執行sql語句, 當執行sql語句的時候, 查詢結果以ASCII表格式顯示
mysql的基本使用命令,比如連接
短選項格式
mysql -uroot?-p [db_name] 最后這個參數是指定連接的是哪個數據庫
我們不加mysql參數顯示的結果
當我輸入 mysql -uroot -p mysql? 加了參數, 輸入密碼. 然后查看選擇的數據庫, 發現就是mysql數據庫
相當于不加參數后, 再執行 use mysql 這個命令
另一種連接方式
長選項格式:
mysql --user=root --password [db_name]
?mysql 客戶端選項
指定選項的方式
? 在mysql后面的命令行列出路徑 剛剛上面的長選項短選項格式就是這個
? 在mysql后面指定配置文件的路徑, 以便在程序啟動的時候讀取配置文件中的選項, 并解析對應程序選項的值, 并應用在啟動參數中?
我們打開我們的MySQL客戶端的路徑, 然后去看它的屬性
具體是這個樣子
"C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe" "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" "-uroot" "-p" "--default-character-set=utf8mb4"
下面是解析
? 使用環境變量種的選項(不介紹)
mysql 客戶端命令常用選項
選項--長格式 | 短格式 | 說明 |
--host | -h | --host = host_name,-hhost_name 連接到指定主機上的 MySQL 服務(默認的地址127.0.0.1 localhost) |
--port | -P(大寫p) | --port=port_num, -pport_num TCP/IP 連接使用的端口號(默認是3306) |
user | -u | --user=user_name , -uuser_name ?于連接到MySQL 服務器的??名 |
--password | -p(小寫p) | --password[=password] , -p[password] ?于連接到MySQL 服務器的密碼。可選,如果沒有給出, 會提???輸? |
--defaults-file | --defaults-file=file_name使?指定的選項?件。如果該?件不存在,則會發?錯誤。 | |
--default-characterset | --default-character-set=charset_namecharset_name 將作為客戶端和當前連接的默認字符集,例: utf8mb4 | |
--database | -D | --database=db_name , -Ddb_name 指定要使?的數據庫 |
--compress | -C | --compress , -C 如果可能,壓縮客戶端和服務器之間傳輸的所有信息 |
--reconnect | --reconnect? 如果客戶端與服務器的連接丟失,?動嘗試重新連接(丟失重連) | |
--quick | -q | --quick , -q 不緩存查詢結果,收到??打印??,如果輸出被掛起,可能會降低服務器速度(謹慎使用) |
--protocol | --protocol={TCP|SOCKET|PIPE|MEMORY}?于連接到服務器的傳輸協議, 默認為TCP | |
--delimiter | --delimiter=str?設置SQL語句分隔符(標記sql語句結束的字符)。默認值為分號 ( ; ) | |
--execute | -e | --execute=statement , -estatement 執?指定的SQL語句并退出。 直接在mysql客戶端直接執行sql語句,并且直接退出, 連接成功之后, 讀取execute后的sql語句,直接就會把結果返回, 不用先登錄,然后寫sql,然后等待結果,最后退出,直接可以通過這個參數一步搞定 |
--version | -V | --version , -V?顯示版本信息并退出。 |
--help | -? | --help , -? 顯示幫助信息并退出。 |
注意: 如果選項的值中包含空格,那么值需要包含在雙引號中
在命令行中使用選項
規則:
1> -- 表示長格式, -表示短格式.?例如:-?和 --help 都表示MySQL 程序顯示他的幫助消息
2> 選項名稱區分大小寫. -v 和 -V 都是合法的,但是含義不同, 他們分別是 --verbose(盡可能詳細顯示結果) 和 --version(顯示mysql版本號)?選項的相應縮寫格式
3> 在某些選項后面需要指定一個值, 比如: 長格式:mysql -h 127.0.0.1 或mysql --host=127.0.0.1 表示向客戶端程序指定MySQL 服務器主機
4> 對于帶值的長格式選項,使用 = 分割選項名和值, 對于短格式, 選項值就直接跟在選項之后, 也可以用空格分開. 如: 長格式: --host=127.0.0.1, 段格式: -h127.0.0.1 和-h 127.0.0.1; 但是指定密碼選項的短格式,選項和值不能有空格:?
mysql -ptest test是表示密碼,但是沒有指定要訪問的數據庫
mysql -p test test 表示的是指定訪問的數據庫, 但是沒有指定密碼
注意: 在命令?中,第?個不帶破折號 - 的值被解析為要訪問的數據庫名, 選項+值是一組
5> 在選項名稱中, - 和 _ 大多情況下可以互換, 但是前導破折號不能轉為下劃線
如: --skip-grant-tables 和 --skin_grant_tables 是等價的 但是不能寫成?__skin_grant_tables
6> 對于采用數值的選項, 值的后綴可以帶有K,M,G表示乘數 1024、1024^2或 1024^3(指定緩沖區大小)如:?mysqladmin --count=1K --sleep=3 ping -uroot -p?告訴 mysqladmin對服務器執? 1024 次 ping,每次 ping 之間休眠 3 秒
7> 在命令行中包含空格的選項值, 必須用"" 引起來, 比如我們使用 --execute/-e選項和mysql一起使用的時候, 表示把一個或多個sql語句發送給服務器執行并顯示結果
沒使用execute之前
使用execute后:?mysql -u root -p -e "select version();select now();"
直接就返回結果
選項(配置)文件?
大多數MySQL程序都可以從選項文件(配置文件)中讀取啟動選項. 可以在選項文件中指定常用選項, 這樣就不用再每次創建程序的時候, 在命令行里面輸入它們. 大部分的選項文件都是純文本格式, 可以用文本編輯器進行創建(vscode)
使用方法
選項 --defaults-file 可以指定要使用的選項文件, 客戶端程序會讀取并應用選項文件中的配置
Linux
mysql --defaults-file=/etc/mysql/my.cnf -uroot -p
conf.d
mysql.conf.d/ mysql服務端
雖然把客戶端和服務器的配置文件做了區分, 但是一般不會分別在對應的配置文件中配置, 而是把所有的配置都寫在默認的配置文件中, 便于維護和管理
windows
mysql "--defaults-file=C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" -uroot -p 這一段是windows下默認的配置文件路徑
注意, 每次修改配置之前,必須要先進行備份
如果在使用mysql程序的時候(客戶端/服務端), 沒有指定配置文件的路徑, 那么就會自動讀取默認路徑下的配置文件. 下面介紹默認配置文件地址和加載順序
選項文件位置以及加載順序
在 Windows 系統讀取選項?件
mysql 按照下面順序查找并讀取選項/配置 文件. 如果文件不存在則需要手動創建. 讀取的順序從上到下, 后讀取的文件中配置的選項優先級越高.
?件名 | 說明 |
%WINDIR%\my.ini , %WINDIR%\my.cnf | 全局 |
C:\my.ini , C:\my.cnf | 全局 |
BASEDIR\my.ini , BASEDIR\my.cnf | 全局 |
defaults-extra-file | 如果存在其他選項?件可以通過 --defaults-extra-file選項指定 |
%APPDATA%\MySQL\.mylogin.cnf | 登錄路徑選項(僅限客?端)針對客戶端的配置文件 |
DATADIR\mysqld-auto.cnf | 系統變量 (僅限服務器) 這個是放我們的數據庫表的目錄,實現持久化存儲 |
優先級和讀取順序(注意一下)
對每個配置文件進行逐一的解釋
%WINDIR%\my.ini , %WINDIR%\my.cnf
先去c盤下的windows去查看有沒有my.ini, 如果有就加載并讀取相應的選項值, 如果沒有就繼續往下找
BASEDIR\my.ini , BASEDIR\my.cnf? ? BASEDIR這個是代表安裝路徑
defaults-extra-file 后面講linux會說區別
%APPDATA%\MySQL\.mylogin.cnf 針對客戶端的配置文件
DATADIR\mysqld-auto.cnf? ? DATADIR 這個是放我們的數據庫表的目錄,實現持久化存儲(僅用于服務器)
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini? ? 這個默認配置文件是在上面幾個執行的中間位置, 不固定. 這個路徑是我們常用的操作配置文件的路徑
在 Unix 和 Linux 系統上讀取的選項?件
?件名 | 說明 |
/etc/my.cnf | 全局 |
/etc/mysql/my.cnf | 全局 |
$MYSQL_HOME/my.cnf | 服務器特定選項(僅限服務器) |
defaults-extra-file | 如果存在其他選項?件可以通過 --defaults-extra-file 選項指定 |
~/.my.cnf | ??特定選項 |
~/.mylogin.cnf | ??特定的登錄路徑選項(僅限客?端) |
DATADIR/mysqld-auto.cnf | 系統變量 (僅限服務器) |
讀取順序和優先級
后讀取的會把前讀取的覆蓋掉(相同的選項值, 后面的覆蓋前面的選項值). 對于倆個配置文件中配置 了相同的選項, 那么優先級高的文件就會覆蓋掉優先級低的文件中的選項
對每個配置文件進行逐一的解釋
?/etc/my.cnf 默認是沒有的
defaults-extra-file
我們去官方文檔進行查看:?MySQL :: MySQL 8.0 Reference Manual :: 6.5.1.1 mysql Client Options
總結: 在widows 系統中配置文件的后綴名為 .ini 或 .conf. 在Linux 系統中配置文件的后綴名為.cnf
選項文件語法
1> 任何長選項都可以在選項文件中指定. 獲取選項列表可以使用下面指令
mysql --help
2> 選項文件中指定選項時, 省略倆個前導破折號, 并且每一行表示一個選項
例子:?--quick 和 --host=127.0.0.1 在選項?件中應表?成 quick 和 host=127.0.0.1 (并且需要換行)
quick
host=127.0.0.1
3> 注釋: 通常時以 # 或 ; 開頭
4> [group] 結點, 名稱不區分大小寫. 也就是當選項名稱和程序名稱相同, 則需要使用[]來區分時客戶端還是服務器的
[mysqlId]和[mysql] 組就分別適用于mysqlId服務程序和mysql客戶端程序(分開對每一個程序進行配置, 而不會影響到其他組)
5> opt_name = value (選項名和值)如: host=127.0.0.1?
選項名對應的值,可以使?轉義序列 \b , \t , \n , \r , \\ 和 \s 來表?退格符、制表符、換?符、回?符、反斜杠和空格字符
例子:
basedir="C:\\Program Files\\MySQL\\MySQL Server 8.0"
basedir="C:/Program Files/MySQL/MySQL Server 8.0"
6> [client] MySQL發?版中所有客?端程序(mysql,mysqkcheck,mysqkdump....)都會讀取并應?這個組下的選項(除了mysqld)配置的公共信息,在這個組下可以指定適?于所有客?端程序的通?選項,例如配置??名和密碼(但要確保只有??才可以訪問這個?件以防?密碼泄漏)也就是所有客戶端程序都會讀取client這個結點下配置的公共信息(客戶端的公共信息都可以寫到[client]里面
例子:?
# 在當前??的home?錄下創建.my.cnf,并在[client]寫?公共配置
# 這?主要設置?了主機、端?、??名、密碼
輸入 vim mysql.cnf
然后我們打開編輯模式按i,然后把下面的內容粘貼進去,編輯完成按Esc 退出編輯模式, 然后輸入:wq退出并保存
[client]
host=127.0.0.1
port=3306
user=root
password=12345
然后我們就可以不輸入密碼就進入mysql了
7>可以通過 [客?端程序名] 的形式為不同的客?端程序指定選項(自定義化的配置),例如 [mysql] ,當運?mysql程序時會讀取并應?該組下的配置,如果選項名與 [client] 重復, [client] 中的
選項將會被覆蓋([客?端程序名]結點的優先級高于[client]
?# 設置為必須輸?密碼
[mysql]
password
輸入mysql之后就需要輸入密碼了
8>?為特定 MySQL 版本設置選項可以使? [mysqld-5.7] 、 [mysqld-8.0] 的組名(使用不同版本的mysqlId)
9>?在選項?件中使? !include 指令來包含其他選項?件,例如: !include/home/mydir/myopt.cnf
這里面的cnf是具體的配置文件
10>?在選項?件中使? !includedir 指令來搜索指定?錄中的其他選項?件,例如: !include /home/mydir (這里面的mydir是一個指定的目錄)?但不保證?錄中選項?件的讀取順序(先掃描到誰, 加載誰)
注意:
1. !includedir 在 Unix和Linux 操作系統中會搜索指定?錄下任何以 .cnf 為后綴的?件.在 Windows 中,會搜索指定?錄下任何以 .ini 或 .cnf 為后綴的?件
2. 只會讀取包含?件中當前客?端的組配置,例如當前運?的是mysql程序,那么只會讀取[mysql]組中的選項配置
11>?在 Windows中請確保在配置?件的最后??加?個換?符,否則該?將被忽略
例子: 設置客戶端全局編碼格式
?輸入命令:?vim /etc/mysql/my.cnf
設置編碼集
[client] # 所有客?端程序者會讀取這個節點下的配置信息
default-character-set=utf8mb4 # 指定編碼格式為utf8mb4
?注意每次對配置文件進行修改, 我們都需要備份
cp mysql.cnf mysql.cnf.bak
mysql 客戶端命令
mysql客戶端命令的作用:
1> 執行sql語句
2> 執行指令
使?mysql客?端程序連接到數據庫服務器之后,可以發送SQL語句到服務器執?,并以 ";"(分
號)、\g 或 \G結束(結束標識符)
1. ; 與 \g 結束表?以表格形式展?結果
2. \G 結束表?以?形式展?結果
3. 如果當前已經輸?了?部分SQL 語句想重新輸?可以輸?Control+C中斷當前輸?
在當前模式下,mysql還有?組??的命令,可以輸? help or \h 查看命令列表
help/ \? 查看命令列表
clear/ \c 清除當前語句(寫錯了,想取消命令可以用這個)
connect/ \r 重新連接服務器
status/ \s 查看服務器狀態(里面包含線程情況, 服務器版本, 字符集...)
?delimiter/? \d? (英文: delimiter 是定界符的意思) 可以設置mysql語句的結束標識符
?
?exit \q? | quit \q 這倆個指令都是退出mysql
tee/ \T 把執行的結果保存在一個指定的目錄文件中(相當于日志)
創建文件/root/rs.txt
使用tee指令把指定txt文件作為mysql指令結果記錄目錄
?
執行mysql 語句 結果會保存在剛剛指定的路徑
查看指定的 rs.txt文件 發現都是我們執行的mysql語句結果集
notee/ -t 執行結果不再寫入文件
prompt/ \R?修改提示符
這個就是提示符?
source/ \. ?加載并執行指定的.sql腳本(把我們本機的sql語句搞到一個文件里面,然后在服務器通過這個命令把文件進行引用,然后進行執行即可)(后續會演示)
system/ \!?在mysql上執行系統命令, 非常危險
?甚至可以查看密碼, 十分的危險
?use/ \u 使用數據庫
warnings/ \W 顯示警告信息
nowarning/ \w 不顯示警告信息
help contents 獲取服務端的幫助(集成了官方文檔)
?我們查看 Data Types 里面 BIT 類型的詳細解釋信息
從sql文件執行SQL語句
使用場景: 開發環境-->測試環境-->生產環境
使用 source命令進行導入?
有時候我們需要從.sql 文件執行?些SQL語句,比如要把?個數據庫從?臺服務器A復制到另?臺服務器B上,那么可以先從服務器A導出數據到.sql?件,然后在服務器B執行這個.sql?件,在剛剛我們學習了,用help命令查看命令列表,可以看到有?個source 命令如下所示:
\. sql文件的絕對路徑
我們進行演示
?1. 準備要執行的.sql?件,名為test_db.sql,內容如下:
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;DROP DATABASE IF EXISTS `test_db`;
CREATE DATABASE `test_db` CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;USE `test_db`;-- ----------------------------
-- Table structure for classes
-- ----------------------------
DROP TABLE IF EXISTS `classes`;
CREATE TABLE `classes` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`desc` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of classes
-- ----------------------------
INSERT INTO `classes` VALUES (1, '計算機系2019級1班', '學習了計算機原理、C和Java語言、數據結構和算法');
INSERT INTO `classes` VALUES (2, '中文系2019級3班', '學習了中國傳統文學');
INSERT INTO `classes` VALUES (3, '自動化2019級5班', '學習了機械自動化');-- ----------------------------
-- Table structure for course
-- ----------------------------
DROP TABLE IF EXISTS `course`;
CREATE TABLE `course` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of course
-- ----------------------------
INSERT INTO `course` VALUES (1, 'Java');
INSERT INTO `course` VALUES (2, '中國傳統文化');
INSERT INTO `course` VALUES (3, '計算機原理');
INSERT INTO `course` VALUES (4, '語文');
INSERT INTO `course` VALUES (5, '高階數學');
INSERT INTO `course` VALUES (6, '英文');-- ----------------------------
-- Table structure for score
-- ----------------------------
DROP TABLE IF EXISTS `score`;
CREATE TABLE `score` (`score` decimal(3, 1) NULL DEFAULT NULL,`student_id` int(11) NULL DEFAULT NULL,`course_id` int(11) NULL DEFAULT NULL
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of score
-- ----------------------------
INSERT INTO `score` VALUES (70.5, 1, 1);
INSERT INTO `score` VALUES (98.5, 1, 3);
INSERT INTO `score` VALUES (33.0, 1, 5);
INSERT INTO `score` VALUES (98.0, 1, 6);
INSERT INTO `score` VALUES (60.0, 2, 1);
INSERT INTO `score` VALUES (59.5, 2, 5);
INSERT INTO `score` VALUES (33.0, 3, 1);
INSERT INTO `score` VALUES (68.0, 3, 3);
INSERT INTO `score` VALUES (99.0, 3, 5);
INSERT INTO `score` VALUES (67.0, 4, 1);
INSERT INTO `score` VALUES (23.0, 4, 3);
INSERT INTO `score` VALUES (56.0, 4, 5);
INSERT INTO `score` VALUES (72.0, 4, 6);
INSERT INTO `score` VALUES (81.0, 5, 1);
INSERT INTO `score` VALUES (37.0, 5, 5);-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (`id` int(11) PRIMARY KEY AUTO_INCREMENT,`sn` int(11) NOT NULL COMMENT '學號',`name` varchar(20) NOT NULL COMMENT '姓名',`mail` varchar(20) COMMENT 'QQ郵箱'
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (1, 50001, '張三', 'zs@bit.com');
INSERT INTO `student` VALUES (2, 50002, '李四', 'ls@bit.com');
INSERT INTO `student` VALUES (3, 50003, '王五', 'ww@bit.com');
INSERT INTO `student` VALUES (4, 50004, '趙六', 'zl@bit.com');
INSERT INTO `student` VALUES (5, 50005, '錢七', 'qq@bit.com');SET FOREIGN_KEY_CHECKS = 1;
把上面的sql語句保存在test_db.sql文件里面,然后傳到你的服務器里面
?刪除 .txt文件后綴
?查看當前有沒有這個數據庫
執行外部sql文件
查看數據庫: 發現確實創建了這個數據庫
注意, 執行的時候可能沒有權限, 我們要切換成root用戶
?使?mysql客戶端導入
不需要登錄mysql而是直接在我們linux終端來執行
mysql < test_db.sql -u root -p
執行結果, 發現確實是有數據庫和表
注意:
mysql db_name < text_file # 在指定的數據庫下執?SQL,前提是數據庫必須提前建?好
mysql < text_file # 不指定數據庫.sql中必須有USE [database_name],來指定要操作的數據庫
?
5. 工具包中其他程序的使用?
程序名 | 作? |
mysqld(d表示daemon 表示后臺程序) | MySQL的守護進程即 MySQL 服務器,要使?MySQL 服務器 mysqld 必須正在運?狀態 |
mysql | MySQL客?端程序,?于交互式輸? SQL 語句或以批處理模式從?件執?SQL的命令??具(登錄數據庫服務,輸入sql語句,展示響應結果) |
mysqlcheck | ?于檢查、修復、分析和優化表的表維護客?端 |
mysqldump | 將 MySQL 數據庫轉儲到 SQL、?本或 XML ?件中的客?端(便于在不同的系統之間來回傳輸) |
mysqlimport | 將?本?件導?到表的客?端?具(備份和恢復再介紹) |
mysqladmin | 執?管理操作的客?端,例如創建或刪除數據庫、重新加載授權表、將表刷新到磁盤以及重新打開?志?件。Mysqladmin還可以?于從服務器檢索版本、進程和狀態信息。 |
mysqlshow | 顯?數據庫、表、列和索引信息的客?端(和mysql執行的show語法效果一樣,區別是不需要登錄,直接發送請求即可) |
mysqldumpslow | ?于讀取和匯總慢速查詢?志內容的實?程序(慢查詢: 查詢時間超過閾值,然后記錄下來) |
mysqlbinlog | 從?進制?志中讀取SQL語句的實?程序(處理二進制日志)。mysqlbinlog ?件中包含的已執?SQL語句的?志,可?于從崩潰中恢復數據。 |
mysqlslap | 客?端負載?具,模擬多個客?端同時訪問MySQL服務器,并報告每個階段的使?時間。 |
在命令?中使?MySQL發?版中的其他?具時,?些選項是公共的,?如??名和密碼,使??法和mysql相同,在這?統?列出,后?我們在介紹不同的?具時,只討論個性的選項及作?,公共選項如下所?:
選項--?格式 | 短格式 | 說明 |
--host | -h | --host=host_name , -h host_name 連接到指定主機上的 MySQL 服務 |
--port | -P | --port=port_num , -P port_num TCP/IP 連接使?的端?號 |
--user | -u | --user=user_name , -u user_name ?于連接到MySQL 服務器的??名 |
--password | -p | --password[=password] , -p[password] ?于連接到MySQL 服務器的密碼。可選,如果沒有給出, 會提???輸? |
--defaults-file | --defaults-file=dile_name 使用指定的選項文件, 如果該文件不存在, 則會發生錯誤 | |
--compress | -C | --compress,-C 如果可能, 壓縮客戶端和服務器之間傳輸的所有信息 |
--protocol | --protocol={TCP|SOCKET|PIPE|MEMORY} | |
--version | -V | --version, -V 顯示版本信息并退出 |
--help | -? | --help,-? 顯示幫助信息并退出 |
mysqlcheck? - 表維護程序
作用
mysql客戶端主要執行表維護, 可以對表進行: 分析, 檢查, 優化或回復操作
? 分析的作?是查看表的關鍵字分布(定義了哪些二級索引,通過哪些where條件可以查詢到),能夠讓 sql ?成正確的執?計劃(?持 InnoDB,MyISAM,NDB)
? 檢查的作?是檢查表的完整性以及數據庫表和索引是否損壞(當意外斷電的時候,寫數據有沒有寫完,返回錯誤..)(?持 InnoDB,MyISAM,ARCHIVE,CSV)
? 優化的作?是回收空間、減少碎?(整理磁盤碎片)、提?I/O(?持 InnoDB,MyISAM,ARCHIVE)
? 修復的作?是修復可能已經損壞的表(?持 MyISAM,ARCHIVE,CSV)
?注意事項:
1. 當使?mysqlcheck?具時,MySQL服務器必須在運?狀態
2. 執?過程中相應的表將會被鎖定,所以其他的操作將會被掛起
3. 并不是所有的存儲引擎都?持以上四種操作,如果遇到不?持的引擎會報出相應的錯誤
4. 執?表修復操作之前對表進?備份(修改數據庫的時候覺得備份),在某些情況下可能會導致數據丟失。
使用方法:
使用三種方式來使用mysqlcheck
mysqlcheck [options] db_name [tbl_name ...]? 指定數據庫名,表名
mysqlcheck [options] --databases db_name ... 多個數據庫mysqlcheck [options] --all-databases 2 所有的數據庫
常用選項
mysqlcheck有如下常?選項,可以在命令?中指定,也可以在選項?件中通過 [mysqlcheck] 和 [client] 組進?指定
選項 | 說明 |
--analyze,-a | 分析表 |
--auto-repair | 如果檢查的表有損壞,則?動修復它。所有表都檢查過之后才進?必要的修復(自動修復) |
--check,-c | 檢查表中的錯誤。mysqlcheck的默認操作 |
--check-only-changed,- C | 僅檢查?上次檢查以來更改過的表, 沒有修改的表會被忽略 |
--databases,-B | 多個數據庫名?空格隔開 處理指定數據庫中的所有表 |
--force, -f | 即使發?SQL錯誤也要繼續 |
--optimize,-o | 優化表 |
--repair,-r | 執?可能進?的任務修復操作,除了唯?鍵 |
--skip-database | --skip-database=db_name不需要執?檢查的數據庫名(區分??寫)(跳過哪些數據庫) |
--tables | --tables=table_name 多個表名?空格隔開 在選項之后的所有名稱參數都被視為表名。 |
--use-frm | 對于MyISAM表的修復操作 |
分析表: mysqlcheck -a 數據庫名稱 -u root -p??
?檢查表: mysqlcheck --check 數據庫名稱 -uroot -p
?修復表: mysqlcheck --repair 數據庫名稱 -uroot -p
注意: 修復不支持InnoDB存儲引擎, 如果要修復InnoB存儲引擎的數據, 要把InnoDB存儲引擎的表轉化成Mylsam存儲引擎
優化表: mysqlcheck --optimize 數據庫名 -uroot -p
注意:
1> InnoDB在優化過程中執行的是一個重建的操作
2> 官網建議不要經常取執行優化操作(一天,一小時算經常, 大表一個月優化一次, 小表可以不優化)
mysqlcheck的特殊使用
mysqlcheck程序的默認功能是對數據表進? 檢查 操作(相當于指定選項 --check ),如果想要對表進?修復操作,可以通過復制原來的mysqlcheck程序,并重命名為mysqlrepair,并運?mysqlrepair即可,還可以創建mysqlcheck的快捷?式,并把快捷?式命名為mysqlrepair然后
直接運?,這時就執?的是修復操作,通過下表所?的命名?式可以改變mysqlcheck的默認?為
好處: 不需要指定對應的操作選項, 只要指定數據庫/表
程序名 | 說明 |
mysqlrepair | 默認?為是修復,相當于選項 --repair |
mysqlanalyze | 默認?為是修復,相當于分析 --analyze |
mysqloptimize | 默認?為是修復,相當于優化 --optimize |
Mysqldump - 數據庫備份程序
作用: mysqldump客戶端程序可以執行邏輯備份并且生成一組SQL語句, 其中包含原始數據庫和表的定義以及表中的數據, 以便實現對數據庫的簡單備份或復制, mysqldump可以生成,.sql,csv或xml格式文件
注意事項:
1. 轉儲表時必須要有 SELECT 權限(查詢)
2. 轉儲視圖時必須要有 SHOW VIEW 權限
3. 轉儲觸發器時必須要有 TRIGGER 權限
4. 如果沒有使? --single-transaction 選項時必須要有 LOCK TABLES 權限
5. 如果沒有使? --no-tablespaces 選項時必須要有 PROCESS 權限
6. 重新導?轉儲?件時,也需要有相應的權限(delete,update...
7. 由于mysqldump是逐?轉儲數據,所以不適?于?數據量的轉儲與導?
使用方法:
mysqldump的?法通常有以下使?,可以轉儲?個或多個表或數據庫,如下所?:
mysqldump [options] db_name [tbl_name ...] 指定一個數據庫(表名)
mysqldump [options] --databases db_name ... 指定多個數據庫
mysqldump [options] --all-databases 所有的數據庫
常用選項:
mysqldump有如下常?選項,可以在命令?中指定,也可以在選項?件中通過 [mysqldump] 和[client] 組進?指定
選項 | 說明 |
--add-drop-database | 在每個 CREATE DATABASE 語句之前添加 DROP DATABASE 語句? ( 相當于 每次創建數據庫?前面?drop database if exists 數據庫名字)? |
--add-drop-table | 在每個 CREATE TABLE 語句之前添加 DROP TABLE 語句(相當于 每次創建表 前面drop table if exists 數據表名) |
--add-drop-trigger | 在每個 CREATE TRIGGER 語句之前添加 DROP TRIGGER 語句(創建觸發器同上) |
--add-locks | ? LOCK TABLES 和 UNLOCK TABLES 語句包裹每個表轉儲(鎖起來, 讓別的操作不要影響當下執行的操作) |
--all-databases,-A | 轉儲所有數據庫中的所有表 |
--databases,-B | --databases=db_name 多個數據庫名?空格隔開 將參數解釋為數據庫名稱并轉儲所有的表 |
--comments,-i | 添加注釋到轉儲?件 添加注釋 |
--compact | 緊湊格式輸出 給表添加值的時候, 一口氣添加一組, 而不是一個一個添加 |
--compatible=ansi | ?成與其他數據庫或舊MySQL服務器更兼容的輸出 |
--complete-insert,-c | 使?包含列名的完整INSERT語句 |
--events,-E | 從轉儲數據庫中轉儲事件 |
--extended-insert,-e | 使?多?INSERT語法 |
--flush-logs,-F | 在開始轉儲前刷新?志 |
--flush-privileges | 在轉儲后刷新權限 |
--force,-f | 轉儲期間發?了SQL錯誤,也要繼續 |
--hex-blob | 使??六進制表?法轉儲?進制列 |
--ignore-table | --ignore-table=db_name,table_name 多個表?空格隔開 不轉儲給定的表 哪些表是不需要導入的 |
--lock-all-tables,-x | 鎖定所有數據庫中的所有表 |
--lock-tables,-l | 在轉儲之前鎖定指定要轉儲的表 |
--no-autocommot | --databases=db_name --ignore-table=db_name.table_name |
--no-create-db,-n | 不要?成 CREATE DATABASE 語句 不會出現drop database if exists 數據庫名字 語句, 和上面相反 |
--no-create-info,-t | 不要為每個轉儲的表?成 CREATE TABLE 語句 |
--no-data,-d | 不轉儲表內容(不會生成 insert 語句) 默認是生成的 |
--skip-add-drop-table | 在每個 CREATE TABLE 語句之前不添加 DROP TABLE 語句 |
--skip-add-locks | 不要添加鎖 |
--skip-comments | 轉儲?件中不添加注釋 |
--skip-compact | 不使?緊湊格式 |
--skip-triggers | 不轉儲觸發器 |
--tables | --tables=table_name 多個表名?空格隔開 在選項之后的所有名稱參數都被視為表名。 需要轉儲哪些表 |
--triggers | 轉儲每個表中的觸發器 |
--xml,-X | 以XML格式輸出 指定輸出格式 |
導出mysql語句:??mysqldump 數據庫名 > 指定的目錄.sql -uroot -p? 把我們的數據庫以文字的形式存在文件里面(具體的數據庫和表->sql語句)
?
查看我們轉儲的文件
導出單個數據庫
導出所有數據庫, 添加drop if exsist語句, 刪除insert語句
mysqldump -A --add-drop-database --no-data > /root/dumpAll.sql -uroot -p
mysqladmin -MySQL 服務器管理程序
作用:? 是一個執行管理操作的客戶端. 可以用來檢查服務器的配置和當前狀態, 以及創建和刪除數據庫等(配合使用mysqladmin的用戶必須具備管理員權限)
使用方法:
mysqladmin可以使用下面的語法
mysqladmin [options] command [command-arg] [command [command-arg]] ...
?常用選項:
可以使用[mysqladmin]和[client]進行指定
支持的命令:
語法中的command 表?命令,有些命令后?需要跟上?個參數,如下列出了mysqladmin 的常?命令
1. version
顯示服務器的版本信息: mysqladmin version -uroot -p (當前mysql的版本是多少, 協議版本,..)
2. status?
查看服務器狀態: mysqladmin status -uroot -p (線程數...)
參數含義
Uptime MySQL 服務器已運?的秒數。
Threads 活動線程(客?端)的數量。
Questions ?服務器啟動以來客?端的問題(查詢)數。
Slow queries 慢SQL的查詢數。
Opens 服務器已打開的表數。
Flush tables 服務器已執?flush-*、refresh和reload命令的數量。
Open tables 當前打開的表數。
3. create db_name?
創建一個數據庫名為 db_name 的數據庫: mysqladmin create 數據庫名 -uroot -p
注意: 創建數據庫使用的編碼集是選項文件中配置的編碼集, 如果沒有指定那么就使用當前MySQL版本默認的編碼集
4. drop db_name
刪除數據庫名為 db_name 的數據庫: mysqladmin drop 數據庫名 -uroot -p
5. extended-status
顯示服務器狀態變量的值 描述系統的工作狀態
6. flush-hosts
刷新主機緩存中的所有信息
7. flus-logs[log_type...]
刷新所有日志, log_type 中可以提供下一種或多種日志類型binary,engine,error,general,relay,slow,多個類型之間用空格分割
8. flush-privilages
重新加載授權表
9. flush-tables
刷新所有表
10. flush-threads
刷新線程緩存
11. password new_password
設置新密碼
? 如果密碼中有空格必須?雙引號把密碼包裹起來
? password 后可以省略新密碼,mysqladmin會在之后提?輸?新密碼
? password 做為最后?個command 時才可以省略密碼值,否則下?個參數將作為密碼被設置
12. ping
檢查服務器是否可用(不斷的發送請求)
13. processlist
顯示活動服務器線程的列表: mysqladmin processlist -u root -p
為什么要查進程列表, 當我們服務器的可用連接占滿了之后,我們需要讓他自動去釋放, Mysql默認可用維護150個活動連接, 如果連接被使用完, 那么就可以通過kill指令手動釋放那些睡眠時間很長的連接(很多情況是死鎖了不釋放)
14. kill id, id,...
終止服務器線程, 如果給出了多個線程ID值, 則列表中不能有空格
此時殺死后,我們再執行殺死的那個連接, 發現進行了重新連接
?15. reload
重新加載授權表
16. refresh?
刷新所有表
17. shutdown
停止服務器
18. start-replica
在副本服務器上開始復制. Mysql 8.0.26后的版本開始使用
19. start-slave?
在副本服務器上開始復制. 同18
20. stop-replica
停止副本服務器上的復制.?MySQL 8.0.26及以后的版本使?此命令。
21. stop-slave?
停止副本服務器上的服務.MySQL 8.0.26 之前使?此命令
22. variables
顯示服務器系統變量及其值: mysqladmin variables -uroot -p123456
?mysqlshow - 顯示數據庫, 表和列信息
?作用:
客戶端可用于快速查看哪些數據庫, 數據庫中的表和表中的列或索引(和show databases;返回結果一樣)
注意事項:
具體可用看看官方文檔:?https://dev.mysql.com/doc/refman/8.0/en/show.html
使用方法:
mysqlshow [options] [db_name [tbl_name [col_name]]]
? db_name tbl_name col_name 可以使?通配符 * 、 ? 、 % 或 _
? 如果沒有指定數據庫,則顯?所有數據庫名稱列表。
? 如果沒有指定表,則顯?數據庫中所有匹配的表。
? 如果沒有指定列,則顯?表中所有匹配的列和列類型。
? 輸出僅顯?當前權限可以訪問的數據庫、表或列的名稱。
常用選項:
顯示指定數據庫中的表: mysqlshow 數據庫名 -uroot -p123456
顯示表中所有的列: mysqlshow 數據庫 數據表 -uroot -p123456
顯示某個表中的某一列: mysqlshow 數據庫 數據表 表里面的字段 -uroot -p123456
mysqldumpslow - 總結慢查詢日志文件
作用:
在使用MySOL數據庫的時候, 經常進行查詢操作, 當某些查詢語句執行的時間非常長, 超過了設定的閾值, 則稱之為慢查詢, 慢查詢的相關信息被記錄成一個日志叫做慢查詢日志, mysqldumpslow 可用解析慢查詢日志文件并匯總其內容, 有關慢查詢日志的內容在服務器配置進行詳細解析
進行慢查詢對應的SQL優化的依據
我們先使用 mysqladmin status -u root -p123456 查看是否有慢查詢語句
再通過 show variables like '%query%' 可用查看系統變量, 其中 long_query_time 是設置的慢查詢的指定閾值,此時為10s, 默認的慢查詢日志文件是 slow_query_log_file, 此時還涉及一個開關, slow_query_log (默認是off 不記錄日志)
注意事項:
通常情況下,mysqldumpslow 會將相似的查詢分組并顯?摘要輸出,?般會把數字和字符串? N和 "S" 代替,要想顯?真實的值可以使? -a 和 -n 選項
使用方法:
語法:?mysqldumpslow [options] [log_file ...] log_file是具體的慢日志保存路徑
參數解釋
count: 執行的次數
Time: 單次的耗時
Lock: 申請與釋放鎖使用的時間
Rows 獲取數據所用的時間
mysqldumpslow常用選項
選項 | 說明 |
-a | 不? N 和 'S' 代替numbers和String |
-n N | 在名稱中包含N個以上的數字? N 代替 |
-g pattern | 僅考慮與指定模式匹配(字符串匹配操作)的慢查詢 |
--help | 顯?幫助信息并退出 |
-h host_name | 與*-slow.log?件名對應的MySQL服務器主機名。 可以包含通配符。默認值是*(匹配所有)。 如: /var/lib/mysql/iZ7xv6ge3eb3kvqovp1jw7Z(主機名)-slow.log 把所有集群里面慢日志都集中在一臺機器上? ?主機級別 |
-i name | 服務器實例的名稱? mysql級別 |
-l | 不要從總時間中減去鎖占?的時間 |
-r | 倒序順列 |
-s sort_type | 如何對輸出進?排序 |
-t N | 顯?輸出中的前N個查詢 分析前n條數據 |
--verbose , -v | 打印有關程序功能的更多信息 |
-s sort_type sort_type可選的值如下所示:
t , at : 按查詢時間或平均查詢時間排序,默認排序l , al : 按鎖占?時間或平均鎖占?時間排序
r , ar : 按發送的?數或平均發送的?數排序
c : 按計數排序
?mysqlbinlog - 處理二進制日志文件
什么是二進制日志文件:
我們平時對數據庫的修改,包括對數據的增刪改,都會被描述成?個"事件",每個"事件"都會以?進制的形式記錄在?個?件?,這個?件就是服務器的?進制?志?件,稱為Binary Log或binlog??關于?進制?志?件的具體格式與使?場景我們在MySQL 主從復制(集群部署的時候,數據庫的查詢比寫使用更加頻繁, 此時就會把集群分為主節點和若干個從結點,主結點寫入,從結點查詢,寫入的數據(修改數據)會把這個操作作為一個事件保存在binglog里面(某一行,某一個字符做了哪些修改),從結點會定時讀取整個binglog,把里面的二進制解析成sql語句然后執行一次, 這就是主從同步)專題 講解
作用:
mysqlbinlog 能夠以?本格式顯??進制?志?件中的內容。
注意事項
? binlog的默認保存路徑是數據?錄:
? Linux下默認?錄:/var/lib/mysql
? Windows下默認?錄:C:\ProgramData\MySQL\MySQL Server 8.0\Data
? binlog是以 .00000n 結尾命名的?件,n不斷遞增
# binlog的名字可以在選項?件?配置,我這?默認的是
binlog開頭root@guangchen-vm:/var/lib/mysql# ll binlog*
mysqlbinlog使用方法
mysqlbinlog [options] log_file ...
先把字符集注解掉:?vim /etc/mysql/my.cnf?
?然后我們輸入這個指令查看二進制文件: mysqlbinlog binlog.000001
我們介紹一下一個事件
binlog.000010 的輸出內容中包含各種事件,事件信息包括 SQL 語句、執?語句的服務器 ID、語
句執?時的時間戳、花費的時間等等。?志的具體格式我們這?先不做討論。
選項文件
mysqlbinlog 有如下常?選項,可以在命令?中指定,也可以在選項?件中通過 [mysqlbinlog] 和 [client] 組進?指定
mysqlslap - 負載仿真客戶端
作用: mysqlslap是一個診斷程序, 用于模擬MySQL服務器的客戶端負載(模擬很多客戶端同時連接服務器,執行很多次查詢,查看服務器的負載情況,每個查詢執行的時間是多少), 并報告每個階段的時間, 就好比多個客戶端正在訪問服務器一樣.
使用方法:?mysqlslap [options]
注意事項:
1. 可以通過 --create 或 --query 選項,指定包含SQL語句的字符串或包含SQL語句的?件
2. 如果指定?個包含SQL語句的?件,默認情況下每?必須包含?條語句(也就是說,隱式語句分隔符是換?符)
3. 如果要把?條語句分為多?書寫,可以使? --delimiter 選項指定不同的分隔符
4. 不能在?件中包含注釋,因為mysqlslap不能解析注釋。
5. mysqlslap運?分為三個階段:
????????a. 創建測試數據階段:創建?于測試的庫、表或數據,這個階段使?單個客?端連接
????????b. 運?負載測試階段,這個階段可以使?許多客?端連接
????????c. 清理階段:執?刪除表,斷開連接等操作,這個階段使?單個客?端連接
示例:
1. 提供?定義的創建和查詢語句,創建50個客?端連接,每個客?端進?200次 select 查詢(在??內輸?命令)??
?mysqlslap --delimiter=";" --create="CREATE TABLE a (b int);INSERT INTO a VALUES (23);" --query="SELECT * FROM a" --concurrency=50 --iterations=200 -u root -p
然后會執行一段時間, 會生成測試報告
2.?讓mysqlslap?包含兩個 INT 列和三個 VARCHAR 列的表?動構建查詢的SQL語句。使?5個客?端,每個客?端查詢20次。
mysqlslap --concurrency=5 --iterations=20 --number-int-cols=2 --number-chat -uroot -p
3.?從指定的?件中加載創建、插?和查詢SQL語句。SQL?件中的語句以 ";" 分隔。使?5個客?
端,每個客?端查詢5次。(自己后面執行一下)
mysqlslap --concurrency=5 --iterations=5 --query=query.sql --create=create.sql --delimiter=";" -uroot -p
常用選項:
mysqlslap 有如下常?選項,可以在命令?中指定,也可以在選項?件中通過 [mysqlslap] 和[client] 組進?指定
?
mysqlslap 應用于性能測試(重要: 測試數據庫)
1> 基本語法
mysqlslap --user=<username> --password=<password> --host=<hostname> --concurrency=<number_of_clients> --iterations=<number_of_iterations> --query=<sql_query> --create=<sql_create>
--user: 寫你的數據庫用戶名
--password: 寫你的數據庫密碼
--host: 寫你指定的主機名
--concurrency: 寫你測試的并發數(模擬虛擬用戶)
--iteratiion: 寫性能測試迭代多少次
--query: 寫執行sql的查詢語句或者含有sql查詢語句的.sql文件
--create: 寫執行sql的創建語句或者含有sql創建語句的.sql文件
2> 使用vim來創建含有sql語句的sql文件
把sql語句復制到里面去
3> 執行創建數據庫的sql測試:
mysqlslap --user=root --password=123456 --host=localhost --concurrency=100 --iterations=3 --create=create.sql
該指令使用 mysqlslap 工具連接到本地 MySQL 服務器,使用 root 用戶和密碼 123456,模擬 100 個并發連接,執行 3 次測試迭代,基于 create.sql 文件中的 SQL 語句創建數據庫結構并進行性能測試。
4> 執行查詢sql的測試
?mysqlslap --user=root --password=123456 --host=localhost --concurrency=100 --iterations=10 --create-schema=test_db --query=query.sql
該指令使用 mysqlslap 工具連接到本地 MySQL 服務器,使用 root 用戶和密碼 123456,模擬 100 個并發連接,執行 3 次測試迭代,并根據 create.sql 文件中的 SQL 語句創建數據庫對象進行性能測試。