30.1. MySQL數據庫簡介,客戶端簡單操作,安裝

文件管理系統的缺點

編寫應用程序不方便
數據冗餘不可避免
應用程序依賴性
不支持對文件的併發訪問
數據間聯繫弱
難以按用戶視圖表示數據
無安全控制功能

數據庫管理系統的優點

相互關聯的數據的集合
較少的數據冗餘
程序與數據相互獨立
保證數據的安全、可靠
最大限度地保證數據的正確性
數據可以併發使用並能同時保證一致性

數據庫管理系統

數據庫是數據的彙集,它以一定的組織形式存於存儲介質上
DBMS是管理數據庫的系統軟件,它實現數據庫系統的各種功能。是數據庫系統的核心
DBA(團隊):負責數據庫的規劃、設計、協調、維護和管理等工作
應用程序指以數據庫爲基礎的應用程序

數據庫管理系統的基本功能

數據定義
數據處理
數據安全
數據備份

數據庫系統的架構

單機架構 :比如access,一些財務數據庫
大型主機/終端架構:一個大型主機帶多套鍵鼠顯示屏設備(終端)
主從式架構(C/S):主流的客戶端服務端架構
分佈式架構 :集羣

  • 網狀數據庫:數據量大時,過於混亂
  • 層次數據庫: 數據容易冗餘,佔用更多空間
  • NOSQL : not only SQL 不僅僅是關係數據庫,提升效率的新型數據庫結構,例如redis,memcache

關係型數據庫:效率較低

關係 :關係就是二維表,其中:表中的行、列次序並不重要
行row(record):表中的每一行,又稱爲一條記錄
列column(field):表中的每一列,稱爲屬性或字段
主鍵Primary key:用於惟一確定一個記錄的字段,一張表只能一個主鍵,且主鍵(或者複合主鍵)的字段不能重複
域domain:屬性的取值範圍,如,性別只能是‘男’和‘女’兩個值

關係數據庫

  • RDBMS:(去IOE活動)
    MySQL: MySQL, MariaDB, Percona Server
    PostgreSQL: 簡稱爲pgsql,EnterpriseDB
    Oracle
    MSSQL
    DB2
  • 數據庫排名:
    https://db-engines.com/en/ranking

聯繫類型

  • 數據的操作:
    數據提取:在數據集合中提取感興趣的內容。 SELECT
    數據更新:變更數據庫中的數據。 INSERT、 DELETE、 UPDATE
  • 數據的約束條件 :是一組完整性規則的集合
    實體(行)完整性 Entity integrity
    域(列)完整性 Domain Integrity
    參考完整性 Referential Integrity
  • 聯繫的類型
    一對一聯繫(1:1)
    一對多聯繫(1:n)
    多對多聯繫(m:n)

注意點1:

  1. 1:n或者說n對1的關係:就比如一個部門有多個員工,員工所屬的部門這一個field就應該重新再列另外一張表來進行存儲,不然的話員工個人信息這張表上的部門field列中,就會存在很多的重複部門信息(部門的名稱等各種信息,它字節數多,佔的空間多,不如直接用ID來代表)
    • 此時員工的個人信息表中的這個部門field就是N:1中的多的關係,部門這張表的部門ID就是1的關係。
    • 因爲員工的個人信息表的部門field中的記錄都是來自於部門表中的部門(員工表部門field依賴於部門表ID),爲了避免出現錯誤的部門(比如員工表中部門filed中寫上了部門表中不存在的部門),要把員工表中的這一部門field設爲外鍵(FK:foreign key),並鏈接到部門表中的ID的這一field中,代表着部門field的記錄全部來自部門表的ID項,這樣就不會出現錯誤信息。
    • 要注意外鍵鏈接到的另外一張表的字段必須是主鍵字段(一張表只有一個)或者說是唯一字段(一張表可有多個),而不是隨便的字段就能被外鍵鏈接的。
    • 注意上面的員工個人信息表是總的所有員工的信息表,部門表也是總的所有部門的表

image

  1. n:n或者說多對多的關係:就比如大學選課,總的學生的個人信息表中選的課程一個學生可以選多個課程,而課程表中的一個課程也能被多個學生給選擇。
    • 此時即不能把學生表中每個學生選了幾門課就加幾個record把課程給記錄下來(這樣的話學生ID的主鍵重複了,主鍵的field就不能指定爲ID但也沒有其他更好的指定位置)
    • 也不能把課程的field中添加多個課程,(違反了field中的最小原子單元不可再分的定義,不符合第一範式,這樣就不是關係數據庫)
    • 更不能把總的課程表中每個課程添加多個學生(這樣和學生表中添加課程沒有區別了)
    • 因此,這種情況下要比多對1的情況再增加出來第三章表格,用這個表格來記錄。
    • 其中學生表中只記錄學生信息,不記錄課程的field;課程(班級)表中只記錄課程信息,不記錄學生field。而第三張表則吧學生ID和課程ID給相互對應起來即可,它的主鍵就是一個記錄序號的的ID編號,它的兩個field(學生ID和課程ID)則分別外鍵依賴於學生表和課程表的IDfield上即可。

