1、MySQL 曆史簡介
1999年至 2000 年,Monty 成立了MySQL AB 這個公司。 2000 年,MySQL 公布了自己的源代碼,并采用了 GPL 許可協定,正式進入開源的世界,這讓 MySQL 迅速發展。2005 年 10 月 MySQL 釋出了一個裡程碑式的版本 MySQL 5.0 。
MySQL 5.0版本加入了很多新特性,包括存儲過程、伺服器遊标、觸發器、視圖、分布式事務、查詢優化器等,5.0 也奠定了高性能資料庫的基礎。 2008 年 1 月 16 日 Sun 公司用10億美元收購了 MySQL, 在一年多後的時間裡 MySQL 開源資料庫又被閉源的 Oracle 公司收購,Oracle 于 2009 年 4 月 20 日以每股 9.5 美元的價格收購Sun,交易總價值約為 74 億美元。從此,MySQL 變成了 Oracle 旗下的産品。
MySQL在2016年 9 月 12 日釋出了 8.0 版本,标志着一個新的裡程碑,在 2019 年 2 月 1 日釋出了 8.0.15 版本,兩年多的時間裡又出了 8.0 的十幾個版本,如下圖所示。

2、MySQL 5.7 下載下傳
今天主要講解的是 Linux 系統下 MySQL5.7 的安裝,8.0 不再本次的範圍内。
打開浏覽器輸入以下網址:
https://dev.mysql.com/downloads/mysql/5.7.html
找到 MySQL Community Server 5.7 點選進入。
選擇正确的系統和版本,選擇下載下傳,如下圖。
這裡需要 Oracle SSO 賬号登陸才可下載下傳,有賬号的登陸就可以直接下載下傳了,沒有的也可以去注冊,但是下載下傳速度不是很快,這裡我已經下載下傳好了 Windows 和 Linux 版本 ,本公衆号背景回複【MySQL下載下傳】即可擷取,還有超詳細的 Windows 下安裝教程。
賬号登陸之後,第一次需填寫如下調查,填寫後可直接下載下傳了。
選擇儲存檔案的位置,等待下載下傳。
下載下傳完之後,由于伺服器一般都屬于内網環境,無法上網,則通過 SFTP 上傳至伺服器 /opt 目錄,然後檢驗 MD5 值,保證軟體下載下傳過程中沒有損壞,可正常使用,下圖中檢驗出來的 MD5 值與上圖下載下傳中的一緻,說明軟體可正常使用。
3、MySQL 5.7 安裝
3.1 首先安裝前要進行環境檢測
為了能夠很順利的安裝軟體,環境檢測是必不可少的一項,安裝大型資料庫 Oracle 時也是需要對作業系統進行檢測的,以便能夠更好的去安裝軟體。
(1)需要關閉 SELINUX 和 作業系統防火牆 iptables
設定 selinux 為 disable 并重新開機作業系統;用 chkconfig iptables off 指令關閉防火牆,如下圖所示。
(2)IO排程預設為 cfq 模式,牆裂建議使用 deadline 模式。
使用如下指令檢視IO排程是否為 cfq 模式
cat /sys/block/sda/queue/scheduler
在 /etc/grub.conf 檔案中添加一行:
elevator=deadline
(3)swap 分區設定
swappiness 的大小直接影響 swap 分區,它有兩個極端值 0 和100,0 代表着最大限度地使用實體記憶體,然後才會使用 swap 分區,這樣會導緻記憶體的溢出 OOM 的錯誤。設定成 100 是積極的使用 swap 分區,把記憶體上的資料及時搬家到 swap 分區裡,這也不推薦。使用如下指令可檢視。
[root@rhel67 opt]# cat /proc/sys/vm/swappiness
若此值不是 60 牆裂建議 使用vi /etc/sysctl.conf 檔案,加入 vm.swappiness = 60 即可。修改之前建議先備份此檔案,然後重新開機作業系統。
(4)檔案系統的選擇
這裡建議大家使用 xfs 檔案系統,相比 ext4 它管理更友善,支援動态擴容,删除檔案也很友善。XFS 檔案系統是擴充檔案系統 (extent file system)的一個擴充。XFS 是64 位高性能日志檔案系統。對 XFS 的支援大概在 2002年合并到了 Linux 核心,到了 2009 年,紅帽企業版 Linux 5.4 也支援了 XFS 檔案系統。對于 64 位檔案系統,XFS 支援最大檔案系統大小為 8 exbibytes。XFS 檔案系統有一些缺陷,例如它不能壓縮,删除大量檔案時性能低下。目前RHEL 7.0 檔案系統預設使用 XFS。
(5)作業系統的限制
資源限制裡主要看 open files 和 max user processes 這兩個參數,當 open files 設定不合理時,而目前伺服器的連接配接過多或者表過多時,就會有可能出現打不開表或者通路不了表的現象,預設情況下最大的句柄數為 1024 個,表示單個程序最多可以通路 1024 個檔案句柄。如果超過預設值就會出現檔案句柄超過限制的錯誤 “ too many open files”.
max user processes 最大會話連接配接,當作業系統有多個執行個體時,但發現連接配接不了,報錯為“resource temporarily unaviable”的錯誤,則表示沒有足夠的資源。
當出現這樣的問題就需要修改系統的軟硬資源限制,備份檔案後編輯如下檔案并重新開機作業系統。
vi /etc/security/limits.conf
(6)numa 需要關閉
numa 是一種關于多個cpu 如何通路記憶體的架構模型,現在的 cpu 基本都是numa 架構,Linux 核心2.5 開始支援 numa。numa 架構簡單點兒說就是,一個實體 cpu(一般包含多個邏輯 cpu 或者說多個核心)構成一個 node,這個 node 不僅包括cpu,還包括一組記憶體插槽,也就是說一個實體 cpu 以及一塊記憶體構成了一個 node。
關閉 numa 功能,可以更好的配置設定記憶體,不需要采用 swap 的方式來擷取記憶體,有經驗的 DBA 知道使用 swap 導緻的資料庫性能下降有多麼的惡心,關閉方法也分在 BIOS、作業系統中關閉,或者是在資料庫啟動過程中關閉。
numa --interleave=all /usr/local/mysql/bin/mysqld_safe-defaults-file=/etc/my.cnf &
3.2 建立使用者群組等
[root@rhel67 ~]# groupadd mysql
[root@rhel67 ~]# useradd-g mysql mysql -s /sbin/nologin
移動軟體至 /usr/local 目錄,并解壓軟體。
[root@rhel67 local]# mv/opt/mysql-5.7.25-linux-glibc2.12-x86_64.tar.gz /usr/local/
[root@rhel67 local]# tar -zxvfmysql-5.7.25-linux-glibc2.12-x86_64.tar.gz
做一個軟連結友善管理與更新,并授權目錄
[root@rhel67 local]# ln -smysql-5.7.25-linux-glibc2.12-x86_64 mysql
[root@rhel67 local]# chown -R mysql:mysql mysql
[root@rhel67 local]# chmod -R 775 mysql
3.3 建立資料庫目錄并授權
[root@rhel67 opt]# mkdir -p /opt/mysql/
[root@rhel67opt]# chown -R mysql:mysql /opt/mysql
3.4 參數編輯
由于是二進制檔案安裝,資料庫參數檔案需要自己配置,以下内容可複制,很多參數均是生産環境中實踐而來的,後期在說明參數的意義。
vim /etc/my.cnf
[client]
port = 3306
default-character-set=utf8
socket=/tmp/mysql.sock
[mysql]
prompt="\u@db \R:\m:\s [\d] "
no-auto-rehash
[mysqld]
user = mysql
port = 3306
basedir = /usr/local/mysql
datadir =/opt/mysql
socket= /tmp/mysql.sock
character-set-server = utf8mb4
skip_name_resolve = 1
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 100000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet =32M
sort_buffer_size =4M
join_buffer_size =4M
thread_cache_size = 768
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /opt/mysql/slow.log
log-error = /opt/mysql/error.log
long_query_time = 0.5
server-id = 3306100
log-bin =/opt/mysql/mysql-binlog
sync_binlog =1
binlog_cache_size = 4M
max_binlog_cache_size = 128M
max_binlog_size = 1024M
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge =1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops =100
innodb_spin_wait_delay = 30
transaction_isolation =REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup=1 innodb_buffer_pool_dump_at_shutdown =1
innodb_data_file_path = ibdatal:1G:autoextend #innodb_flush_1og_at_trx_commit =1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
innodb_status_file = 1
innodb_status_output = 0
innodb_status_output_locks = 0
#performance_schema
performance_schema=1
performance_schema_instrument = '%=on'
#innodb monitor
innodb_monitor_enable = "module_innodb"
innodb_monitor_enable = "module_innodb"
innodb_monitor_enable = "module_server"
innodb_monitor_enable = "module_dml"
innodb_monitor_enable = "module_ddl"
#innodk_monitor_enable = "module_trx"
innodb_monitor_enable = "module_os"
innodk_monitor_enable = "module_purge"
innodb_monitor_enable = "module_log"
innodb_monitor_enable = "module_lock"
innodb_monitor_enable = "module_buffer"
innodb_monitor_enable = "module_index"
innodb_monitor_enable = "module_ibuf_system"
innodb_monitor_enable = "module_buffer_page"
innodb_monitor_enable = "module_adaptive_hash"
[mysqldump]
quick
max_allowed_packet = 32M
[root@rhel67 ~]# chown -R mysql:mysql/usr/local/mysql
[root@rhel67 ~]# chown -R mysql:mysql /opt/mysql
3.5 初始化資料庫
使用mysqld 指令初始化資料庫
[root@rhel67 ~]# cd /usr/local/mysql/bin
[root@rhel67 bin]# /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir =/usr/local/mysql --datadir=/opt/mysql --user=mysql --initialize
[root@rhel67 bin]#
初始化後需檢視 /opt/mysql/error.log ,無關鍵錯誤即可。
注意:若出現如下錯誤,需要删除 /opt/mysql/ 目錄下的内容,重新初始化。
3.6 啟動資料庫并設定密碼
[root@rhel67 bin]# pwd /usr/local/mysql/bin
[root@rhel67bin]#
[root@rhel67 bin]# ./mysqld_safe --defaults-file=/etc/my.cnf &
[1]14163
[root@rhel67 bin]# 2017-10-29T18:11:58.775800Z mysqld_safe Logging to'/opt/mysql/error.log'. 2017-10-29T18:11:58.833798Z mysqld_safe Starting mysqlddaemon with databases from /opt/mysql
當資料庫啟動成功後,進入資料庫的初始化密碼會在/opt/mysql/error.log裡面,使用下面指令即可檢視密碼:
cat /opt/mysql/error.log | grep password
找到密碼,使用如下指令登陸 MySQL 并設定密碼為 root 且永不過期。
./mysql -u root -p set password ='root';
alter user 'root'@'localhost' password expire never;
flush privileges;
3.7 優化連接配接
每次登陸 MySQL時都要進入到 MySQL 的目錄下,有點麻煩,于是編輯 /etc/profile 定義一個别名,直接登入即可。使用指令如下:
vi /etc/profile
aliasmysql='/usr/local/mysql/bin/mysql'
source /etc/profile
如上,MySQL5.7 算是安裝完畢,可以正常使用了,這裡簡單說明一下環境:OS: RHEL6.7 64 bit,之前安裝過 Oracle 11.2.0.4,其他基本上沒有差別,需要 Windows 版本的 MySQL5.7.25 資料庫安裝包,本公衆号【JiekeXu_IT】背景回複【MySQL下載下傳】即可擷取,還有超詳細的 Windows 下安裝教程和軟體,關注本公衆号即可獲得 Oracle 和 MySQL 資料庫入門、進階、精通視訊資料,還有更多視訊資料趕快行動吧!