1. 程式人生 > 實用技巧 >資料庫介紹(MySQL安裝 體系結構、基本管理)

資料庫介紹(MySQL安裝 體系結構、基本管理)

第1章 資料庫介紹及mysql安裝

1.1 資料庫簡介

  資料庫,簡而言之可視為電子化的檔案櫃——儲存電子檔案的處所,使用者可以對檔案中的資料執行新增、擷取、更新、刪除等操作。

  所謂“資料庫”系以一定方式儲存在一起、能予多個使用者共享、具有儘可能小的冗餘度、與應用程式彼此獨立的資料集合。

1.1.1 什麼是資料

  資料是指對客觀事件進行記錄並可以鑑別的符號,是對客觀 事物的性質、狀態以及相互關係等進行記載的物理符號或這些物 理符號的組合。它是可識別的、抽象的符號。

1.1.2 資料庫管理系統

非關係型資料庫

NoSQL:非關係型資料庫(Not only SQL)

不是否定關係型資料庫,做關係型資料庫的的補充。
想做老大,先學會做老二。

關係型資料庫

關係型資料庫的特點

二維表
典型產品 Oracle傳統企業,MySQL是網際網路企業
資料存取是通過SQL(結構化查詢語句)
最大特點,資料安全性方面強(ACID) 

1.1.3 NoSQL特性總覽

l 不是否定關係型資料庫,而是作為補充,現在也有部分替代的趨勢。

l 關注高效能,高併發,靈活性,忽略和上述無關的功能。

l 現在也在提升安全性和使用功能。

l 典型產品:Redis(持久化快取,兩個半天)、MongoDB(最接近關係型資料 的NoSQL)、Memcached。

l 管理不適用SQL管理,而是用一些特殊的 API 或 資料介面。

1.1.4 NoSQL的分類、特點、典型產品

鍵值(KV)儲存:Memcached、Redis

列儲存(column-oriented):HBASE(新浪,360)、Cassandra(200臺伺服器叢集 )

文件資料庫(document-oriented):MongoDB(最接近關係型資料庫的NoSQL)

圖形儲存(Graph):Neo4j

資料來源: https://db-engines.com/en/ranking

1.2 資料庫相關產品

1.2.1 Oracle公司產品介紹

Oracle資料庫版本介紹

  7--8i--9i--10g—11g--12c--18c(?)

Oracle

的市場應用

  a) 市場份額第一,趨勢遞減

  b) 市場空間,傳統企業

  c) 傳統企業也在網際網路化

MySQL資料庫版本介紹

  5.0--5.1--5.5--5.6--5.7--8.0

MySQL的市場應用

  a) 中、大型網際網路公司

  b) 市場空間:網際網路領域第一

  c) 趨勢明顯

  d) 同源產品:MariaDB、perconaDB

1.2.2 其他公司產品

微軟:SQL Server

微軟和sysbase合作開發的產品,後來自己開發,windows平臺
3,4線小公司,傳統行業在用

IBM:DB2資料庫

  市場佔有量小

  目前只有:國有銀行(人行、中國銀行、工商銀行等)、中國移動應用。

下面三者廣泛應用在大型網際網路公司

PostgreSQL
MongoDB
Redis

1.3 Mysql簡介

1.3.1 mysql資料庫發展史

1 1979年,報表工具Unireg出現。
2 1985 年,以瑞典David Axmark 為首,成立了一家公司(AB前身),IASM引擎出現。
3 1990年,提供SQL支援。
4 1999-2000年,MySQL AB公司成立,並公佈原始碼,開源化。
5 2000年4月BDB引擎出現,支援事務。
6 2008年1月16日,Sun(太陽微系統)正式收購MySQL。
7 2009年4月20日,甲骨文公司宣佈以每股9.50美元,74億美元的總額收購Sun電腦公司,MySQL 轉入Oracle 門下。
8 2013年6月18日,甲骨文公司修改MySQL授權協議,移除了GPL。但隨後有訊息稱這是一個bug。

1.3.2 MySQL的特點簡介

開源、社群版免費、簡單,使用方便,可靠、穩定、安全、社群活躍

1.3.3 mysql產品線的介紹

mysql產品線(主線)

3.26--5.2版本

  – 正宗後代

  – Centos5、6中預設有5.1版本

  – Centos7中預設是MariaDB