image

  1. 數據庫的設計如果不完美,則會造成各種效率的低下。作爲運維人員則需要檢查數據庫的標準和效率(它倆一般成反比)來進行優化,甩鍋等操作。
  2. 第一範式中,每一列的屬性都必須不同,這就是不能有重複字段的要求,比如部門filed在一個表中只能有這一個colume,不能是部門1,部門2這種多個field;當然也不能在一個部門field中的record中,寫多於一個的記錄,這樣的話不符合原子不可再分性的要求。
    • 如果想要實現多個部門,可以再分出來第二張表專門存儲部門信息,然後利用外鍵的方式鏈接這兩張表即可。其中第二張表的外鍵就是員工的ID,主鍵是記錄的ID(和後面員工的ID及部門無關),每一行的record中就是記錄ID,員工ID和部門名字這種格式。
  3. 主鍵可以是多個列(字段)組合起來的複合字段,把這個複合字段當做主鍵。這種主鍵裏面的內容如果某些列相同但是隻要不全部相同,仍然被看做是不同的record.
    • 其中第二範式中的field屬性不完全依賴於主鍵,就有一種情況就是某個field其屬性只依賴於複合主鍵中的某一個field, 並不是依賴於整個複合主鍵(這樣就可以把這個屬性和它依賴的這一列分成另外一張表了)。
    • 同時第二範式要求屬性和主鍵(複合主鍵整體)有直接相關性。
  4. 滿足了第二範式之後,則第三範式要求一個數據庫表中不包含已在其它表中已包含的非主鍵的列(這樣就冗餘了)
    • 第三範式和第二範式的區別就是:第二範式只要求列和主鍵之間的直接關係,不要求列之間的關係。而第三範式不僅要求它,還要求各個列之間沒有任何關係。
  5. 數據庫的範式雖然規範了,減少了數據冗餘節約了數據庫空間,但是會降低數據庫的搜索查找效率。因此要根據實際情況來進行設計,第二三範式沒有硬性要求。

簡易數據規劃流程

  1. 第一階段:收集數據,得到字段
    • 收集必要且完整的數據項
    • 轉換成數據表的字段
  2. 第二階段:把字段分類,歸入表,建立表的關聯
    • 關聯:表和表間的關係
    • 分割數據表並建立關聯的優點
    • 節省空間
    • 減少輸入錯誤
    • 方便數據修改
  3. 第三階段:
    • 規範化數據庫

數據庫的正規化分析

數據庫規範化,又稱數據庫或資料庫的正規化、標準化,是數據庫設計中的一系列原理和技術,以減少數據庫中數據冗餘,增進數據的一致性。關係模型的發明者埃德加·科德最早提出這一概念,並於1970年代初定義了第一範式、第二
範式和第三範式的概念
RDMBS設計範式基礎概念:設計關係數據庫時,遵從不同的規範要求,設計出合理的關係型數據庫,不同的規範要求被稱爲不同範式,各種範式呈遞次規範,越高的範式數據庫冗餘越小
目前關係數據庫有六種範式:第一範式(1NF)、第二範式(2NF)、第三範式(3NF)、巴德斯科範式(BCNF)、第四範式(4NF)和第五範式(5NF,又稱完美範式)。滿足最低要求的範式是第一範式(1NF)。在第一範式的基礎上進一步滿足更多規範要求的稱爲第二範式(2NF),其餘範式以次類推。一般數據庫只需滿足第三範式(3NF)即可

範式

  1. 1NF:無重複的列,每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性,確保每一列的原子性。除去同類型的字段,就是無重複的列
    說明:第一範式(1NF)是對關係模式的基本要求,不滿足第一範式(1NF)的數據庫就不是關係數據庫
  2. 2NF:屬性完全依賴於主鍵,第二範式必須先滿足第一範式,要求表中的每個行必須可以被唯一地區分。通常爲表加上一個列,以存儲各個實例的唯一標識PK,非PK的字段需要與整個PK有直接相關性
  3. 3NF:屬性不依賴於其它非主屬性,滿足第三範式必須先滿足第二範式。第三範式要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息,非PK的字段間不能有從屬關係

SQL概念

  • SQL: Structure Query Language
    結構化查詢語言
    SQL解釋器:
    數據存儲協議:應用層協議,C/S
    S:server, 監聽於套接字,接收並處理客戶端的應用請求:3306端口
    C:Client
  • 客戶端程序接口
    CLI :命令行的MySQL軟件接口
    GUI :還有圖形化的軟件接口
  • 應用編程接口
    ODBC:Open Database Connectivity
    JDBC:Java Data Base Connectivity

基本概念

  • 約束:constraint,表中的數據要遵守的限制
    1. 主鍵:一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行;必須提供數據,即NOT NULL,一個表只能有一個
    2. 惟一鍵:一個或多個字段的組合,填入的數據必須能在本表中唯一標識本行;允許爲NULL,一個表可以存在多個
    3. 外鍵:一個表中的某字段可填入的數據取決於另一個表的主鍵或唯一鍵已有的數據
    4. 檢查:字段值在一定範圍內
  • 索引:將表中的一個或多個字段中的數據複製一份另存,並且按特定次序排序存儲
  • 關係運算:
    1. 選擇:挑選出符合條件的行
    2. 投影:挑選出需要的字段
    3. 連接:表間字段的關聯

