天天看點

MySQL階段一——mysql安裝與調優+各版本特性

MySQL初識;

    關系型資料庫:

        mysql:開源免費,可移植性好

        Oracle:一般配合Java比較多,處理大批量資料,速度快

        db2:最貴的資料庫,安全性好

        sql server:微軟的産品,資料量不超過幾百萬,企業級

        access:門戶網站資料庫,接受不了大資料

    非關系型資料庫:

        redis:(key-value)

        memcached:

        mongoDB

    版本:

        alpha版:在公司内部運作

        beta版:完成功能開發與測試

        RC版:候選版

        GA版:正式釋出的版本

    産品路線:

        1)-5.0.xx到-5.1.xx

        2)-5.4.xx到-5.7.xx

        3)-6.0.xx到-7.1.xx

        例:mysql_5.0.56.tar.gz

        5:主版本号

        0:發行級别

        5.0:發行序列号

        56:發行系列的版本号

MySQL安裝方法:

1.yum安裝

2.rpm安裝 

3.正常安裝 ./configure make makeinstall

4.源碼cmake方式編譯安裝

所需包:

mysql-5.5.32.tar.gz 

cmake-2.8.8.tar.gz

包一定要選正确

系統:

[root@qbPC ~]# cat /etc/redhat-release 

CentOS release 6.5 (Final)

[root@qbPC ~]# uname -a

Linux qbPC 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

我在6.8系統也裝成功了,應該6.x系列應該差不多

準備:

[root@qbPC ~]# cat /etc/udev/rules.d/70-persistent-net.rules 

[root@qbPC ~]#> /etc/udev/rules.d/70-persistent-net.rules 

1.3安裝相關軟體包

    1.3.1cmake軟體

#cd /home/tools/

#tar xf cmake-2.8.8.tar.gz 

#cd cmake-2.8.8

#./configure 

------------------------------------------------------------------------------------------

這裡可能遇見問題1:

---------------------------------------------

CMake 3.1.1, Copyright 2000-2015 Kitware, Inc.

C compiler on this system is: cc 

Error when bootstrapping CMake:

Cannot find appropriate C++ compiler on this system.

Please specify one using environment variable CXX.

See cmake_bootstrap.log for compilers attempted.

解決:

yum install make cmake gcc gcc-c++ -y

gmake

gmake install

MySQL階段一——mysql安裝與調優+各版本特性
MySQL階段一——mysql安裝與調優+各版本特性

cd ..

    1.3.2依賴包

[root@qbPC tools]# yum -y install ncurses-devel 

不安裝會有問題:

MySQL階段一——mysql安裝與調優+各版本特性

1.4開始安裝MySQL

    檢視系統中是否已安裝 MySQL 服務:

        rpm -qa | grep mysql

    或

        yum list installed | grep mysql

    如果已安裝則删除 MySQL 及其依賴的包:

        yum -y remove mysql-libs.x86_64

    1.4.1 建立使用者群組

[root@qbPC tools]# groupadd mysql

[root@qbPC tools]# useradd mysql -s /sbin/nologin -M -g mysql

-s

表示指定使用者所用的shell,此處為

/sbin/nologin

,表示不登入。

-M

表示不建立使用者主目錄。

-g

表示指定使用者的組名為

mysql

最後的

mysql

表示使用者名。

    1.4.2解壓編譯MySQL

[root@qbPC tools]# tar xf mysql-5.5.32.tar.gz

[root@qbPC tools]# cd mysql-5.5.32

[root@qbPC mysql-5.5.32]#cmake . -DCMAKE_INSTALL_PREFIX=/application/mysql-5.5.32 \   安裝路徑

-DMYSQL_DATADIR=/application/mysql-5.5.32/data \ 資料檔案路徑

-DMYSQL_UNIX_ADDR=/application/mysql-5.5.32/tmp/mysql.sock \  sock路徑

-DDEFAULT_CHARSET=utf8 \  m預設字元集

-DDEFAULT_COLLATION=utf8_general_ci \ 預設字元集校對規則

