1. 程式人生 > >Linux —mysql資料庫(一)

Linux —mysql資料庫(一)

本章內容

  • 關係型資料庫基礎
  • 安裝MySQL
  • 管理資料庫和表
  • 使用者和許可權管理
  • 函式和儲存過程
  • MySQL架構
  • 儲存引擎
  • 伺服器選項,系統和狀態變數
  • 優化查詢和索引管理
  • 鎖和事務管理
  • 日誌管理 ###必須掌握
  • 備份還原 ###必須掌握
  • MySQL叢集

資料庫的發展史

  • 萌芽階段:檔案系統

使用磁碟檔案來儲存資料

  • 初級階段:第一代資料庫

出現了網狀模型、層次模型的資料庫

  • 中級階段:第二代資料庫

關係型資料庫和結構化查詢語言

  • 高階階段:新一代資料庫

“關係-物件”型資料庫

資料庫管理系統(DBMS)

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

DBMS採取S/C結構;DBMS為客戶端建立了與資料庫之間的連線,在DBMS中管理員可以對資料進行許可權的設定和資料庫資料的備份和安全的管理等。

DBMS與客戶端之間通過網路連線,客戶端需要訪問資料庫時會通過API

資料庫管理系統的基本功能

  • 資料定義 ###建立資料庫---->橫行、縱列 屬性等
  • 資料處理 ###增、刪、改、查
  • 資料安全 ###設定資料的讀寫執行、使用者訪問等
  • 資料備份 ###資料及時備份

資料庫系統的架構

  • 單機架構
  • 大型主機/終端架構
  • 主從式架構( C/S)
  • 分散式架構

關係型資料庫

  • 關係 :關係就是二維表。並滿足如下性質:表中的行、列次序並不重要
  • 行row:表中的每一行,又稱為一條記錄
  • 列column:表中的每一列,稱為屬性,欄位
  • 主鍵( Primary key):用於惟一確定一個記錄的欄位
  • 域domain:屬性的取值範圍,如,性別只能是‘男’和‘女’兩個值

students table

id                 name                sex                 phone

1                   zhang                m                    110 ###這就時一條記錄

1                   zhang                m                    110 ###重複的記錄,使用主鍵來解決

2                   wang                  f                     120

scores table

id          score

1              99

2              98

學員表和考試成績表中學員編號之間是有聯絡的。

關係資料庫

RDBMS:

  • MySQL: MySQL, MariaDB, Percona Server
  • PostgreSQL: 簡稱為pgsql, EnterpriseDB
  • Oracle
  • MSSQL
  • DB2

資料庫排名:

acid特性保證資料庫的安全和穩定

NoSQL : redis高效能 高併發

實體-聯絡模型E-R

  • 實體Entity:客觀存在並可以相互區分的客觀事物或抽象事件稱為實體
  • 屬性:實體所具有的特徵或性質
  • 聯絡:聯絡是資料之間的關聯集合,是客觀存在的應用語義鏈
  1. 實體內部的聯絡:指組成實體的各屬性之間的聯絡。如職工實體中,職工號和部門經理號之 間有一種關聯關係
  2. 實體之間的聯絡:指不同實體之間聯絡。 例: 學生選課實體和學生基本資訊實體之間
  3. 實體之間的聯絡用菱形框表示

聯絡的型別

  1. 一對一聯絡(1:1)
  2. 一對多聯絡(1:n)
  3. 多對多聯絡(m:n)

資料的操作:

  • 資料提取:在資料集合中提取感興趣的內容。 SELECT
  • 資料更新:變更資料庫中的資料。 INSERT、 DELETE、 UPDATE

資料的約束條件 :是一組完整性規則的集合

  • 實體(行)完整性 Entity integrity
  • 域(列)完整性 Domain Integrity
  • 參考完整性 Referential Integrity

students table ##主鍵表

primary key(主鍵)

id             name               sex            phone

1               zhang               m              110 ###這就時一條記錄

2                wang                f                120

scores table

id              score

foreign key(外來鍵)---->students.d

1                99

1                98 ###學員考試成一對多關係

一對多的關係使用主外來鍵。

sutdents 基本資訊 主鍵表

pk