數據模型

  • 數據抽象:
    物理層:數據存儲格式,即RDBMS在磁盤上如何組織文件
    邏輯層:DBA角度,描述存儲什麼數據,以及數據間存在什麼樣的關係
    視圖層:用戶角度,描述DB中的部分數據,比如用戶看到的網站界面抓取的各種信息
  • 關係模型的分類:
    關係模型
    基於對象的關係模型
    半結構化的關係模型:XML數據(目前不流行)

附加知識點: /etc/gconf/gconf.xml.gefaults中大部分都是xml文件(圖形界面的xml文件)
其中有個%gconf-tree.xml文件,裏面的文件代碼格式就是xml格式。
在Cenots6中這個文件中的disable_user_list一行,這裏的它下面的type 中的value改爲true,則centos6登陸的時候只能手動輸入用戶名而不會顯示用戶名的列表可以鼠標點選了。

image

MySQL系列

MYSQL的特性

插件式存儲引擎:也稱爲“表類型”,存儲管理器有多種實現版本,功能和特性可能均略有差別;用戶可根據需要靈活選擇,Mysql5.5.5開始innoDB引擎是MYSQL默認引擎
MyISAM ==> Aria
InnoDB ==> XtraDB
單進程,多線程
諸多擴展和新特性
提供了較多測試組件
開源

mariadb的簡單使用

MariaDB程序

  • 客戶端程序:
    mysql: 交互式的CLI工具
    mysqldump:備份工具,基於mysql協議向mysqld發起查詢請求,並將查得的所有數據轉換成insert等寫操作語句保存文本文件中
    mysqladmin:基於mysql協議管理mysqld
    mysqlimport:數據導入工具
  • MyISAM存儲引擎的管理工具:
    myisamchk:檢查MyISAM庫
    myisampack:打包MyISAM表,只讀
  • 服務器端程序
    mysqld_safe
    mysqld
    mysqld_multi 多實例
    示例:mysqld_multi --example

用戶賬號

  • mysql用戶賬號由兩部分組成:
    'USERNAME'@'HOST'
  • 說明:
    HOST限制此用戶可通過哪些遠程主機連接mysql服務器,它支持使用通配符:
    % 匹配任意長度的任意字符 (通配符中的*)
    172.16.0.0/255.255.0.0 或 172.16.%.%
    _ 匹配任意單個字符 (通配符中的?, 正則表達式中的.)

Mysql 客戶端

mysql使用模式:

  1. 交互式模式:
    可運行命令有兩類:
    客戶端命令:
    \h, help
    \u,use
    \s,status
    \!,system
    服務器端命令:
    SQL語句, 需要語句結束符冒號;
  2. 腳本模式(重定向):
    mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
    mysql> source /path/from/somefile.sql
  • mysql客戶端可用選項:
    -A, --no-auto-rehash 禁止補全
    -u, --user= 用戶名,默認爲root
    -h, --host= 服務器主機,默認爲localhost
    -p, --passowrd= 用戶密碼,建議使用-p,默認爲空密碼
    -P, --port= 服務器端口
    -S, --socket= 指定連接socket文件路徑,前提是不能跨網絡連接
    -D, --database= 指定默認數據庫,可以不寫-D
    -C, --compress 啓用壓縮
    -e “SQL“ 執行SQL命令
    -V, --version 顯示版本
    -v --verbose 顯示詳細信息
    --print-defaults 獲取程序默認使用的配置

socket地址

服務器監聽的兩種socket地址:
ip socket: 監聽在tcp的3306端口,支持遠程通信
unix sock: 監聽在sock文件上,僅支持本機通信
如:/var/lib/mysql/mysql.sock)
說明:host爲localhost,127.0.0.1時自動使用unix sock

執行命令

  • 運行mysql命令:默認空密碼登錄
    mysql>use mysql 用mysql數據庫
    mysql>select user(); 查看當前用戶
    mysql>select version(); 查看當前版本
    mysql>SELECT User,Host,Password FROM user;
  • 登錄系統:mysql –uroot –p
  • 客戶端命令:本地執行
    mysql> help
    每個命令都完×××式和簡寫格式
    mysql> status 或 \s
  • 服務端命令:通過mysql協議發往服務器執行並取回結果
    每個命令末尾都必須使用命令結束符號,默認爲分號
    示例:SELECT VERSION();

