1. 程式人生 > >【MySQL系列】01.數據庫簡介與MySQL安裝

【MySQL系列】01.數據庫簡介與MySQL安裝

都在 批量導入數據 ces 網絡 file 升級版 key rep 監聽

去年就想寫MySQL的教程,但是由於學的不好就沒有誤導大家,今年就把學習中的經驗分享給大家,大家也可以加我的QQ群:運維架構師交流群 ~~~~群號:476794643~~~~,一起學習交流

01.數據庫簡介與MySQL安裝

01.1.什麽是數據庫?

數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫,每個數據庫都有一個或多個不同的API用於創建,訪問,管理,搜索和復制所保存的數據。我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢。所以,現在我們使用關系型數據庫管理系統(RDBMS)來存儲和管理的大數據量。所謂的關系型數據庫,是建立在關系模型基礎上的數據庫,借助於集合代數等數學概念和方法來處理數據庫中的數據。我們簡單形象的理解,比如我們人類這個大社會,我們的×××,戶口簿等等都和數據庫有關。

RDBMS即關系數據庫管理系統(Relational Database Management System)的特點:

  • 1.數據以表格的形式出現
  • 2.每行為各種記錄名稱
  • 3.每列為記錄名稱所對應的數據域
  • 4.許多的行和列組成一張表單
  • 5.若幹的表單組成database

產生發展

數據庫產生於60多年前,隨著信息技術和市場的發展,特別是二十世紀九十年代以後,數據管理不再僅僅是存儲和管理數據,而轉變成用戶所需要的各種數據管理的方式。數據庫有很多種類型,從最簡單的存儲有各種數據的表格到能夠進行海量數據存儲的大型數據庫系統都在各個方面得到了廣泛的應用

01.2.數據庫的分類

數據庫通常分為層次式數據庫

網絡式數據庫關系式數據庫三種。而不同的數據庫是按不同的數據結構來聯系和組織的。而在當今的互聯網中,最常見的數據庫模型主要是兩種,即關系型數據庫非關系型數據庫<NOSQL>

01.2.1.關系型數據庫介紹

  • 1)、關系型數據庫的由來

雖然網狀數據庫和層次數據庫已經很好的解決了數據的集中和共享問題,但是在數據庫獨立性和抽象級別上扔有很大欠缺。用戶在對這兩種數據庫進行存取時,仍然需要明確數據的存儲結構,指出存取路徑。而關系型數據庫就可以較好的解決這些問題。

  • 2)、關系型數據庫介紹

關系型數據庫模型是把復雜的數據結構歸結為簡單的二元關系(即二維表格形式)。在關系型數據庫中,對數據的操作幾乎全部建立在一個或多個關系表格上,通過對這些關聯的表格分類、合並、連接或選取等運算來實現數據庫的管理。關系型數據庫誕生40多年了,從理論產生發展到現實產品,例如:Oracle和MySQL,Oracle在數據庫領域上升到霸主地位,形成每年高達數百億美元的龐大產業市場。

  • 3)、關系型數據庫表格之間的關系舉例

學生信息,圖書信息

01.2.2.非關系型數據庫介紹

  • 1)、非關系型數據庫誕生背景

NoSQL,泛指非關系型的數據庫。隨著互聯網web2.0網站的興起,傳統的關系數據庫在應付web2.0網站,特別是超大規模和高並發的SNS類型的web2.0純動態網站已經顯得力不從心,暴露了很多難以克服的問題,而非關系型的數據庫則由於其本身的特點得到了非常迅速的發展。NoSQL數據庫在特定的場景下可以發揮出難以想象的高效率和高性能,它是作為對傳統關系型數據庫的一個有效的補充。NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關系型的數據存儲,相對於鋪天蓋地的關系型數據庫運用,這一概念無疑是一種全新的思維的註入。

  • 2)、非關系型數據庫種類

1)鍵值存儲數據庫(key-value)

鍵值數據庫就類似傳統語言中使用的哈希表。可以通過key來添加、查詢或者刪除數據庫,因為使用key主鍵訪問,所以會獲得很高的性能及擴展性。