id           name              sex

1               a                    f

2               b                   m

3               c                    f

class 課程資訊

id           classname

1              linux

2              go

3              python

students_classes

id 	student_id (fk--->students.id)	class id (fk-->class.id)
1		1							1	
2		1							2
3		2							2

正規化

1NF: 就是列的標題不能重複

無重複的列, 每一列都是不可分割的基本資料項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重複的屬性。

2NF:

屬性完全依賴於主鍵,第二正規化必須先滿足第一正規化,要求表中的每個行必須可以被唯一地區分。通常為表加上一個列,以儲存各個例項的唯一標識PK,非PK的欄位需要與整個PK有直接相關性

3NF:

屬性不依賴於其它非主屬性,滿足第三正規化必須先滿足第二正規化。第三正規化要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字資訊,非PK的欄位間不能有從屬關係

SQL概念

SQL: Structure Query Language

  • 結構化查詢語言
  • SQL直譯器:
  • 資料儲存協議:應用層協議, C/S

S: server, 監聽於套接字,接收並處理客戶端的應用請求

mysql資料庫埠3306 sqlserver 埠:1433 win遠端埠:3389

C: Client

客戶端程式介面

  • CLI
  • GUI

應用程式設計介面

  • ODBC: Open Database Connectivity 微軟開發的資料庫連線
  • JDBC: Java Data Base Connectivity JAVA連線介面

資料庫的約束

1、主鍵:一個或多個欄位的組合,填入的資料必須能在本表中唯一標識本行;必須提供資料,即NOT NULL,一個表只能有一個

2、惟一鍵:一個或多個欄位的組合,填入的資料必須能在本表中唯一標識本行;允許為NULL,一個表可以存在多個

3、外來鍵:一個表中的某欄位可填入的資料取決於另一個表的主鍵或唯一鍵已有的資料

4、檢查:欄位值在一定範圍內

索引

  • 將表中的一個或多個欄位中的資料複製一份另存,並且按特定次序排序儲存
  • 例子:就像書中的目錄,為資料的查詢建立標籤 更快的查詢資料庫中的資料
  • 缺點:不易修改;修改資料的時候;還需修改索引節點。增大磁碟使用率

關係運算 :

  • 選擇:挑選出符合條件的行 ##選擇表中符合條件的資料 如:大於80分的成績
  • 投影:挑選出需要的欄位
  • 連線:表間欄位的關聯

[[email protected] gconf.xml.defaults]# pwd

/etc/gconf/gconf.xml.defaults ###使用者登陸介面使用者名稱顯示修改名戶名修改處

/user_list 使用者列表

MySQL歷史

1979年: TcX公司 Monty Widenius, Unireg

1996年:釋出MySQL1.0, Solaris版本, Linux版本

1999年: MySQL AB公司,瑞典

2003年: MySQL 5.0版本,提供檢視、儲存過程等功能

2008年: Sun 收購

2009年: Oracle收購sun

2009年: Monty成立MariaDB

MySQL和MariaDB

官方網址:

官方網址:

版本演變:

  • MySQL: 5.1 --> 5.5 --> 5.6 --> 5.7 -->8.0
  • MariaDB: 5.5 -->10.0--> 10.1 --> 10.2 --> 10.3

centos6 mysql-server

[[email protected] ~]# yum info mysql-server
Available Packages
Name : mysql-server
Arch : x86_64
Version : 5.1.73

centos7 mariadb

[[email protected] ~]# yum info mariadb-server
Available Packages
Name        : mariadb-server
Arch        : x86_64
Epoch       : 1
Version     : 5.5.56

MYSQL的特性

1、外掛式儲存引擎:也稱為“表型別”,儲存管理器有多種實現版本,功能和特性可能均略有差別;使用者可根據需要靈活選擇,Mysql5.5.5開始innoDB引擎是

MYSQL預設引擎

  • MyISAM ==> Aria
  • InnoDB ==> XtraDB

2、單程序,多執行緒

3、諸多擴充套件和新特性

4、提供了較多測試元件

5、開源

安裝MYSQL

Mariadb安裝方式:

1、原始碼:編譯安裝