5.4--5.7,8.0版本

  – 借鑑社群好的貢獻,進一步開發的版本

  – 主流版本:5.5 5.6 5.7

MySQL Cluster 6.0版本&更高

  – 類似於Oracle RAC,硬體要求高。

  – 一般各大網站沒有人用

mysql產品線(派生產品)

  派生版本有Drizzle、MariaDB、Percona Server及OurDelta等。

1.3.4 企業生產場景選擇MySQL資料庫建議:

1)穩定版:選擇開源的社群版的穩定版GA版本 
2)產品線:可以選擇5.1或5.5 網際網路公司主流5.5,其次是5.1和5.6 
3)選擇MySQL資料庫GA版釋出後6個月以上的GA版本。 
4)要選擇前後幾個月沒有大的BUG修復的版本,而不是大量修復BUG的集中版本 
5)最好向後較長時間沒有更新發布的版本 
6)要考慮開發人員開發程式使用的版本是否相容你選的版本 
7)作為內部開發人員開發測試資料庫環境,跑大概3-6個月的事件 
8)優先企業非核心業務採用新版本的資料庫GA版本軟體 
9)向DBA高手請教,或者在及技術氛圍好的群裡和大家一起交流,使用真正的高手們用過的好用的GA版本產品
10)若是沒有重要的功能BUG或效能瓶頸,則可以開始考慮作為任何任務資料服務的後端資料庫軟體

1.4 mysql資料庫的安裝

1.4.1 系統環境說明

[root@db02 ~]# cat /etc/redhat-release 
CentOS release 6.9 (Final)
[root@db02 ~]# uname -r
2.6.32-696.el6.x86_64
[root@db02 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@db02 ~]# getenforce 
Disabled
[root@db02 ~]# hostname  -I 
10.0.0.52 172.16.1.52

1.4.2 mysql編譯安裝

安裝依賴包

yum  install  -y  ncurses-devel libaio-devel

安裝cmake編譯工具

cmake

定製功能:儲存引擎、字符集、壓縮等

定製安裝位置、資料儲存位置、檔案位置(socket)

yum install cmake -y

建立mysql管理使用者

useradd -s /sbin/nologin -M mysql -u1000
id mysql

下載mysql軟體包,解壓

mkdir  -p /server/tools 
cd /server/tools
wget -q http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.40.tar.gz
tar xf mysql-5.6.40.tar.gz

注:這裡使用的是sohu的映象源進行下載(軟體版本5.6.40)

官方下載方式參考:http://www.cnblogs.com/clsn/p/8025324.html#_label4

進入查詢目錄,使用cmake進行編譯,安裝,建立軟連線,過程時間較長。

cd mysql-5.6.40
cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.6.40 \
-DMYSQL_DATADIR=/application/mysql-5.6.40/data \
-DMYSQL_UNIX_ADDR=/application/mysql-5.6.40/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \
-DWITH_ZLIB=bundled \
-DWITH_SSL=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLE_DOWNLOADS=1 \
-DWITH_DEBUG=0
make && make install
ln -s /application/mysql-5.6.40/ /application/mysql

1.4.3 資料庫安裝後的操作

複製配置檔案

\cp  /application/mysql/support-files/my-default.cnf /etc/my.cnf

編譯的MySQL可以暫時不需要設定配置檔案。

注意:如果以前作業系統中安裝過rpm格式的mysql,系統中可能會遺留/etc/my.cnf檔案,我們需要將它刪除掉

初始化資料庫

/application/mysql/scripts/mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data --user=mysql

防止報錯:資料庫啟動會提示,找不到xx/tmp/mysql.sock,原因是5.6.40版本不會自動建立tmp目錄,需要我們手工建立。

mkdir /application/mysql/tmp

修改程式目錄的屬主,屬組

chown -R mysql.mysql /application/mysql/

複製啟動指令碼,並修改許可權

cp support-files/mysql.server /etc/init.d/mysqld
chmod 700 /etc/init.d/mysqld

新增環境變數,使用mysql命令

echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile
tail -1 /etc/profile
source /etc/profile
echo $PATH
mysql

1.4.4 資料庫安全設定

設定root使用者密碼

mysqladmin -u root password '123456'
mysql -uroot -p123456

優化資料庫(清理使用者及無用資料庫)

select user,host from mysql.user;
drop user ''@'db02';
drop user ''@'localhost';
drop user 'root'@'db02';
drop user 'root'@'::1';
select user,host from mysql.user;
drop database test;
show databases;