注意點2(客戶端):

  1. mysql登陸時的用戶賬號比較特殊,直接就是 “用戶名@主機” 的方式,登陸之前需要建立好用戶(注意這個用戶是在mysql的服務器上建好的,而不是客戶端上),這種登錄方式可以限定哪些用戶必須在哪些些主機上才能夠登陸,在登陸的時候就已經開始有安全策略了。
  2. 注意mysql的默認自帶的登錄賬號也有個root名字的,它的權限也是mysql的數據庫管理員權限。但是它是管理mysql的用戶賬號名,而並非是linux的系統管理員root,注意它倆區分。
    • 這個軟件用於登陸管理的用戶被稱爲是它的虛擬用戶
    • 附加知識點:比如數據庫sqlserver 有個 自帶管理員 sa ,就相當於mysql 的root .但是sa有個漏洞就是用它登陸數據庫之後順便也擁有了系統的管理員權限,而mysql的root登陸之後也不會獲取系統的管理員權限,仍然是登陸數據庫之前linux系統中正在登錄使用的賬號的權限(當然登陸之前就是root那就不用多說了)。
  3. 新裝mysql安全風險很大,不論是哪個用戶登錄着本機(root,zhang,duan..),都可以直接執行mysql [-h127.0.0.1] [-uroot] [-p] 登陸數據庫(因爲不需要輸入後面的主機,用戶,密碼,中括號裏的都是默認的選項,以後也可以省略)。
  4. 注意進入數據庫之後執行分成兩類命令,用\h查看到的命令都是客戶端命令可以直接執行,而其他的服務器端命令必須後面加上分號; 才能執行。
  5. mysql的默認提示符中間顯示的是當前正在使用的數據庫的名稱(mysql可以裝多個數據庫,不僅僅一個。默認帶有幾個,其中的test數據庫測試使用,沒有用可以刪除),其中有個mysql數據庫,裏面裝着關於mysql自身的各種信息(meta元數據,包括mysql的用戶賬戶等)
  6. 一個數據庫可看作是一個文件夾,而實際上它本身的確就是一個文件夾,這些數據庫就存放在/var/lib/mysql下(詳細看下面的代碼中),而其中的mysql數據庫中的文件,每三個同名不同後綴的文件就代表一個表
    • 在這裏有個user名字開頭的三個文件就存放着mysql的登陸用戶名和主機表。
    • 可以進入數據庫之後用 show tables ; desc user ; select user,host,password from user; 一步一步查看到表中的用戶信息。
  7. 由6中結果可見默認安裝後只能在本機(遠程也可以登錄,直接在其他主機上mysql -h本機IP即可,也可以其他主機先SSH連接到本機,然後mysql即可)且用root這個mysql自帶的虛擬用戶身份(也可以匿名任意用戶)連接mysql數據庫。
    用戶爲空的項代表匿名用戶,它表示任何用戶名(隨便輸入)都可以登錄這個數據庫,比如說 mysql -u abc (-u 和 後面的名字之間可以有空格也可以不加空格,不過其他的命令比如-p不能加空格) 命令也可以登錄(但是空用戶不能登陸 必須得輸入字符纔可以)。
    但是此時再次執行show databases時看到的數據庫信息不如root登陸時看到的多(少了mysql和 performance_schema),雖然能夠匿名登陸,但是權限是普通用戶,不是root的管理員的權限。
  8. 接3中所寫,因此新裝數據庫最好先執行安全防護的專用腳本,(刪除匿名賬戶,加上密碼,刪除test數據庫,刪除遠程登錄),注意這裏的遠程登錄指的是不用ssh而是直接用客戶端命令mysql 指定-h 本機IP 的方式登錄數據庫。
    這個腳本位置在/usr/bin/mysql_secure_installation,直接運行即可,如果剛開始沒有密碼則舊密碼這一項直接回車即可(file它可見它就是一個shell腳本,yum或者二進制的話它也寫好了路徑,直接運行即可。注意它和數據庫database生成的命令的區別,後者需要制定數據庫生成的目標的dir位置)
  9. system 或者\! 是按照登陸數據庫之前的linux中的賬戶的權限來執行登陸前shell中的命令的,不會因爲用root登陸了數據庫而獲得了登陸前的linux中的root權限。(不過微軟的 sqlserver 的sa賬戶就可以這樣,不論在windows中用什麼用戶登陸這個sa,則都能在sqlserver中用sa 獲得windows中的管理員權限,在數據庫內操作windows,變相的提升了權限)
  10. 非交互式方式(文件重定向)貌似可以不用寫;符號,不過建議還是按照標準格式來,一行一個命令,同時數據庫的操作加上;
    • 還可以登錄到數據庫之後再用 'source 文件' 的方式來執行文件中所寫的命令
    • 非交互式還可以直接命令中 mysql -e 'CMD' 來執行CMD的操作,其中不管是客戶端還是服務器命令就要用;分隔開兩個命令。
  11. -S指定socket文件時不能跨網絡連接,只能本地。
    --print-defaults 命令可以查看當前已經使用的客戶端配置,比如下面12中的配置如果寫入客戶端配置文件中之後,則在當前shell中執行mysql --print-defaults 就可以看到配置文件中的信息了。
  12. 客戶端命令中有prompt命令可以修改提示符(登錄數據庫之後promt後面直接加格式即可),當然這樣寫下次登錄會丟失配置,最好寫在客戶端配置文件中/etc/my.cnf.d/mysql-clients.cnf 的[mysql]欄下會永久保存。
    • prompt="Date:\\D Count:\\c \\n\\U[\\d] > "
    • 注意在配置文件中寫的要用上兩個反斜線,修改完之後直接就能生效(因爲是客戶端軟件並不是服務,類似的直接生效的還有ssh的客戶端配置等),具體的格式信息和說明可以查看man mysql
  13. mysqladmin 可以進行多種操作 --help查詢
    • 注意在有密碼的情況下必須要輸入數據庫的用戶名和密碼纔可以進行mysqladmin的命令,一些例子寫在下面
Administration program for the mysqld daemon.
Usage: mysqladmin [OPTIONS] command command....

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf ~/.my.cnf 

可看到配置文件順序,這些文件不僅包括服務器端還包括客戶端

mysqladmin password centos :修改密碼爲centos(如果沒有舊密碼)
mysqladmin -uroot -pOLDPSW passwpord centos :修改舊密碼爲centos
mysqladmin -uroot -pPSW ping|status|version :查看各種狀態
mysqladmin -uroot -pPSW shutdown :可關閉數據庫