2、二進位制格式的程式包:展開至特定路徑,並經過簡單配置後即可使用

3、程式包管理器管理的程式包

CentOS安裝光碟

專案官方: https://downloads.mariadb.org/mariadb/repositories/

rpm包安裝Mysql

首先使用centos光碟系統安裝自帶的mariadb

環境:centos7

[[email protected] ~]# yum install mariadb-server

[[email protected] ~]# rpm -ql mariadb-server
/etc/my.cnf.d/server.cnf
/usr/lib/systemd/system/mariadb.service ###服務

客戶端配置檔案

[[email protected] ~]# rpm -ql mariadb
/etc/my.cnf.d/client.cnf							#客戶端配置檔案
/usr/bin/mysql								#客戶端工具

啟動服務

[[email protected] ~]# systemctl start mariadb.service
[[email protected] ~]# ss -ntlp					#埠號3306
LISTEN     0      50         *:3306                   *:*                   users:(("mysqld",pid=10686,fd=14))
[[email protected] ~]# ps aux						#程序
mysql    10525  0.0  0.0 113304  1604 ?        Ss   09:09   0:00 /bin/sh /us
mysql    10686  0.3  4.3 903336
[[email protected] ~]# getent passwd mysql		##mysql  系統使用者
mysql:x:27:27:MariaDB Server:/var/lib/mysql:/sbin/nologin
[[email protected] ~]# ls /var/lib/mysql -d -l			##檢視mysql使用者所有者所屬組資訊
drwxr-xr-x 5 mysql mysql 177 Sep 28 09:09 /var/lib/mysql
[[email protected] ~]# ls /var/lib/mysql  -l			同時也是mysql的資料庫存放路徑
mysql.sock	本地sql客戶端連線本地mysql伺服器通訊的橋樑
[[email protected] ~]# pstree -p mysql
mysqld_safe(10525)───mysqld(10686)─┬─{mysqld}(10690)
                                   ├─{mysqld}(10691)
                                   ├─{mysqld}(10692)
                                   ├─{mysqld}(10693)
                                   ├─{mysqld}(10694)
                                   ├─{mysqld}(10695)
                                   ├─{mysqld}(10696)
                                   ├─{mysqld}(10697)
                                   ├─{mysqld}(10698)
                                   ├─{mysqld}(10699)
                                   ├─{mysqld}(10700)
                                   ├─{mysqld}(10701)
                                   ├─{mysqld}(10702)
                                   ├─{mysqld}(10703)
                                   ├─{mysqld}(10704)
                                   ├─{mysqld}(10705)
                                   ├─{mysqld}(10713)
                                   └─{mysqld}(10714)

單程序 ------- 多執行緒

RPM包安裝MySQL

RPM包安裝

  • CentOS 7:安裝光碟直接提供
  • mariadb-server 伺服器包 rpm -ql mariadb-server
  • mariadb 客戶端 rpm -ql maridb
  • mariadb-libs 資料庫列表 rpm-ql mariadb-libs

CentOS 6

提高安全性

mysql_secure_installation ## sql 安全設定指令碼

  1. 設定資料庫管理員root口令
  2. 禁止root遠端登入
  3. 刪除anonymous使用者帳號
  4. 刪除test資料庫

centos7中 Mysql 初步的使用和簡單配置

執行mysql命令:預設空密碼登入

[[email protected] ~]# mysql				##本機客戶端連線資料庫
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> 
MariaDB [(none)]> select user();			##檢視當前登陸使用者
+----------------+
| user()         |
+----------------+
| [email protected] |
+----------------+
MariaDB [(none)]> show databases;		##檢視mysql剛安裝好時的資料庫
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
MariaDB [(none)]> select user,host,password from mysql.user;		
+------+-----------+----------+
| user | host      | password |
+------+-----------+----------+
| root | localhost |          |			
| root | centos7-4 |          |				
| root | 127.0.0.1 |          |
| root | ::1       |          |
|      | localhost |          |
|      | centos7-4 |          |
+------+-----------+----------+

檢視mysql資料庫中 user的這個表中的 使用者 、主機、和密碼資訊

[[email protected] ~]# mysql -uroot -p -h127.0.0.1 連線資料庫方法