1.5 mysql 5.7版本安裝說明

主機系統環境說明

[root@db13 ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@db13 ~]# uname -r
2.6.32-696.el6.x86_64
[root@db13 ~]# getenforce
Disabled
[root@db13 ~]# /etc/init.d/iptables status
iptables: Firewall is not running.
[root@db13 ~]# hostname -I
10.0.0.153 172.16.1.153

獲取軟體(採用二進位制包方式進行安裝)

mkdir -p /server/tools
cd /server/tools
wget http://mirrors.sohu.com/mysql/MySQL-5.7/mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

解壓

tar xf mysql-5.7.17-linux-glibc2.5-x86_64.tar.gz

將軟體移動到程式目錄,建立軟連線

mkdir -p /application/
mv mysql-5.7.17-linux-glibc2.5-x86_64 /application/mysql-5.7.17
ln -s /application/mysql-5.7.17 /application/mysql

新增mysql使用者,並進行授權

useradd -M -s /sbin/nologin  -u 1000 mysql
chown -R mysql.mysql /application/mysql-5.7.17

初始化資料庫

/application/mysql-5.7.17/bin/mysqld --initialize --user=mysql --basedir=/application/mysql-5.7.17 --datadir=/application/mysql-5.7.17/data

初始化時注意最後一行輸出root密碼

2017-12-13T08:40:31.760309Z 1 [Note] A temporary password is generated for root@localhost: )*1E7=fYd&>i

拷貝配置檔案和啟動檔案

\cp /application/mysql-5.7.17/support-files/my-default.cnf /etc/my.cn
\cp \application/mysql-5.7.17/support-files/mysql.server /etc/init.d/mysqld

# 修改啟動檔案內容(配置目錄)

將程式安裝到 /usr/local/ 下 可以省略這步操作

sed 's#/usr/local#/application#g' /application/mysql-5.7.17/bin/mysqld_safe /etc/init.d/mysqld -i

啟動mysql

[root@db13 tools]# /etc/init.d/mysqld start 
Starting MySQL.Logging to '/application/mysql/data/db13.err'.
 SUCCESS! 
[root@db13 tools]# /etc/init.d/mysqld status
 SUCCESS! MySQL running (1509)

新增環境變數

echo 'PATH=/application/mysql/bin/:$PATH' >>/etc/profile
tail -1 /etc/profile
source /etc/profile
echo $PATH

修改mysql密碼

[root@db13 tools]# mysqladmin -uroot -p password 123456
Enter password: 【輸入初始化時生成的密碼】
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
Warning: Since password will be sent to server in plain text, use ssl connection to ensure password safety.

第2章 Mysql體系結構與基本管理

2.1 客戶端與伺服器端模型

2.1.1 mysql服務結構

mysql是一個典型的c/s模式,服務端與客戶端兩部分組成

        服務端程式 mysqld
        客戶端程式 mysql自帶客戶端(mysql、mysqladmin、mysqldump等)
                  第三方客戶端  API介面(php-mysql)

2.1.2 mysql連線方式

TCP/IP連線 網路連線串(通過使用者名稱 密碼 IP 埠進行連線)

mysql -uroot -p123 -h 127.0.0.1 -P 3306

socket連線網路套接字(使用者名稱 密碼 socket檔案)

mysql -uroot -p123 -S /application/mysql/tmp/mysql.sock 

在linux中使用mysql命令不加其他的引數連線方式即

mysql -uroot -poldboy123使用的是套接字檔案方式登入的

2.1.3 MySQL在啟動過程

啟動後臺守護程序,並生成工作執行緒

預分配記憶體結構供MySQL處理資料使用

例項就是MySQL的後臺程序+執行緒+預分配的記憶體結構

2.2 Mysqld服務的構成

2.2.1 連線層

通訊協議為:tcp/ip 或 socket

連線執行緒 為連線的數量

使用者驗證 為通過使用者名稱 密碼驗證進行通訊協議

2.2.2 SQL層

sql即結構化的查詢語句(資料庫內部邏輯語言)sql92 sql99

  DDL 資料庫定義語言

  DCL 資料庫控制語言

  DML 資料庫操作語言

  DQL 資料查詢語言

SQL層的功能: select * from wordpress.user;

1、判斷語法、語句、語義
    判斷語句型別 
2、資料庫不能直接響應sql語句
    必須明確的知道資料在哪個磁碟  