-DEXTRA_CHARSETS=gbk,gb2312,utf8,ascii \

-DENABLED_LOCAL_INFILE=ON \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_FEDERATED_STORAGE_ENGINE=1 \

-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \

-DWITHOUT_EXAMPLE_STORAGE_ENGINE=1 \

-DWITHOUT_PARTITION_STORAGE_ENGINE=1 \

-DWITH_FAST_MUTEXES=1 \

-DWITH_ZLIB=bundled \

-DENABLED_LOCAL_INFILE=1 \

-DWITH_READLINE=1 \

-DWITH_EMBEDDED_SERVER=1 \

-DWITH_DEBUG=0

MySQL階段一——mysql安裝與調優+各版本特性

[root@qbPC mysql-5.5.32]# make && make install

    時間比較長

可能遇見問題2

MySQL階段一——mysql安裝與調優+各版本特性

解決

[root@qbPC mysql-5.5.32]# which cmake

/usr/local/bin/cmake

檢查

cmake安裝不正确,重新安裝

編譯完成

MySQL階段一——mysql安裝與調優+各版本特性

[root@qbPC mysql-5.5.32]# ln -s /application/mysql-5.5.32/ /application/mysql

到此cmake的安裝就算成功了!

    1.4.3初始化配置MySQL

1.檢視預設模版配置檔案

2.選擇配置檔案

[root@qbPC tools]# cp mysql-5.5.32/support-files/my-small.cnf /etc/my.cnf 