下面爲一些操作示例:

============================================剛裝之後查看版本和已有用戶,注意加分號:

MariaDB [(none)]> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.000 sec)

MariaDB [(none)]> select version();
+-----------------+
| version()       |
+-----------------+
| 10.3.14-MariaDB |
+-----------------+
1 row in set (0.000 sec)

MariaDB [(none)]> 

=====================================================剛裝之後登陸查看狀態
MariaDB [(none)]> status
--------------
mysql  Ver 15.1 Distrib 10.3.14-MariaDB, for Linux (x86_64) using readline 5.1

Connection id:      11
Current database:                  :當前正在使用的數據庫,可見當前爲空
Current user:       root@localhost
SSL:            Not in use
Current pager:      stdout
Using outfile:      ''
Using delimiter:    ;
Server:         MariaDB
Server version:     10.3.14-MariaDB MariaDB Server
Protocol version:   10
Connection:     Localhost via UNIX socket
Server characterset:    latin1
Db     characterset:    latin1
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /var/lib/mysql/mysql.sock   :表示通過本機的socket套接字連接的本機的mysql,因爲不走網絡,因此不需要端口號。這個套接字文件就顯示在這裏。
Uptime:         26 min 29 sec

:線程
Threads: 7  Questions: 10  Slow queries: 0  Opens: 17  Flush tables: 1  Open tables: 11  Queries per second avg: 0.006
--------------

========================================================剛裝之後查看數據庫,注意加分號:
MariaDB [(none)]> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |  : 此數據庫是在內存中的,動態數據庫,其他3個默認自帶數據庫都在/var/lib/mysql下
| mysql              |  :
| performance_schema |  :
| test               |  :
+--------------------+
4 rows in set (0.002 sec)

MariaDB [(none)]> Ctrl-C -- exit!

===============================================切換數據庫:
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [mysql]> 

======================================================/var/lib/mysql/mysql 中文件:

21:49[root@centos7 /var/lib/mysql/mysql]# ls
columns_priv.frm  general_log.CSM     help_topic.MYD          proc.frm           slow_log.CSM               time_zone_name.frm
columns_priv.MYD  general_log.CSV     help_topic.MYI          proc.MYD           slow_log.CSV               time_zone_name.MYD
columns_priv.MYI  general_log.frm     host.frm                proc.MYI           slow_log.frm               time_zone_name.MYI
column_stats.frm  gtid_slave_pos.frm  host.MYD                procs_priv.frm     tables_priv.frm            time_zone_transition.frm
column_stats.MYD  gtid_slave_pos.ibd  host.MYI                procs_priv.MYD     tables_priv.MYD            time_zone_transition.MYD
column_stats.MYI  help_category.frm   index_stats.frm         procs_priv.MYI     tables_priv.MYI            time_zone_transition.MYI
db.frm            help_category.MYD   index_stats.MYD         proxies_priv.frm   table_stats.frm            time_zone_transition_type.frm
db.MYD            help_category.MYI   index_stats.MYI         proxies_priv.MYD   table_stats.MYD            time_zone_transition_type.MYD
db.MYI            help_keyword.frm    innodb_index_stats.frm  proxies_priv.MYI   table_stats.MYI            time_zone_transition_type.MYI
event.frm         help_keyword.MYD    innodb_index_stats.ibd  roles_mapping.frm  time_zone.frm              transaction_registry.frm
event.MYD         help_keyword.MYI    innodb_table_stats.frm  roles_mapping.MYD  time_zone_leap_second.frm  transaction_registry.ibd
event.MYI         help_relation.frm   innodb_table_stats.ibd  roles_mapping.MYI  time_zone_leap_second.MYD  user.frm
func.frm          help_relation.MYD   plugin.frm              servers.frm        time_zone_leap_second.MYI  user.MYD
func.MYD          help_relation.MYI   plugin.MYD              servers.MYD        time_zone.MYD              user.MYI
func.MYI          help_topic.frm      plugin.MYI              servers.MYI        time_zone.MYI

=============================================================進入數據庫中查看數據庫中的表(數據)命令,注意加分號:

MariaDB [mysql]> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| column_stats              |
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| gtid_slave_pos            |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| index_stats               |
| innodb_index_stats        |
| innodb_table_stats        |
| plugin                    |
| proc                      |
| procs_priv                |
| proxies_priv              |
| roles_mapping             |
| servers                   |
| slow_log                  |
| table_stats               |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| transaction_registry      |
| user                      |
+---------------------------+
31 rows in set (0.001 sec)

=========================================================查看user中的字段(field),注意加分號:

MariaDB [mysql]> desc user ;
+------------------------+-----------------------------------+------+-----+----------+-------+
| Field                  | Type                              | Null | Key | Default  | Extra |
+------------------------+-----------------------------------+------+-----+----------+-------+
| Host                   | char(60)                          | NO   | PRI |          |       |
| User                   | char(80)                          | NO   | PRI |          |       |
| Password               | char(41)                          | NO   |     |          |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N        |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N        |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N        |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N        |       |
| File_priv              | enum('N','Y')                     | NO   |     | N        |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N        |       |
| References_priv        | enum('N','Y')                     | NO   |     | N        |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N        |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N        |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N        |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N        |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N        |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N        |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N        |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N        |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N        |       |
| Delete_history_priv    | enum('N','Y')                     | NO   |     | N        |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |          |       |
| ssl_cipher             | blob                              | NO   |     | NULL     |       |
| x509_issuer            | blob                              | NO   |     | NULL     |       |
| x509_subject           | blob                              | NO   |     | NULL     |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0        |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0        |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0        |       |
| max_user_connections   | int(11)                           | NO   |     | 0        |       |
| plugin                 | char(64)                          | NO   |     |          |       |
| authentication_string  | text                              | NO   |     | NULL     |       |
| password_expired       | enum('N','Y')                     | NO   |     | N        |       |
| is_role                | enum('N','Y')                     | NO   |     | N        |       |
| default_role           | char(80)                          | NO   |     |          |       |
| max_statement_time     | decimal(12,6)                     | NO   |     | 0.000000 |       |
+------------------------+-----------------------------------+------+-----+----------+-------+
47 rows in set (0.002 sec)

================================================================從這個user表中field(字段)中挑出特定的字段來查看裏面的內容,注意加分號:
由6中結果可見默認安裝後只能在本機(遠程不行)且用root虛擬用戶身份(也可以匿名任意用戶)連接mysql數據庫。
用戶爲空的項代表匿名用戶,它表示任何用戶名(隨便輸入)都可以登錄這個數據庫,比如說 mysql -u abc 命令也可以登錄(但是空用戶不能登陸 必須得輸入字符纔可以)

MariaDB [mysql]> select user,host,password from user;
+------+---------------+----------+
| user | host          | password |
+------+---------------+----------+
| root | localhost     |          |  :指的是本機網段127開頭
| root | centos7.6test |          |  :指的是本機IP 192.168.36.102(或者其他網卡上的IP)
| root | 127.0.0.1     |          |  
| root | ::1           |          |  :IPV6上本機IP
|      | localhost     |          |  :匿名用戶
|      | centos7.6test |          |  :匿名用戶
+------+---------------+----------+
6 rows in set (0.001 sec)

========================================默認安裝後匿名用戶直接登陸,以及用它查看數據庫信息(權限不如root大,看到的信息不如root多):

22:07[root@centos7 /var/lib/mysql]# mysql -u abc
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 17
Server version: 10.3.14-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select user() ;
+---------------+
| user()        |
+---------------+
| abc@localhost |
+---------------+
1 row in set (0.000 sec)

MariaDB [(none)]> show databases ;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
2 rows in set (0.001 sec)

==========================================執行安全加固安裝腳本之後:

MariaDB [mysql]> select user,host,password from user 
    -> ;
+------+-----------+-------------------------------------------+
| user | host      | password                                  |
+------+-----------+-------------------------------------------+
| root | localhost | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | 127.0.0.1 | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
| root | ::1       | *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9 |
+------+-----------+-------------------------------------------+
3 rows in set (0.001 sec)

======================================查看寫入配置文件中的設定:
11:38[root@centos7 ~]# mysql --print-defaults
mysql would have been started with the following arguments:
--prompt=Date:\D Count:\c \n\U[\d] >  

socket地址

服務器監聽的兩種socket地址:
ip socket: 監聽在tcp的3306端口,支持遠程通信
unix sock: 監聽在sock文件上,僅支持本機通信
如:/var/lib/mysql/mysql.sock)
說明:host爲localhost,127.0.0.1時自動使用unix sock

服務器端配置

服務器端(mysqld):工作特性有多種配置方式

  1. 命令行選項:
  2. 配置文件:類ini格式
    集中式的配置,能夠爲mysql的各應用程序提供配置信息
    [mysqld]
    [mysqld_safe]
    [mysqld_multi]
    [mysql]
    [mysqldump]
    [server]
    [client]
    格式:parameter = value
    說明:_和- 相同
    1,ON,TRUE意義相同, 0,OFF,FALSE意義相同

配置文件

配置文件:
後面覆蓋前面的配置文件,順序如下:

  1. /etc/my.cnf Global選項(注意它包含了/etc/my.cnf.d/下的文件) : 可參考它修改實例中的配置文件
  2. /etc/mysql/my.cnf Global選項
  3. SYSCONFDIR/my.cnf Global選項
  4. $MYSQL_HOME/my.cnf Server-specific 選項
  5. --defaults-extra-file=path
  6. ~/.my.cnf User-specific 選項
  • 從上到下優先級越來越高(後面覆蓋前面的文件)

Mariadb簡單配置

  • 偵聽3306/tcp端口可以在綁定有一個或全部接口IP上
    vim /etc/my.cnf
    [mysqld]
    skip-networking=1
    關閉網絡連接,只偵聽本地客戶端, 所有和服務器的交互都通過一個socket實現,socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改MairaDB配置
  • 注意修改完之後要重啓服務

注意點3(服務器端):

  1. SOCKET如果監聽的端口3306被關閉則可以阻止遠程的直接連接(但可以先用SSH連接上去再連接數據庫,變相的利用了本地的鏈接方式。)
    • 注意當使用mysql客戶端連接服務器時,host爲localhost,127.0.0.1時自動使用unix sock(本地socket文件),默認不寫@host的時候走的就是localhost因此也就是用的unix socket連接的。可以用status命令查看。
  2. mysqld服務是以mysql的用戶來執行的,而這個用戶如果用yum安裝的方式會自動生成,是一個系統用戶且家目錄就在/var/lib/mysql,這也就是數據庫存放的位置。
    • 利用rpm -q --scripts MariaDB-server(client) 可以看到創建用戶的過程命令和修改文件權限如下:
12:28[root@centos7 ~]# ps aux | grep mysql
root        403  0.0  0.0 112708   976 pts/2    S+   12:29   0:00 grep --color=auto mysql
mysql     66126  0.0  3.7 1768932 70740 ?       Ssl  Apr28   0:42 /usr/sbin/mysqld
root     125855  0.0  0.1 119868  2552 pts/0    S+   11:08   0:00 man mysql
12:29[root@centos7 ~]# getent passwd mysql
mysql:x:988:982:MySQL server:/var/lib/mysql:/sbin/nologin
12:30[root@centos7 ~]# 

創建用戶preinstallscript中的創建mysql系統用戶以及修改數據庫文件的權限命令:

 # Create a MySQL user and group. Do not report any problems if it already
  # exists.
  groupadd -r mysql 2> /dev/null || true
  useradd -M -r --home $datadir --shell /sbin/nologin --comment "MySQL server" --gid mysql mysql 2> /dev/null || true 
  # The user may already exist, make sure it has the proper group nevertheless (BUG#12823)
  usermod --gid mysql mysql 2> /dev/null || true

  # Change permissions so that the user that will run the MySQL daemon
  # owns all database files.
  chown -R mysql:mysql $datadir

  if [ ! -e $datadir/mysql ]; then
    # Create data directory
    mkdir -p $datadir/{mysql,test}

    # Initiate databases
    /usr/bin/mysql_install_db --rpm --user=mysql
  fi

  # Change permissions again to fix any new files.
  chown -R mysql:mysql $datadir

  # Fix permissions for the permission database so that only the user
  # can read them.
  chmod -R og-rw $datadir/mysql
fi

安裝MYSQL

Mariadb安裝方式:

  1. 源代碼:編譯安裝
  2. 二進制格式的程序包:展開至特定路徑,並經過簡單配置後即可使用(最多最好的方式)
  3. 程序包管理器管理的程序包

CentOS 安裝光盤:可安裝但是版本太老
項目官方:https://downloads.mariadb.org/mariadb/repositories/
國內鏡像:https://mirrors.tuna.tsinghua.edu.cn/mariadb/yum/
https://mirrors.tuna.tsinghua.edu.cn/mysql/yum/

通用二進制格式安裝過程

  1. 準備用戶(可參考yum包中的官方寫的命令,要注意先確認mysql用戶是否存在,),這裏可以直接創建用戶不創建組也可(組會自動創建了一併)
    groupadd -r [-g 306] mysql :要確保這個ID沒人用,下同
    useradd -r -g mysql[|306] [-u 306] –d /data/mysql -s /sbin/nologin mysql
  2. 準備數據庫的目錄,建議使用邏輯卷(同樣可參考官方)
    mkdir /data/mysql
    chown -R mysql:mysql /data/mysql
  3. 準備二進制程序
    tar xf mariadb-VERSION-linux-x86_64.tar.gz -C /usr/local
    cd /usr/local
    ln -sv mariadb-VERSION mysql
    chown -R root:mysql /usr/local/mysql/ :注意它和上面數據庫的所屬的區別
  4. 準備配置文件
    mkdir /etc/mysql/
    cp support-files/my-huge.cnf /etc/mysql/my.cnf
    • [mysqld]中添加三個選項:
      datadir = /data/mysql
      innodb_file_per_table = on
      skip_name_resolve = on :禁止主機名解析,建議使用
  5. 創建數據庫文件:注意一定要在mysql文件夾中執行,不能進入script中,同時要指定用戶(保證屬主屬組)和目錄
    cd /usr/local/mysql/
    ./scripts/mysql_install_db --datadir=/data/mysql --user=mysql
    chown -R mysql:mysql /data/mysql
  6. 準備服務腳本,並啓動服務,(改名)
    cp ./support-files/mysql.server /etc/rc.d/init.d/mysqld
    chkconfig --add mysqld
    service mysqld start
  7. PATH路徑(這個是爲了客戶端以及服務器的各種腳本執行用,別忘了)
    echo ‘PATH=/user/local/mysql/bin:$PATH’ > /etc/profile.d/mysql
  8. 安全初始化
    /user/local/mysql/bin/mysql_secure_installation

源碼編譯安裝mariadb

  1. 安裝包
    yum install bison bison-devel zlib-devel libcurl-devel libarchive-devel boostdevel gcc gcc-c++ cmake ncurses-devel gnutls-devel libxml2-devel openssl devel libevent-devel libaio-devel
  2. 做準備用戶和數據目錄以及存放mysql主體的目錄
    useradd –r –s /sbin/nologin –d /data/mysql/ mysql :直接生成用戶的同時相對應的組也生成了
    mkdir /data/mysql -p
    chown mysql.mysql /data/mysql
    mkdir /app/mysql/ -p
    mkdir /etc/mysql -p
    tar xvf mariadb-10.2.18.tar.gz
  3. cmake 編譯安裝
    cmake的重要特性之一是其獨立於源碼(out-of-source)的編譯功能,即編譯工作可以在另一個指定的目錄中而非源碼目錄中進行,這可以保證源碼目錄不受任何一次編譯的影響,因此在同一個源碼樹上可以進行多次不同的編譯,如針對於不同平臺編譯
    編譯選項:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html