3、資料庫物件授權情況判斷
    授權失敗不繼續
4、解析(解析器)
    將sql語句解析成執行計劃,執行執行計劃,生成找資料的方式
5、優化 (優化器)
    執行執行計劃
   5.6之後 基於代價的演算法,從執行計劃中選擇代價最小的交給"執行器"
6、"執行器"
    執行執行計劃 
    最終生產如何去磁碟找資料方式
7、將取資料的方式,交由下層(儲存引擎層)進行處理

8、最終將取出的資料抽象成管理員或使用者能看懂的方式(表),展現在使用者面前

9、查詢快取: 快取之前查詢的資料。
    假如我們查詢的表是一個經常有變動的表,查詢快取不要設定太大  

SQL層處理流程

2.2.3 儲存引擎層

由上層決定儲存方式

  儲存引擎是充當不同表型別的處理程式的伺服器元件。

儲存引擎層功能:

  存資料、取資料

  資料的不同儲存方式

不同的管理方式:

  事務(增、刪、改)

  備份恢復

  高階功能(高可用的架構、讀寫分離架構)

2.2.4 依賴於儲存引擎的功能

儲存引擎是充當不同表型別的處理程式的伺服器元件。

儲存引擎用於:

儲存資料、檢索資料、通過索引查詢資料
儲存介質、事務功能、鎖定、備份和恢復、優化

特殊功能:

全文搜尋、引用完整性、空間資料處理    

雙層處理

上層包括SQL解析器和優化器、下層包含一組儲存引擎

SQL 層不依賴於儲存引擎:

引擎不影響SQL處理

2.2.5 mysql 的邏輯構成(資料庫內部結構)

邏輯構成是為了使用者能夠讀懂資料出現的,讓你更好的理解資料。

管理資料的一種方式。

物件:
  庫中包含表,在linux中以目錄表示
  表中有列結構與行記錄,在linux中以多個檔案表示
    行記錄
    列結構

切換庫

mysql> use mysql;

查看錶

mysql> show tables;

檢視列的資訊(記錄)

mysql> desc user;

2.2.6 mysql的儲存方式

  程式檔案隨資料目錄一起儲存在伺服器安裝目錄下。執行各種客戶機程式、管理程式和實用程式時將建立程式可執行檔案和日誌檔案。首要使用磁碟空間的是資料目錄。

伺服器日誌檔案和狀態檔案:

  包含有關伺服器處理的語句的資訊。日誌可用於進行故障排除、監視、複製和恢復。

  InnoDB日誌檔案:(適用於所有資料庫)駐留在資料目錄級別。

  InnoDB系統表空間: 包含資料字典、撤消日誌和緩衝區。

  每個資料庫在資料目錄下均具有單一目錄(無論在資料庫中建立何種型別的表)。資料庫目錄儲存以下內容:

資料檔案:
     特定於儲存引擎的資料檔案。這些檔案也可能包含元資料或索引資訊,具體取決於所使用的儲存引擎。
格式檔案 (.frm):
   包含每個表和/或檢視結構的說明,位於相應的資料庫目錄中。
觸發器:
     與某個表關聯並在該表發生特定事件時啟用的命名資料庫物件。

  資料目錄的位置取決於配置、作業系統、安裝包和分發。典型位置是 /var/lib/mysql。

  MySQL 在磁碟上儲存系統資料庫 (mysql)。

  mysql 包含諸如使用者、特權、外掛、幫助列表、事件、時區實現和儲存例程之類的資訊。

2.2.7 MySQL體系結構小結

sql優化相關的理念

  解析器 : 執行計劃 資料庫執行sql的一種方式

  優化器 : 知道基本規則,直接影響將來選擇哪個執行計劃

  查詢快取 : 生產環境中,一般會用redis memcached 來代替

邏輯結構

庫就是一個目錄,為了存放多張表

表在相應的庫中,用多個檔案來表示

  myisam表 3個檔案:(.myd資料檔案 .myi索引檔案 frm表 結構定義檔案)

  innodb: 2個或者一個,共享表空間(ibdata1 基表 元資料)、獨立表空間(5.6以後預設的表儲存方式)

如何使用磁碟

  1、多個庫多個目錄,目錄下存放了多個表的儲存檔案

  2、 auto.cnf db02.err db02.pid ibdata1 ib_logfile0 ib_logfile1 等

2.3 MySQL管理