預設情況下mysql資料庫登陸的安全限制許可權基本沒有設定;我們可以拿任何一個匿名使用者都可以登陸,這樣給資料庫帶來了很大的安全隱患,所以我們在安裝完資料後需要對資料庫預設的安全限制做相應的基礎配置。

例子: 我們現在使用非root使用者登陸mysql

mysql_secure_installation ## sql 安全設定指令碼

設定完之後在使用其它使用者登陸就會失敗

[[email protected] ~]# mysql -uroot -p
Enter password:
MariaDB [(none)]> select user,password,host from mysql.user;
+------+-------------------------------------------+-----------+
| user | password                                  | host      |
+------+-------------------------------------------+-----------+
| root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | localhost |
| root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | 127.0.0.1 |
| root | *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA | ::1       |
+------+-------------------------------------------+---------

mysql客戶端程式:

1、mysql: 互動式的CLI工具 ###mysql本身也是個客戶端工具

2、mysqldump:備份工具,基於mysql協議向mysqld發起查詢請求,並將查得的所有資料轉換成insert等寫操作語句儲存文字檔案中

3、mysqladmin:基於mysql協議管理mysqld

4、mysqlimport:資料匯入工具

musql的使用模式:

1、互動式模式:

  • [[email protected] ~]# mysql -uroot -p
  • Enter password:
  • MariaDB [(none)]> ###互動式模式

可執行命令有兩類

客戶端命令:MariaDB [(none)]> help ###輸入help顯示幫助工具列表