提前做好前兩步操作,然後

cd mariadb-10.2.18/
cmake . \
-DCMAKE_INSTALL_PREFIX=/app/mysql \
-DMYSQL_DATADIR=/data/mysql/ \
-DSYSCONFDIR=/etc/mysql \
-DMYSQL_USER=mysql \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITHOUT_MROONGA_STORAGE_ENGINE=1 \
-DWITH_DEBUG=0 \
-DWITH_READLINE=1 \
-DWITH_SSL=system \
-DWITH_ZLIB=system \
-DWITH_LIBWRAP=0 \
-DENABLED_LOCAL_INFILE=1 \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci

然後make && make install
提示:如果出錯,執行rm -f CMakeCache.txt

  1. 準備環境變量
    echo 'PATH=/app/mysql/bin:$PATH' > /etc/profile.d/mysql.sh
    source /etc/profile.d/mysql.sh
  2. 生成數據庫文件
    cd /app/mysql/
    scripts/mysql_install_db --datadir=/data/mysql/ --user=mysql
  3. 準備配置文件
    cp /app/mysql/support-files/my-huge.cnf /etc/mysql/my.cnf (在mysqld添加datadir一項)
  4. 準備啓動腳本
    cp /app/mysql/support-files/mysql.server /etc/init.d/mysqld
  5. 啓動服務
    chkconfig --add mysqld ;service mysqld start
  6. 安全初始化
    /app/mysql/bin/mysql_secure_installation

注意點4(安裝):

  1. rpm光盤安裝mysql版本太老,可以用yum安裝,不過缺點就是不能控制安裝的路徑(數據庫的文件夾位置);注意選擇amd-64架構,因爲早期64位就是amd率先提出的。官網也可以直接拷貝它的倉庫配置工具中的代碼來yum安裝,不過是在國外網速可能慢,還是手工寫國內的比較好:yum install mariadb-server
  2. rpm -ql MariaDB-server 查看文件
  3. yum中和自定義的mysql包各種路徑的區別(就相當於把yum中的/usr系統目錄 和二進制中的/usr/local/mysql 生成的目錄 作爲同一個級別來看待,同時yum安裝的分散到系統中各個文件夾下,而二級制和源碼安裝的數據庫主體集中在一個目錄中了,這個目錄自己指定即可)
    • 注意二進制安裝(它相當於編譯之後的直接能運行的可執行腳本,類似於windos中的綠色免安裝,已經定義好了路徑)必須放在這個/usr/local/mysql下
    • 執行命令的時候直接解壓tar -C /usr/local 。 注意tar命令中不需要帶mysql目錄。
    • 執行完之後最好是用軟連接的方式創建一個mysql文件指向這個解壓後的文件夾(因爲解壓後的文件夾帶有版本號等,必須要更名爲mysql纔可以,用軟連接的方式就可以下次再裝其他的目錄或者更新版本之後直接更改軟鏈接的指向即可)
  4. 二進制安裝默認沒有執行用戶,因此要創建用戶,參考上面所寫。
    • 同時注意二進制安裝後的/usr/local/mysql文件夾的所屬主和所屬組都應該是root(參考yum安裝的屬性),因爲這裏面的都是mysql這個服務本身(包括客戶端服務器端),都是需要執行啓動的服務,並非是用於操作數據庫的mysql用戶
    • 而數據庫的文件夾/data/mysql的屬主屬組纔是mysql,注意它倆之前的區分,別混淆
  5. 特別注意:注意centos6和7都自帶/etc/my.cnf文件,不論裝沒裝mysqlf服務都帶的有。而在二進制安裝中這個文件不符合要求,因此不能用它。
    • 但是根據前面的分析可知,/etc/mysql/my.cnf的優先級它要高,因此我們可以創建這個文件(利用二進制自帶的模板文件並拷貝過去稍加修改即可,參考上面步驟中所寫)
    • 默認自帶的/etc/my.conf文件如下(目前經過測試得知,如果yum安裝之後再undo 它,這個文件會被清空掉,可能是mariadb本身會把它清空,也有可能不純淨的原因):
===============================================centos7:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

#
# include all files from the config directory
#
!includedir /etc/my.cnf.d

===============================================centos6:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
  1. 注意添加啓動服務腳本的時候的mysql可執行腳本文件需要執行權限同時所屬主所屬組都是root,基本上只需要拷貝更名爲mysqld(也可以其他名字)不需要其他操作。
  2. 注意用戶mysql的家目錄裏面不要添加其他的文件(創建的時候不能創建家目錄內的隱藏文件)不然的話數據庫會把這裏面的文件夾給當作一個數據庫從而產生問題。
  3. 源碼編譯安裝的時候利用cmake,其中前三行分別代表1.masql腳本和主體目錄,2.數據庫database目錄,和3.配置文件目錄,最後兩行代表默認字符集。
    • 因爲在這裏用源碼編譯安裝的,所以文件位置都可以自己定義位置(不過配置文件最好還是按照系統自定義的順序來放置文件目錄,建議/etc/mysql目錄下的my.cof)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章