cp: overwrite `/etc/my.cnf'? y

    測試環境選小的,生産環境可以根據硬體選擇,例如my-innodb-heavy-4G.cnf

3.配置環境變量

[root@qbPC tools]# echo 'export PATH=/application/mysql/bin:$PATH' >> /etc/profile

必須放在PATH的前面,因為以後可能有yum安裝的用戶端,如果不放在前面,如果使用mysql指令之類的,會調用系統的rpm的指令。

[root@qbPC tools]# tail /etc/profile

    fi

done

unset i

unset -f pathmunge

export JAVA_HOME=/application/jdk

export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib

export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH:$HOME/bin

export RESIN_HOME=/application/resin

export PATH=/application/mysql/bin:$PATH

[root@qbPC tools]# source /etc/profile

[root@qbPC tools]# echo $PATH

/application/mysql/bin:/application/jdk/bin:/......

環境變量出錯的問題3:

-------------------------------------------------------------------------------------

http://oldboy.blog.51cto.com/2561410/1122867

FAQ:問題1:mysqldump: Got error: 1556: You can't use locks with log tables.

    在老男孩帶學生做主從同步實踐時,發現學生實踐操作時遇到如下問題無法解決,于是,老男孩把解決的過程總結如下:

[root@Oldboy ~]# mysqldump -uroot -p'oldboy' -S /data/3306/mysql.sock -A -B >a.sql

mysqldump: Got error: 1556: You can't use locks with log tables. when using LOCK TABLES

解決過程:

同樣的操作,其他10幾個學生都是OK的,隻有這個學生有問題,在詢問後,并檢視了相關配置過程後,聯系到往期也有學生發生過類似問題,于是,發現了原因。

[root@Oldboy ~]# which mysqldump

/usr/bin/mysqldump

發現原因,mysql的安裝路徑為/application/mysql,檢視mysqldump的路徑應該是/application/mysql/bin才對,但是現在的路徑是rpm包安裝的mysql指令路徑了,至此原因找到。

[root@oldboy ~]# tail -1 /etc/profile

export PATH=$PATH:/application/mysql/bin

在/etc/profile檔案中,mysql的指令所在路徑,該學生放到了結尾,是以,當執行mysqldump指令時,優先找到了rpm包自帶的/usr/bin/mysqldump指令,進而導緻了錯誤。

我們把把mysql的指令路徑放到PATH變量的最前面:

[root@Oldboy ~]# . /etc/profile

[root@Oldboy ~]# echo $PATH

/application/mysql/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/mysql/bin:/root/bin:/usr/local/mysql/bin:/application/mysql5.1.65/bin:/application/apache/bin

/application/mysql/bin/mysqldump

此時在導出資料庫:

[root@Oldboy ~]#mysqldump -uroot -p'oldboy' -S /data/3306/mysql.sock -A -B >a.sql

可以正常導出了。

環境變量出錯的問題3-------------------------------------------------------------------------------------

4.初始化資料檔案(容易出錯的步驟)

[root@qbPC tools]# chown -R mysql.mysql /application/mysql/data/

[root@qbPC tools]# chmod -R 1777 /tmp/

[root@qbPC tools]# cd /application/mysql/scripts/

[root@qbPC scripts]# ./mysql_install_db --basedir=/application/mysql/ --datadir=/application/mysql/data/ --user=mysql

出現以下的兩個OK即為初始化成功

MySQL階段一——mysql安裝與調優+各版本特性
提示:

WARNING: The host 'qbPC' could not be looked up with resolveip.
This probably means that your libc libraries are not 100 % compatible
with this binary MySQL version. The MySQL daemon, mysqld, should work
normally with the exception that host name resolving will not work.
This means that you should use IP addresses instead of hostnames
when specifying MySQL privileges !
Installing MySQL system tables...
OK
Filling help tables...
OK

啟動腳本
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system


PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:

修改密碼
/application/mysql//bin/mysqladmin -u root password 'new-password'
/application/mysql//bin/mysqladmin -u root -h qbPC password 'new-password'

Alternatively you can run:
/application/mysql//bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default.  This is
strongly recommended for production servers.

See the manual for more instructions.

啟動
You can start the MySQL daemon with:
cd /application/mysql/ ; /application/mysql//bin/mysqld_safe &

測試
You can test the MySQL daemon with mysql-test-run.pl
cd /application/mysql//mysql-test ; perl mysql-test-run.pl

彙報bug
Please report any problems with the /application/mysql//scripts/mysqlbug script!      

對于第一句的warning,解決

[root@qbPC scripts]# vim /etc/hosts

    127.0.0.1 localhost qbPC---最後面加上主機名即可

當各種正常,在mysql的時候或者mysql -uroot -p123也不能進行,就要想想是不是初始化檔案是否正确!

5.設定正常方式啟動和關閉腳本

[root@qbPC mysql]# cd /home/tools/mysql-5.5.32  

[root@qbPC mysql-5.5.32]# /bin/cp support-files/mysql.server /etc/init.d/mysqld

[root@qbPC mysql-5.5.32]# /etc/init.d/m

mdmonitor   multipathd  

當tab不出來,說明有問題,進行權重限

[root@qbPC mysql-5.5.32]# chmod +x /etc/init.d/mysqld

[root@qbPC mysql-5.5.32]# /etc/init.d/mysqld start

Starting MySQL...                                          [  OK  ]

[root@qbPC mysql-5.5.32]# netstat -ntlup | grep 3306

tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      28628/mysqld

成功了!

[root@qbPC mysql-5.5.32]# chkconfig mysqld on

[root@qbPC mysql-5.5.32]# chkconfig --list mysqld

mysqld         0:off1:off2:on3:on4:on5:on6:off

6.登入mysql故障解決

MySQL階段一——mysql安裝與調優+各版本特性

mysql -uroot -p123:這樣登入也不行的時候進行下面操作

pkill mysqld

lsof -i :3306

rm -rf /application/mysql/data/*

然後重複4.初始化資料檔案(容易出錯的步驟)

7.成功登入

先優化,安全,木桶原則

[root@qbPC mysql-5.5.32]# mysql
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.32 Source distribution

Copyright (c) 2000, 2013, 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> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | 127.0.0.1 |
| root | ::1       |
|      | localhost |
| root | localhost |
|      | qbPC      |
| root | qbPC      |
+------+-----------+
6 rows in set (0.00 sec)

mysql> delete from mysql.user;
Query OK, 2 rows affected (0.00 sec)

mysql> grant all privileges on *.* to root@'localhost' identified by '***' with grant option;
Query OK, 1 row affected (0.00 sec)

mysql> select user,host from mysql.user;
+------+-----------+
| user | host      |
+------+-----------+
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)

mysql> drop database test;
Query OK, 0 rows affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)

mysql>      

修改密碼

[root@qbPC mysql-5.5.32]# /application/mysql//bin/mysqladmin -u root password '123'

[root@qbPC mysql-5.5.32]# mysql -uroot -p123

Welcome to the MySQL monitor.  Commands end with ; or \g.

字元集:

[root@qbPC ~]# cat /etc/sysconfig/i18n 

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16"

問題:

MySQL階段一——mysql安裝與調優+各版本特性

解決安裝;yum -y install openssl-devel

---MySQL5.5特性:

  1. 預設存儲引擎更改為InnoDB

  InnoDB作為成熟、高效的事務引擎,目前已經廣泛使用,但MySQL5.1之前的版本預設引擎均為MyISAM,此次MySQL5.5終于做到與時俱進,将預設資料庫存儲引擎改為InnoDB,并且引進了Innodb plugin 1.0.7。此次更新對資料庫的好處是顯而易見的:InnoDB的資料恢複時間從過去的一個甚至幾個小時,縮短到幾分鐘(InnoDB plugin 1.0.7,InnoDB plugin 1.1, 恢複時采用紅-黑樹)。InnoDB Plugin 支援資料壓縮存儲,節約存儲,提高記憶體命中率,并且支援adaptive flush checkpoint, 可以在某些場合避免資料庫出現突發性能瓶頸。

  Multi Rollback Segments: 原來InnoDB隻有一個Segment,同時隻支援1023的并發。現已擴充到128個Segments,進而解決了高并發的限制。

  2. 多核性能提升

  Metadata Locking (MDL) Framework替換LOCK_open mutex (lock),使得MySQL5.1及過去版本在多核心處理器上的性能瓶頸得到解決,官方表示将繼續增強對MySQL多處理器支援,直至MySQL性能“不受處理器數量的限制”

  3. 複制功能(Replication)加強

  MySQL複制特性是網際網路公司應用非常廣泛的特性,作為MySQL最實用最簡單的擴充方式,過去的異步複制方式已經有些不上形勢,對某些使用者來說“異步複制”意味着極端情況下的資料風險,MySQL5.5将首次支援半同步(semi-sync replication)在MySQL的高可用方案中将産生更多更加可靠的方案。另外Slave fsync tunning;Relay log corruption recovery和Replication Heartbeat也将實作。

  4. 增強表分區功能

  MySQL 5.5的分區對使用者絕對是個好消息,更易于使用的增強功能,以及TRUNCATE PARTITION指令都可以為DBA節省大量的時間,有時對最終使用者亦如此:

  1) 非整數列分區:任何使用過MySQL分區的人應該都遇到過不少問題,特别是面對非整數列分區時,MySQL 5.1隻能處理整數列分區,如果你想在日期或字元串列上進行分區,你不得不使用函數對其進行轉換。很麻煩,而MySQL 5.5中新增了兩類分區方法,RANG和LIST分區法,同時在新的函數中增加了一個COLUMNS關鍵詞。在MySQL 5.1中使用分區另一個讓人頭痛的問題是date類型(即日期列),你不能直接使用它們,必須使用YEAR或TO_DAYS轉換這些列,但在MySQL 5.5中情況發生了很大的變化,現在在日期列上可以直接分區,并且方法也很簡單;

  2) 多列分區:COLUMNS關鍵字現在允許字元串和日期列作為分區定義列,同時還允許使用多個列定義一個分區;

  3) 可用性增強:truncate分區。分區最吸引人的一個功能是瞬間移除大量記錄的能力,DBA都喜歡将曆史記錄存儲到按日期分區的分區表中,這樣可以定期删除過時的曆史資料。 但當你需要移除分區中的部分資料時,事情就不是那麼簡單了,删除分區沒有問題,但如果是清空分區,就很頭痛了,要移除分區中的所有資料,但需要保留分區本身,你可以:使用DELETE語句,但我們知道DELETE語句的性能都很差。使用DROP PARTITION語句,緊跟着一個EORGANIZE PARTITIONS語句重新建立分區,但這樣做比前一個方法的成本要高出許多。MySQL 5.5引入了TRUNCATE PARTITION,它和DROP PARTITION語句有些類似,但它保留了分區本身,也就是說分區還可以重複利用。TRUNCATE PARTITION應該是DBA工具箱中的必備工具;

  4) 更多微調功能:TO_SECONDS:分區增強包有一個新的函數處理DATE和DATETIME列,使用TO_SECONDS函數,你可以将日期/時間列轉換成自0年以來的秒數,如果你想使用小于1天的間隔進行分區,那麼這個函數就可以幫到你。

  5. Insert Buffering 如果在buffer pool中沒找到資料,那麼直接buffer起來,避免額外的IO;Delete & Purge Buffering 跟插入一樣,如果buffer pool中沒有命中,先buffer起來,避免額外的IO。

  6. Support for Native AIO on Linux

---MySQL5.7特性:

1. 介紹

身處MySQL這個圈子,能夠切身地感受到大家對MySQL 5.7的期待和熱情,似乎每個人都迫不及待的想要了解、學習和使用MySQL 5.7。那麼,我們不禁要問,MySQL 5.7到底做了哪些改進,引入了哪些新功能,性能又提升了多少,能夠讓大家翹首以盼,甚至歡呼雀躍呢?

下面就跟随我來一起了解一下MySQL 5.7的部分新功能。想要在一篇文章中介紹完MySQL 5.7的所有改進,幾乎是不可能的。是以,我會選擇一些有特别意思的、特别有用的功能進行介紹。希望通過這篇文章,能夠激發大家對MySQL 5.7的學習興趣,甚至能夠吸引大家将自己的業務遷移到MySQL 5.7上。

 MySQL 5.7在諸多方面都進行了大幅的改進,本文将從安全性(見2.1節)、靈活性(見2.2節)、易用性(見2.3節)、可用性(見2.4節)和性能(見2.5節)等幾個方面進行介紹。最後,在第3節對本文進行了簡單的總結。

2. MySQL 5.7的新特性

這一節中,将依次介紹MySQL 5.7的各種新特性。由于MySQL 5.7改進較多,是以,本文将這些新特性進行了簡單的分類,分為安全性、靈活性、易用性、可用性和性能。接下來,将從各個分類依次進行介紹。 

2.1 安全性

 安全性是資料庫永恒的話題,在MySQL 5.7中,有不少安全性相關的改進。包括:

 MySQL資料庫初始化完成以後,會産生一個 root@localhost 使用者,從MySQL 5.7開始,root使用者的密碼不再是空,而是随機産生一個密碼,這也導緻了使用者安裝5.7時發現的與5.6版本比較大的一個不同點

MySQL官方已經删除了test資料庫,預設安裝完後是沒有test資料庫的,就算使用者建立了test庫,也可以對test庫進行權限控制了

MySQL 5.7版本提供了更為簡單SSL安全通路配置,并且預設連接配接就采用SSL的加密方式

可以為使用者設定密碼過期政策,一定時間以後,強制使用者修改密碼

   ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY; 

可以”鎖”住使用者,用以暫時禁用某個使用者

   ALTER USER  'jeffrey'@'localhost' ACCOUNT LOCK;

   ALTER USER l 'jeffrey'@'localhost'  ACCOUNT UNLOCK; 

2.2 靈活性

在這一節,我将介紹MySQL 5.7的兩個全新的功能,即JSON和generate column。充分使用這兩個功能,能夠極大地提高資料存儲的靈活性。

 2.2.1 JSON

 随着非結構化資料存儲需求的持續增長,各種非結構化資料存儲的資料庫應運而生(如MongoDB)。從最新的資料庫使用 排行榜 來看,MongoDB已經超過了PostgreSQL,其火熱程度可見一斑。

 各大關系型資料庫也不甘示弱,紛紛提供對JSON的支援,以應對非結構化資料庫的挑戰。MySQL資料庫從5.7.8版本開始,也提供了對JSON的支援。其使用方式如下:

 CREATE TABLE t1 (jdoc JSON);

INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');

MySQL對支援JSON的做法是,在server層提供了一堆便于操作JSON的函數,至于存儲,就是簡單地将JSON編碼成BLOB,然後交由存儲引擎層進行處理,也就是說,MySQL 5.7的JSON支援與存儲引擎沒有關系,MyISAM 存儲引擎也支援JSON 格式。

MySQL支援JSON以後,總是避免不了拿來與MongoDB進行一些比較。但是,MySQL對JSON的支援,至少有兩點能夠完勝MongoDB:

1.可以混合存儲結構化資料和非結構化資料,同時擁有關系型資料庫和非關系型資料庫的優點

2.能夠提供完整的事務支援

2.2.2 generate column

generated column是MySQL 5.7引入的新特性,所謂generated column,就是資料庫中這一列由其他列計算而得。

 例如,知道直角三角形的兩條直角邊,要求直角三角形的面積。很明顯,面積可以通過兩條直角邊計算而得,那麼,這時候就可以在資料庫中隻存放直角邊,面積使用generated column,如下所示:

 CREATE TABLE triangle (sidea DOUBLE, sideb DOUBLE, area DOUBLE AS (sidea * sideb / 2));

insert into triangle(sidea, sideb) values(3, 4);

select * from triangle;

+-------+-------+------+

| sidea | sideb | area |

|   3 |   4 |  6 |

 在MySQL 5.7中,支援兩種generated column,即virtual generated column和stored generated column,前者隻将generated column儲存在資料字典中(表的中繼資料),并不會将這一列資料持久化到磁盤上;後者會将generated column持久化到磁盤上,而不是每次讀取的時候計算所得。很明顯,後者存放了可以通過已有資料計算而得的資料,需要更多的磁盤空間,與virtual column相比并沒有優勢。是以,在不指定generated column的類型時,預設是virtual column,如下所示:

 show create table triangle\G

*************************** 1. row ***************************

    Table: triangle

Create Table: CREATE TABLE `triangle` (

 `sidea` double DEFAULT NULL,

 `sideb` double DEFAULT NULL,

 `area` double GENERATED ALWAYS AS (((`sidea` * `sideb`) / 2)) VIRTUAL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

如果讀者覺得generate column提供的功能,也可以在使用者代碼裡面實作,并沒有什麼了不起的地方,那麼,或許還有一個功能能夠吸引挑剔的你,那就是為generate column建立索引。在這個例子中,如果我們需要根據面積建立索引以加快查詢,就無法在使用者代碼裡面實作,使用generate column就變得非常簡單:

alter table triangle add index ix_area(area);

2.3 易用性 

易用性是資料庫永恒的話題,MySQL也在持續不斷地提高資料庫的易用性。在MySQL 5.7中,有很多易用性方面的改進,小到一個用戶端快捷鍵 ctrl+c 的使用,大到專門提供一個系統庫(sys)來幫助DBA和開發人員使用資料庫。這一節将重點介紹MySQL 5.7引入的sys庫。

 在linux下,我們經常使用 ctrl+c 來終止一個指令的運作,在MySQL 5.7 之前,如果使用者輸入了錯誤的SQL語句,按下 ctrl+c ,雖然能夠”結束”SQL語句的運作,但是,也會退出目前會話,MySQL 5.7對這一違反直覺的地方進行了改進,不再退出會話。

MySQL 5.7可以explain一個正在運作的SQL,這對于DBA分析運作時間較長的語句将會非常有用

在MySQL 5.7中,performance_schema提供了更多監控資訊,包括記憶體使用,MDL鎖,存儲過程等

2.3.1 sys schema

sys schema是MySQL 5.7.7中引入的一個系統庫,包含了一系列視圖、函數和存儲過程, 該項目專注于MySQL的易用性。例如,我們可以通過sys schema快速的知道,哪些語句使用了臨時表,哪個使用者請求了最多的io,哪個線程占用了最多的記憶體,哪些索引是無用索引等

sys schema中包含了大量的視圖,那麼,這些視圖的資訊來自哪裡呢?視圖中的資訊均來自performance schema統計資訊。 這裡 有一個很好的比喻:

    For Linux users I like to compare performance_schema to /proc, and SYS to vmstat.

也就是說,performance schema提供了資訊源,但是,沒有很好的将這些資訊組織成有用的資訊,進而沒有很好的發揮它們的作用。而sys schema使用performance schema資訊,通過視圖的方式給出解決實際問題的答案。

例如,下面這些問題,在MySQL 5.7之前,需要借助外部工具才能知道,在MySQL 5.7中,直接查詢sys庫下相應的表就能得到答案:

 如何檢視資料庫中的備援索引select * from sys.schema_redundant_indexes;

 如何擷取未使用的索引select * from schema_unused_indexes;

 如何檢視使用全表掃描的SQL語句select * from statements_with_full_table_scans 

2.4 可用性

MySQL 5.7在可用性方面的改進也帶給人不少驚喜。這裡介紹特别有用的幾項改進,包括:

 線上設定 複制的過濾規則 不再需要重新開機MySQL,隻需要停止SQL thread,修改完成以後,啟動SQL thread

 線上修改buffer pool的大小

 MySQL 5.7為了支援online buffer pool resize,引入chunk的概念,每個chunk預設是128M,當我們線上修改buffer pool的時候,以chunk為機關進行增長或收縮。這個參數的引入,對innodb_buffer_pool_size的配置有了一定的影響。innodb要求buffer pool size是innodb_buffer_pool_chunk_size* innodb_buffer_pool_instances的倍數,如果不是,将會适當調大innodb_buffer_pool_size,以滿足要求,是以,可能會出現buffer pool的實際配置設定比配置檔案中指定的size要大的情況

 Online DDL MySQL 5.7支援重命名索引和修改varchar的大小,這兩項操作在之前的版本中,都需要重建索引或表

   ALTER TABLE t1 ALGORITHM=INPLACE, CHANGE COLUMN c1 c1 VARCHAR(255);

 線上開啟GTID ,在之前的版本中,由于不支援線上開啟GTID,使用者如果希望将低版本的資料庫更新到支援GTID的資料庫版本,需要先關閉資料庫,再以GTID模式啟動,是以導緻更新起來特别麻煩。MySQL 5.7以後,這個問題不複存在

2.5 性能

 性能一直都是使用者最關心的問題,在MySQL每次新版本中,都會有不少性能提升。在MySQL 5.7中,性能相關的改進非常多,這裡僅介紹部分改進,包括臨時表相關的性能改進、隻讀事務的性能優化、連接配接建立速度的優化和複制性能的改進。

2.5.1 臨時表的性能改進

 MySQL 5.7 為了提高臨時表相關的性能,對臨時表相關的部分進行了大幅修改,包括引入新的臨時表空間;對于臨時表的DDL,不持久化相關表定義;對于臨時表的DML,不寫redo,關閉change buffer等。所有臨時表的改動,都基于以下兩個事實 :

1.臨時表隻在目前會話中可見

2.臨時表的生命周期是目前連接配接(MySQL當機或重新開機,則目前連接配接結束)

 也就是說,對于臨時表的操作,不需要其他資料一樣嚴格地進行一緻性保證。通過不持久化元資訊,避免寫redo等方式,減少臨時表操作的IO,以提高臨時表操作的性能。

2.5.2 隻讀事務性能改進

 衆所周知,在傳統的OLTP應用中,讀操作遠多于寫操作,并且,讀操作不會對資料庫進行修改,如果是非鎖定讀,讀操作也不需要進行加鎖。是以,對隻讀事務進行優化,是一個不錯的選擇。

 在MySQL 5.6中,已經對隻讀事務進行了許多優化。例如,将MySQL内部實作中的事務連結清單分為隻讀事務連結清單和普通事務連結清單,這樣在建立ReadView的時候,需要周遊事務連結清單長度就會小很多。

 在MySQL 5.7中,首先假設一個事務是一個隻讀事務,隻有在該事務發起了修改操作時,才會将其轉換為一個普通事務。MySQL 5.7通過 避免為隻讀事務配置設定事務ID ,不為隻讀事務配置設定復原段,減少鎖競争等多種方式,優化了隻讀事務的開銷,提高了資料庫的整體性能。

 2.5.3 加速連接配接處理

 在MySQL 5.7之前,變量的初始化操作(THD、VIO)都是在連接配接接收線程裡面完成的,現在将這些工作下發給工作線程,以減少連接配接接收線程的工作量,提高連接配接的處理速度。這個優化對那些頻繁建立短連接配接的應用,将會非常有用。

 2.5.4 複制性能的改進

 MySQL的複制延遲是一直被诟病的問題之一,欣喜的是,MySQL 5.7版本已經支援”真正”的并行複制功能。MySQL 5.7并行複制的思想簡單易懂,簡而言之,就是”一個組送出的事務都是可以并行回放的”,因為這些事務都已進入到事務的prepare階段,則說明事務之間沒有任何沖突(否則就不可能送出)。MySQL 5.7以後,複制延遲問題永不存在。

 這裡需要注意的是,為了相容MySQL 5.6基于庫的并行複制,5.7引入了新的變量slave-parallel-type,該變量可以配置成DATABASE(預設)或LOGICAL_CLOCK。可以看到,MySQL的預設配置是庫級别的并行複制,為了充分發揮MySQL 5.7的并行複制的功能,我們需要将slave-parallel-type配置成LOGICAL_CLOCK。

 3. 總結

 1.從本文中可以看到,MySQL 5.7确實帶來了很多激動人心的功能,我們甚至不需要進行任何修改,隻需要将業務遷移到MySQL 5.7上,就能帶來不少性能的提升。

 2.從本文中還可以看到,雖然MySQL 5.7在易用性上有了很多的改進,但是,也有不少需要注意的地方, 例如:1)在設定innodb的buffer pool時,需要注意chunk的存在,合理設定buffer pool instance否則可能出現實際配置設定的buffer pool size比預想的大很多的情況;2)多線程複制需要注意将slave_parallel_type設定為LOGICAL_CLOCK,否則,MySQL使用的是庫級别的并行複制,對于大多數應用,并沒有什麼效果。那麼, 怎樣才是使用MySQL 5.7的正确姿勢呢?網易蜂巢是一個不錯的選擇 ,網易蜂巢的RDS(Relational Database Service,簡稱RDS)項目是一種即開即用、穩定可靠、可彈性伸縮的線上資料庫服務。使用RDS提供的服務,就是使用已經調優過的資料庫,使用者不需要對資料庫參數進行任何修改,就能夠獲得一個性能極好的資料庫服務。

在這裡舉兩個典型案例,MySQL 5.6 和 MySQL 5.7 在初始化資料時候的安裝差異。

MySQL 5.6:初始化資料時需要進到家目錄的 script 目錄下

執行:

1

2

/usr/

local

/mysql/scripts/mysql_install_db 

--basedir=/usr/local/mysql/ 

--datadir=/data/mysql --defaults-file=/etc/my.cnf --user=mysql

此時資料庫密碼為空。

MySQL 5.7:初始化資料時需要進到家目錄的 bin 目錄下

/usr/

local

/mysql/bin/mysqld  

--user=mysql --datadir=/data/mysql 

--basedir=/usr/local/mysql/ --initialize

已然已經廢棄了使用 mysql_install_db 這個指令進行初始化資料的操作了。

繼續閱讀