鍵值數據庫主要使用一個哈希表,這個表中有一個特定的鍵和一個指針指向特定的數據。Key/value模型對於IT系統來說的優勢在於簡單、易部署、高並發。

典型產品:MemcachedRedisMemcacheDB

2)列存儲(Column-oriented)數據庫

列存儲數據庫將數據存儲在列族中,一個列族存儲經常被一起查詢的相關數據,比如人類,我們經常會查詢某個人的姓名和年齡,而不是薪資。這種情況下姓名和年齡會被放到一個列族中,薪資會被放到另一個列族中。這種數據庫通常用來應對分布式存儲海量數據。

典型產品:CassandraHBase

3)面向文檔(Document-Oriented)數據庫

文檔型數據庫的靈感是來自於Lotus Notes辦公軟件,而且它同第一種鍵值數據庫類似。該類型的數據模型是版本化的文檔,半結構化的文檔以特定的格式存儲,比如JSON。文檔型數據庫可以看作是鍵值數據庫的升級版,允許之間嵌套鍵值。而且文檔型數據庫比鍵值數據庫的查詢效率更高。

面向文檔數據庫會將數據以文檔形式存儲。每個文檔都是自包含的數據單元,是一系列數據項的集合。每個數據項都有一個名詞與對應值,值既可以是簡單的數據類型,如字符串、數字和日期等;也可以是復雜的類型,如有序列表和關聯對象。數據存儲的最小單位是文檔,同一個表中存儲的文檔屬性可以是不同的,數據可以使用XML、JSON或JSONB等多種形式存儲。

典型產品:MongoDBCouchDB

4)圖形數據庫

圖形數據庫允許我們將數據以圖的方式存儲。實體會被作為頂點,而實體之間的關系則會被作為邊。比如我們有三個實體,Steve Jobs、Apple和Next,則會有兩個“Founded by”的邊將Apple和Next連接到Steve Jobs。

典型產品:Neo4JInforGrid

01.3.RDBMS 術語

在我們開始學習MySQL 數據庫前,讓我們先了解下RDBMS的一些術語:

  • 數據庫: 數據庫是一些關聯表的集合。
  • 數據表: 表是數據的矩陣。在一個數據庫中的表看起來像一個簡單的電子表格。
  • : 一列(數據元素) 包含了相同的數據, 例如郵政編碼的數據。
  • :一行(=元組,或記錄)是一組相關的數據,例如一條用戶訂閱的數據。
  • 冗余:存儲兩倍數據,冗余降低了性能,但提高了數據的安全性。
  • 主鍵:主鍵是唯一的。一個數據表中只能包含一個主鍵。你可以使用主鍵來查詢數據。
  • 外鍵:外鍵用於關聯兩個表。
  • 復合鍵:復合鍵(組合鍵)將多個列作為一個索引鍵,一般用於復合索引。
  • 索引:使用索引可快速訪問數據庫表中的特定信息。索引是對數據庫表中一列或多列的值進行排序的一種結構。類似於書籍的目錄。

01.4.MySQL數據庫

MySQL 是一個關系型數據庫管理系統,由瑞典 MySQL AB 公司開發,目前屬於 Oracle 公司。MySQL 是一種關聯數據庫管理系統,關聯數據庫將數據保存在不同的表中,而不是將所有數據放在一個大倉庫內,這樣就增加了速度並提高了靈活性。

  • MySQL 是開源的,所以你不需要支付額外的費用。
  • MySQL 支持大型的數據庫。可以處理擁有上千萬條記錄的大型數據庫。
  • MySQL 使用標準的SQL數據語言形式
  • MySQL 可以運行於多個系統上,並且支持多種語言。這些編程語言包括C、C++、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
  • MySQL 支持大型數據庫,支持5000萬條記錄的數據倉庫,32位系統表文件最大可支持4GB,64位系統支持最大的表文件為8TB。
  • MySQL 是可以定制的,采用了GPL協議,你可以修改源碼來開發自己的 MySQL 系統。

01.5.YUM安裝數據庫

MySQL Yum倉庫提供了用於在Linux平臺上安裝MySQL服務器,客戶端和其他組件的RPM包。
mysql-yum安裝下載地址