2.3.1 連線管理:mysql

[root@db02 ~]# mysql --help
-u <user_name> 或 --host=<user_name>
-p<password>
-h <host_name> 或 --host=<host_name>
--protocol=<protocol_name> 
-P <port_number> 或 --port=<port_number> 
-S <socket_name> 或 --socket=<socket_name>

常用的連線方式:

套接字:  mysql -uroot -p123  -S /application/mysql/tmp/mysql.sock
Tcp/Ip: mysql -uroot -p123 -h 10.0.0.52 -P 3306

2.3.2 資料庫的啟動流程

mysqld 檔案屬性

[root@db02 ~]# cd /application/mysql/bin/
[root@db02 bin]# file mysqld
mysqld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped

mysql.server檔案屬性

[root@db02 bin]# file ../support-files/mysql.server 
../support-files/mysql.server: POSIX shell script text executable

mysqld_safe檔案屬性

[root@db02 data]# file /application/mysql/bin/mysqld_safe 
/application/mysql/bin/mysqld_safe: POSIX shell script text executable

可以看出mysql.server檔案與mysqld_safe檔案都是指令碼檔案,最後都呼叫mysqld二進位制檔案進行啟動。

2.3.3 mysql的關閉方法

推薦使用的方法:

1、mysqladmin -uroot -p123 shutdown
2、servive mysqld stop

儘量避免使用kill命令

mysqladmin命令關閉mysql

[root@db02 bin]# mysqladmin shutdown -uroot -p123
Warning: Using a password on the command line interface can be insecure.

perror命令

[root@db02 bin]# perror 13
OS error code  13:  Permission denied

perror命令是mysql自帶命令,能夠查詢mysql錯誤程式碼的含義。

2.3.4 my.cnf 配置檔案說明

功能

  1、影響到伺服器程序的啟動

  2、影響到客戶端程式

配置my.cnf

使用不同的"標籤"去明確指定影響哪部分功能

伺服器端

[server]
    [mysqld] -----> 一般設定此項
    [mysqld_safe]
[client]     ----> 為了方便設定此項
    [mysql] 
    [mysqladmin]
    [mysqldump]

my.cnf檔案配置例項

[root@db02 data]# cat /etc/my.cnf
[mysqld]
basedir=/application/mysql
datadir=/application/mysql/data
socket=/tmp/mysql.sock
log-error=/var/log/mysql.log
port=3307
[mysql]
socket=/tmp/mysql.sock
user=root
password=123

檢查程序資訊,可以看到與my.cnf配置的相同

[root@db02 data]# ps -ef |grep [my]sql 
root       3411   1918  0 15:52 pts/1    00:00:00 /bin/sh /application/mysql/bin/mysqld_safe
mysql      3548   3411  0 15:52 pts/1    00:00:00 /application/mysql/bin/mysqld --basedir=/application/mysql --datadir=/application/mysql/data --plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/var/log/mysql.log --pid-file=/application/mysql/data/db02.pid --socket=/tmp/mysql.sock --port=3307

my.cnf檔案的配置

2.3.5 配置檔案的讀取過程

/etc/my.cnf --> /etc/mysql/my.cnf --> $MYSQL_HOME/my.cnf --> defaults-extra-file=/tmp/clsn.txt --> ~/.my.cnf

  注:假設4個配置檔案都存在,同時使用--defaults-extra-file指定了引數檔案,如果這時有一個 "引數變數"在5個配置檔案中都出現了,那麼後面的配置檔案中的引數變數值會覆蓋前面配置檔案中的引數變數值,就是說會使用 ~/.my.cnf 中設定的值

  如果使用./bin/mysqld_safe 守護程序啟動mysql資料庫時,使用了 --defaults-file=<配置檔案的絕對路徑>引數,這時只會使用這個引數指定的配置檔案。

2.4 mysql多例項配置

2.4.1 什麼是MySQL多例項?

  簡單地說,MySQL多例項就是在一臺伺服器上同時開啟多個不同的服務埠(如:3306/3307)同時執行多個MySQL服務程序,這些服務程序通過不同的socket監聽不同的服務埠來提供服務。

  這些MySQL多例項共用一套MySQL安裝程式,使用不同的my.cnf(也可以相同)配置檔案、啟動程式(也可以相同)和資料檔案。在提供服務時,多例項MySQL在邏輯上看來是各自獨立的,他們根據配置檔案對應設定值,獲得伺服器響應數量的資源。