?         (\?) Synonym for `help'.
clear     (\c) Clear the current input statement.
connect   (\r) Reconnect to the server. Optional arguments are db and host.
delimiter (\d) Set statement delimiter.
edit      (\e) Edit command with $EDITOR.
ego       (\G) Send command to mysql server, display result vertically.
exit      (\q) Exit mysql. Same as quit.
go        (\g) Send command to mysql server.
help      (\h) Display this help.
nopager   (\n) Disable pager, print to stdout.
notee     (\t) Don't write into outfile.
pager     (\P) Set PAGER [to_pager]. Print the query results via PAGER.
print     (\p) Print current command.
prompt    (\R) Change your mysql prompt.
quit      (\q) Quit mysql.
rehash    (\#) Rebuild completion hash.
source    (\.) Execute an SQL script file. Takes a file name as an argument.
status    (\s) Get status information from the server.
system    (\!) Execute a system shell command.
tee       (\T) Set outfile [to_outfile]. Append everything into given outfile.
use       (\u) Use another database. Takes database name as argument.
charset   (\C) Switch to another charset. Might be needed for processing binlog with multi-byte charsets.
warnings  (\W) Show warnings after every statement.
nowarning (\w) Don't show warnings after every statement.

mysql客戶端工具使用例子:

MariaDB [(none)]> status   		等價於 \s
Server:                 MariaDB
Server version:         5.5.56-MariaDB MariaDB Server
Protocol version:       10
UNIX socket:            /var/lib/mysql/mysql.sock
MariaDB [(none)]> system ls	等價於 \!  ls
anaconda-ks.cfg  Documents  initial-setup-ks.cfg  Public
data.tar         Downloads  Music                 Templates
Desktop          file1      Pictures              Videos

資料庫修改提示符:

[[email protected] ~]# mysql -uroot -p
MariaDB [(none)]> show databases;
MariaDB [(none)]>use mysql
MariaDB [mysql]> use mysql;	##切換資料庫
Database changed
MariaDB [mysql]> 				##切換後提醒在mysql中

修改等提示符:

man mysql  /prompt
方法一:
[[email protected] ~]# vim /etc/profile.d/mysql.sh
export MYSQL_PS1="(\[email protected]\h \v ) [\d]> "
方法二:
MariaDB [(none)]> mysql --prompt="(\[email protected]\h) [\d]> "	登陸mysql資料庫後修改
方法三:
vim /etc/my.cnf.d/mysql-clients.cnf
 [mysql]
               prompt=" \\r:\\m:\\s> "

MyISAM儲存引擎的管理工具:

1、myisamchk:檢查MyISAM庫

2、myisampack:打包MyISAM表,只讀

伺服器端程式

1、mysqld_safe

2、mysqld ##預設使用mysqld

3、mysqld_multi:多例項 ,示例: mysqld_multi --example

*****所例項的意思是在一臺主機上開多個mysql程式**** 在測試伺服器中會使用 修改配置和埠等

使用者賬號

mysql使用者賬號由兩部分組成:

'USERNAME'@'HOST‘

_ 匹配任意單個字元 / 172.16.0.0/255.255.0.0 或 172.16.%.%

例子:[email protected]'192.168.161.%'	

伺服器端命令:

SQL, 需要語句結束符;

指令碼模式:

  • mysql –uUSERNAME -pPASSWORD < /path/somefile.sql
  • mysql> source /path/from/somefile.sql

例子:

vim test.sql
show databases;
select user,host,password from mysql.user;
[[email protected] ~]# mysql -uroot -p < test.sql
Enter password: 
Database
information_schema
mysql
performance_schema
test
user    host    password
root    localhost       *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
root    127.0.0.1       *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
root    ::1     *E74858DB86EBA20BC33D0AECAE8A8108C56B17FA
或者登陸mysql資料庫後:
MariaDB [(none)]> source test.sql  同樣也可以執行指令碼檔案	##指令碼的字尾不做要求
MariaDB [(none)]> \. test.sql  同樣也可以執行指令碼檔案

Mysql客戶端

mysql客戶端可用選項:
-A, --no-auto-rehash 禁止補全
-u, --user= 使用者名稱,預設為root
-h, --host= 伺服器主機,預設為localhost
-p, --passowrd= 使用者密碼,建議使用-p,預設為空密碼
-P, --port= 伺服器埠
-S, --socket= 指定連線socket檔案路徑
-D, --database= 指定預設資料庫
-C, --compress 啟用壓縮
-e “SQL“ 執行SQL命令
-V, --version 顯示版本
-v --verbose 顯示詳細資訊
--print-defaults 獲取程式預設使用的配置
mysql  埠:3306   oracle 埠:1521   sql server埠:1433    遠端桌面埠:3389 

例子:

[[email protected] ~]# mysql -uroot -p -D mysql
MariaDB [mysql]> 
[[email protected] ~]# mysql -uroot -pmysql -e "show databases"
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+

伺服器監聽的兩種socket地址:

ip socket: 監聽在tcp的3306埠,支援遠端通訊

unix sock: 監聽在sock檔案上, 僅支援本機通訊

如: /var/lib/mysql/mysql.sock)

說明: host為localhost,127.0.0.1連線時自動使用unix sock

MariaDB [(none)]> status

UNIX socket: /var/lib/mysql/mysql.sock

伺服器端配置

伺服器端(mysqld):工作特性有多種配置方式
命令列選項:
配置檔案: 類ini格式
集中式的配置,能夠為mysql的各應用程式提供配置資訊
[mysqld]
[mysqld_safe]
[mysqld_multi]
[mysql]
[mysqldump]
[server]
[client]
格式: parameter = value
說明: _和- 相同
1, ON, TRUE意義相同, 0, OFF, FALSE意義相同

配置檔案:

後面覆蓋前面的配置檔案,順序如下:
/etc/my.cnf 						Global選項  全域性
/etc/mysql/my.cnf 					Global選項  全域性
SYSCONFDIR/my.cnf 				Global選項  全域性	
$MYSQL_HOME/my.cnf 				Server-specific 選項
--defaults-extra-file=path
~/.my.cnf 							User-specific 選項
[[email protected] ~]# cat /etc/my.cnf

配置mariadb

偵聽3306/tcp埠可以在繫結有一個或全部介面IP上
vim /etc/my.cnf
[mysqld]
skip-networking=1
關閉網路連線,只偵聽本地客戶端, 所有和伺服器的互動都通過一個socket實現, socket的配置存放在/var/lib/mysql/mysql.sock) 可在/etc/my.cnf修改
[[email protected] ~]# vim /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
skip=networking=1
[[email protected] ~]# systemctl restart mariadb
 [[email protected] ~]# ss -ntl  
*******mysql 資料庫3306埠就會停用、只可以使用本地客戶端連線******