註意
使用MySQL Yum倉庫時,默認選擇安裝最新的MySQL版本。如果需要使用低版本請按如下操作。

1.安裝MySQL倉庫源

[root@mysql-01 ~]# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

2.選擇並啟用適合當前平臺的發行包

//列出所有MySQL發行版倉庫
[root@mysql-01 ~]# yum repolist all|grep mysql
//禁用8.0發行版倉庫, 啟用5.7發行版倉庫
[root@mysql-01 ~]# yum install yum-utils
[root@mysql-01 ~]# yum-config-manager --disable mysql80-community
[root@mysql-01 ~]# yum-config-manager --enable mysql57-community

註意
可以手動編輯/etc/yum.repos.d/mysql-community.repo 文件配置倉庫

[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql

3.通過以下命令安裝MySQL, 並啟動MySQL

[root@mysql-01 ~]# yum install -y mysql-community-server
[root@mysql-01 ~]# systemctl start mysqld
[root@mysql-01 ~]# systemctl enable mysqld

MySQL服務器初始化(`僅適用於MySQL 5.7)在服務器初始啟動時,如果服務器的數據目錄為空,則會發生以下情況:

  • 服務器已初始化。
  • 在數據目錄中生成SSL證書和密鑰文件。
  • validate_password插件安裝並啟用。
  • 超級用戶帳戶‘root‘@‘localhost‘已創建。

超級用戶的密碼被設置並存儲在錯誤日誌文件中。要顯示它,請使用以下命令:

[root@mysql-01 ~]# grep "password" /var/log/mysqld.log 
2018-07-23T17:21:12.151266Z 1 [Note] A temporary password is generated for root@localhost: <Dera:Dm)7Du

通過使用生成的臨時密碼登錄並盡快更改root密碼並為超級用戶帳戶設置自定義密碼

[root@mysql-01 ~]# mysql -uroot -p‘<Dera:Dm)7Du‘
mysql> ALTER USER ‘root‘@‘localhost‘ IDENTIFIED BY ‘Zhang789@51cto‘;
mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "Zhang789@51cto";
mysql> flush privileges;

註意
MySQL的validate_password插件默認安裝。將要求密碼至少包含大寫小寫數字特殊字符、並且總密碼長度至少為8個字符

01.6.變更數據庫密碼

1.更改root密碼

//第一種方式, 需要知道密碼
[root@mysql-01 ~]# mysqladmin -uroot -pZhang789@51cto password ‘[email protected]‘
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.
[root@mysql-01 ~]# mysql -uroot [email protected]
mysql>
//第二種方式, 登錄MySQL, 修改相應表
mysql> update mysql.user set authentication_string=password(‘Zhang789@51cto‘) where user=‘root‘;
mysql> flush privileges;
[root@mysql-01 ~]# mysql -uroot -pZhang789@51cto  #登錄測試
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 5
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>

2.忘記mysql root密碼

[root@mysql-01 ~]# vim /etc/my.cnf
[mysqld]
skip-grant-tables # 新增跳過授權表
//重啟數據庫生效
[root@mysql-01 ~]# systemctl restart mysqld

//查看表字段
mysql> select user,host,authentication_string from mysql.user;
+---------------+-----------+-------------------------------------------+
| user          | host      | authentication_string                     |
+---------------+-----------+-------------------------------------------+
| root          | localhost | *818A16A5F7EC2B360571B69513BF73FA7FFA3E55 |
| mysql.session | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| mysql.sys     | localhost | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE |
| root          | %         | *818A16A5F7EC2B360571B69513BF73FA7FFA3E55 |
+---------------+-----------+-------------------------------------------+
3 rows in set (0.00 sec)

//5.7.6版本後更新密碼方式
mysql> update mysql.user set authentication_string=password(‘[email protected]‘) where user=‘root‘;
mysql> exit

//5.7.6版本前更新密碼方式
mysql> update mysql.user set password=password(‘[email protected]‘) where user="root" and host="localhost";

[root@mysql-01 ~]# vim /etc/my.cnf
[mysqld]
#skip-grant-tables #註釋
//重啟數據庫生效
[root@mysql-01 ~]# systemctl restart mysqld
//使用新密碼登錄數據庫
[root@mysql-01 ~]# mysql -uroot [email protected]
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.22 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

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

mysql>

01.7.MySQL工作模式及常用命令

  • 交互式模式:mysql>
# 交互式模式下的客戶端命令
mysql> help # 獲取命令幫助
mysql> \? # 同上
mysql> \c # 取消命令執行
mysql> \g # 發送命令至服務器端
mysql> \G # 發送命令至服務器端,垂直顯示結果
mysql> \q # 退出
mysql> \! # 執行系統shell命令
mysql> \s # 顯示服務器端狀態信息
mysql> \. /path/to/mysql_script.sql # 批量執行sql
mysql> \u # 切換數據庫

交互式模式下的服務器端命令(需要命令提示符,默認為分號)

mysql> help contents 能夠獲取幫助的分類信息
mysql> help keyword 獲取關鍵字的幫助信息,如help select

腳本模式:mysql &lt; /path/to/mysql_script.sql
註:常用於主從復制批量導入數據時

01.8.連接MySQL

連接類型

本地通信:客戶端與服務器端位於同一主機,而且還要基於127.0.0.1(localhost)地址或lo接口進行通信基於sock文件通信:如mysql -hlocalhost -uroot -p --socket=/tmp/mysql.sock
遠程通信:客戶端與服務器端位於不同的主機,或在同一主機使用非回環地址通信基於 TCP socket通信

mysql客戶端選項

實例

-u,--user # 指定連接用戶
-h,--host # 指定連接主機
-p,--password # 指定連接密碼
--protocol={tcp|socket|memory|pipe} # 指定連接協議
-P,--port # 指定連接端口,默認監聽端口:tcp/3306
--socket # 指定本地連接的sock文件
--compress # 數據傳輸采用壓縮格式
-D,--database # 指定連接後默認使用的數據庫
-H,--html # 指定產生html輸出
-X,--xml # 指定產生xml輸出
--safe-updates # 拒絕使用無where子句的update或delete命令
# 使用實例:mysql -hlocalhost -uroot -p

mysql命令提示符

mysql> # 等待輸入命令
-> # 等待繼續輸入
‘> # 等待結束單引號
“> # 等待結束雙引號
`> # 等待結束反引號
/*> # 註釋,不執行,需以*/結束註釋

mysql的快捷鍵

ctrl+w:# 刪除光標之前的單詞
ctrl+u:# 刪除光標之前至命令行首的所有內容
ctrl+y:# 粘貼所有ctrl+w或ctrl+u刪除的內容
ctrl+a:# 移動光標至行首
ctrl+e:# 移動光標至行尾

01.9.MySQL管理工具mysqladmin

# 使用格式:mysqladmin [options] command [arg] [,command [arg]] …
# 常用的command包括:
create DB_Name:# 創建數據庫
drop DB_Name:# 刪除數據庫
debug:# 打開調試日誌並記錄於error log中
status:# 顯示簡要狀態信息
--sleep #:設置間隔時長
--count #:設置顯示的批次
extended-status:# 顯示擴展信息,輸出mysqld的各狀態變量及賦值,相當於執行“mysql> show global status”
variables:# 輸出mysqld的各服務器變量
flush-hosts:# 清空主機相關的緩存:DNS解析緩存;此前因為連接錯誤次數過多而被拒絕訪問mysqld的主機列表
flush-logs:# 日誌滾動,只能滾動二進制日誌和中繼日誌
refresh:# 相當於同時使用flush-hosts和flush-logs
flush-privileges:# 通知mysqld重讀授權表
reload:# 功能同“flush-privileges”
flush-status:# 重置狀態變量的值
flush-tables:# 關閉當前打開的表文件句柄
flush-threads:# 清空線程緩存
kill:# 殺死指定的線程,需指定線程ID;可以一次殺死多個線程,以逗號分隔,但不能有多余空格
password:# 修改當前用戶的密碼
ping:# 模擬ping操作,檢測mysqld是否在線
processlist:# 顯示mysqld線程列表
shutdown:# 關閉mysqld進程
start-slave,stop-slave:# 啟動/關閉從服務器線程

【MySQL系列】01.數據庫簡介與MySQL安裝