2.4.2 MySQL多例項的作用與問題

有效利用伺服器資源

  當單個伺服器資源有剩餘時,可以充分利用剩餘的資源提供更多的服務,且可以實現資源的邏輯隔離

節約伺服器資源

  當公司資金緊張,但是資料庫又需要各自盡量獨立地提供服務,而且,需要主從複製等技術時,多例項就再好不過了

  MySQL多例項有它的好處,但也有弊端,比如,會存在資源互相搶佔的問題。當某個資料庫例項併發很高或者有SQL慢查詢時,整個例項會消耗大量的系統CPU、磁碟I/O等資源,導致伺服器上的其他資料庫例項提供服務的質量一起下降。

2.4.3 多例項配置思路

1 多套配置檔案
2 多套 資料
3 多個socket
4 多個埠
5 多個日誌檔案
6 多個啟動程式

2.4.4 多例項配置過程

前期mysql的安裝與1.4MySQL的安裝一致,在這裡就不再重複(配置完成不要啟動)

第一個里程碑:多例項配置檔案準備

[root@db02 /]# tree /data/
/data/
├── 3306
│   ├── my.cnf
│   └── mysql
└── 3307
    ├── my.cnf
    └── mysql

3306埠my.cnf配置檔案

[root@db02 /]# cat data/3306/my.cnf 
[client]
port            = 3306
socket          = /data/3306/mysql.sock

[mysqld]
user    = mysql
port    = 3306
socket  = /data/3306/mysql.sock
basedir = /application/mysql
datadir = /data/3306/data
log-bin = /data/3306/mysql-bin
server-id = 6

[mysqld_safe]
log-error=/data/3306/mysql_3306.err
pid-file=/data/3306/mysqld.pid

3307埠my.cnf配置檔案

[root@db02 /]# cat  /data/3307/my.cnf 
[client]
port            = 3307
socket          = /data/3307/mysql.sock

[mysqld]
user    = mysql
port    = 3307
socket  = /data/3307/mysql.sock
basedir = /application/mysql
datadir = /data/3307/data
log-bin = /data/3307/mysql-bin
server-id = 7

[mysqld_safe]
log-error=/data/3307/mysql_3307.err
pid-file=/data/3307/mysqld.pid

編寫管理指令碼3306

[root@db02 /]# cat data/3306/mysql 
#!/bin/sh
#3306 start scripts
#init
port=3306
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/3306/3306.pid
start(){
    if [ ! -e "$mysql_sock" ];then
         printf "Starting MySQL...\n"
        /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}
stop(){
    if [ ! -e "$mysql_sock" ];then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stoping MySQL...\n"
        mysqld_pid=`cat "$mysqld_pid_file_path"`
         if (kill -0 $mysqld_pid 2>/dev/null)
           then
             kill $mysqld_pid
             sleep 2
         fi
    fi
}

restart(){
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

編寫管理指令碼3307

[root@db02 /]# cat data/3307/mysql 
#!/bin/sh
#3307 start scripts
#init
port=3307
mysql_user="root"
CmdPath="/application/mysql/bin"
mysql_sock="/data/${port}/mysql.sock"
mysqld_pid_file_path=/data/3307/3307.pid
start(){
    if [ ! -e "$mysql_sock" ];then
         printf "Starting MySQL...\n"
        /bin/sh ${CmdPath}/mysqld_safe --defaults-file=/data/${port}/my.cnf --pid-file=$mysqld_pid_file_path 2>&1 > /dev/null &
        sleep 3
    else
        printf "MySQL is running...\n"
        exit 1
    fi
}
stop(){
    if [ ! -e "$mysql_sock" ];then
        printf "MySQL is stopped...\n"
        exit 1
    else
        printf "Stoping MySQL...\n"
        mysqld_pid=`cat "$mysqld_pid_file_path"`
         if (kill -0 $mysqld_pid 2>/dev/null)
           then
             kill $mysqld_pid
             sleep 2
         fi
    fi
}

restart(){
    printf "Restarting MySQL...\n"
    stop
    sleep 2
    start
}

case "$1" in
    start)
        start
    ;;
    stop)
        stop
    ;;
    restart)
        restart
    ;;
    *)
        printf "Usage: /data/${port}/mysql {start|stop|restart}\n"
esac

注意指令碼要給繼續許可權才能夠正常使用

  第二個里程碑:建立資料目錄並授權

[root@db02 /]# mkdir /data/{3306,3307}/data -p
[root@db02 /]# chown -R mysql.mysql /data/

  第三個里程碑:初始化資料

cd /application/mysql/scripts  && \
./mysql_install_db  --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data --user=mysql
./mysql_install_db  --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data --user=mysql

  第四個里程碑:建立日誌檔案

#5.6.40特殊性:需要建立錯誤日誌檔案

touch /data/3306/mysql_3306.err
touch /data/3307/mysql_3307.err

  第五個里程碑:啟動多例項

[root@db02 scripts]# /data/3306/mysql start
Starting MySQL...
[root@db02 scripts]# /data/3307/mysql start
Starting MySQL...

檢查mysql狀態

[root@db02 scripts]# ps -ef |grep [my]sql 
root       4341      1  0 16:46 pts/1    00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3306/my.cnf --pid-file=/data/3306/3306.pid
mysql      4526   4341 13 16:46 pts/1    00:00:03 /application/mysql/bin/mysqld --defaults-file=/data/3306/my.cnf --basedir=/application/mysql --datadir=/data/3306/data 
--plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3306/mysql_3306.err --pid-file=/data/3306/3306.pid --socket=/data/3306/mysql.sock --port=3306 root 4549 1 0 16:46 pts/1 00:00:00 /bin/sh /application/mysql/bin/mysqld_safe --defaults-file=/data/3307/my.cnf --pid-file=/data/3307/3307.pid mysql 4734 4549 51 16:46 pts/1 00:00:08 /application/mysql/bin/mysqld --defaults-file=/data/3307/my.cnf --basedir=/application/mysql --datadir=/data/3307/data
--plugin-dir=/application/mysql/lib/plugin --user=mysql --log-error=/data/3307/mysql_3307.err --pid-file=/data/3307/3307.pid --socket=/data/3307/mysql.sock --port=3307

檢查埠資訊

[root@db02 scripts]# netstat  -lntup |grep mysql 
tcp        0      0 :::3306                     :::*                        LISTEN      4526/mysqld         
tcp        0      0 :::3307                     :::*                        LISTEN      4734/mysqld

至此mysql的多例項就配置完成

2.4.5 多例項mysql的使用

本地連線方式

mysql -S /data/3306/mysql.sock
mysql -S /data/3307/mysql.sock

2.4.6 關於mysql多例項的選擇

1、資金緊張性公司的選擇 
  資金緊張,公司業務訪問量又不大,但又希望不同的業務的資料庫服務各自盡量獨立 
2、併發訪問不是特別大的業務 
  當公司業務訪問量不太大的時候,伺服器的資源基本都是浪費的,這就適合多例項的使用 
3、入口網站應用MySQL多例項場景 
  配置硬體好的伺服器,可以節省IDC機櫃空間,跑多例項也不會減少硬體資源不慢的浪費 
  一般是從庫多例項,例如:某部門使用IBM伺服器為48核CPU,記憶體96GB、一臺伺服器跑3~4個例項:
此外,sina網也是用的多例項,記憶體48GB左右。企業環境中一般將多例項應用在測試環境。

2.5 mysql忘記密碼怎麼辦?

第一步:將服務停掉

/etc/init.d/mysqld stop

第二步:加引數啟動服務

cd /application/mysql/bin/ 
mysqld_safe --skip-grant-table --user=mysql --skip-networking &

這種模式下
  無密碼登陸
  網路使用者無法登陸
  只能本地登陸
  和授權有關的命令都無法執行

第三步:修改密碼

[root@db02 3306]# mysql
mysql> update mysql.user set password=password('123') where user='root' and host='localhost';
mysql> flush privileges;

MYSQL5.7 修改密碼修改欄位 authentication_string

第四步:退出重啟服務

/etc/init.d/mysqld restart

第五步:登入驗證

mysql -uroot -p123

至此密碼修改成功

2.6 參考文獻

https://zh.wikipedia.org/wiki/MySQL#%E6%AD%B7%E5%8F%B2  mysql歷史
http://blog.51cto.com/oldboy/1728380   MySQL常見錯誤程式碼(error code)及程式碼說明
https://www.abcdocker.com/abcdocker/28   MySQL入門介紹
https://www.abcdocker.com/abcdocker/90   MySQL多例項
http://oldboy.blog.51cto.com    指令碼來源