在本章就開始在我們的環(huán)境上進行實際搭建,此次搭建參考以下幾個版本,并在其中介紹5.6與5.7的區(qū)別所在,應之前朋友們的要求,此處將8.0的安裝也一并進行演示安裝
Mysql5.6.34(Mysql穩(wěn)定版本)
Mysql5.7.20(Mysql穩(wěn)定版本)
Mysql8.0.15(官方最新GA版本)
安裝介紹
之前我們說過Mysql很輕量,那么Mysql的安裝就一定很簡單嗎?
?答:是的,很簡單,但是死板的安裝大家上網(wǎng)上找篇文章誰都能搭建出來,無非就是時間長短問題罷了,所以考慮到以后大家在生產(chǎn)環(huán)境上安裝,我們直接就將需要考慮到的準備工作做全,在安裝Mysql之前我們也需要對自己的環(huán)境進行優(yōu)化之后再進行安裝,這樣就像一個出生的嬰兒,他可以在一個溫暖家庭出生及生長,費話不多說,先看一下我的基礎環(huán)境(三個版本我是分三個虛機安裝,條件有限的朋友可以嘗試重復安裝)
機器1:
網(wǎng)絡:橋接OS:
CentOS7.4
CPU:4核
內(nèi)存:8G
磁盤:100G
機器2:網(wǎng)絡:橋接
OS:CentOS7.4
CPU:4核
內(nèi)存:8G
磁盤:100G
機器3:網(wǎng)絡:橋接
OS:CentOS7.4
CPU:4核
內(nèi)存:8G
磁盤:100G
環(huán)境準備
5.6、5.6、8.0的環(huán)境準備均是一樣的
1.網(wǎng)絡環(huán)境:因為我們目前是學習使用,所以可以將服務器的防火墻、selinux進行關閉,避免影響到我們學習時一些通訊問題,文件權(quán)限寫入問題等等,一般生產(chǎn)上selinux也是不開的,防火墻也是在硬件上進行維護,所以大家關閉即可,關閉方式如下:
CentOS7:
防火墻臨時關閉:systemctl stop firewalld
關閉防火墻開機自啟:systemctl disable firewalld
selinux臨時關閉:setenforce 0
selinux永久關閉:sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
只替換指定的 SELINUX=enforcing
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
CentOS6:
防火墻臨時關閉:service iptables stop
關閉防火墻開機自啟:chkconfig iptables off
selinux臨時關閉:setenforce 0
selinux永久關閉:sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selinux
建議大家將四部分全部執(zhí)行操作,不然服務可能還是處于開啟狀態(tài),如selinux 修改了配置文件并不會立即生效
Selinux簡單帶一下:防火墻的作用大家都清楚,是對外保護的服務,Selinux通俗的說其主要保護的是對Linux文件寫入、修改、刪除進行保護的,其有一套特定的規(guī)則可以進行配置,有興趣了解的朋友可以研究一下,現(xiàn)在生產(chǎn)上用的很少,所以也不用當作重點
2.CPU IO調(diào)度模型:IO調(diào)度模式對數(shù)據(jù)庫也至關重要,Mysql是通過CPU進行IO調(diào)度去磁盤獲取數(shù)據(jù),但IO調(diào)度也有適應的不同場景,比如SAS磁盤和固態(tài)盤的不同選擇,讓我們一起看下,
查看當前IO調(diào)度模式:[]內(nèi)為默認
[root@localhost /data/server]# cat /sys/block/sda/queue/scheduler
noop [deadline] cfq [root@localhost /data/server]#
1)cfg模式為比較通用的算法,保證所有任務盡量公平此模式會給進程任務分配一個請求隊列與時間片在此時間片內(nèi)由進程向設備文件進行請求,時間片消耗完后被掛起等待調(diào)度
2)deadline模式是在cfg的基礎上,確保了在一個截止時間內(nèi)服務請求,這個截止時間是可調(diào)整的而默認讀期限短于寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現(xiàn)象deadline是數(shù)據(jù)庫服務器IO模型的最好選擇 優(yōu)先處于讀請求 比較適合于SAS似機械磁盤
3)noop模式只有一個隊列,每當有新的請求進來會將其與最近請求進行合并設備文件此模式優(yōu)先寫而餓死讀操作,與deadline相點相反的意思此模式如果是機械磁盤極度不建議使用,如果是固態(tài)磁盤則可以
嘗試修改當前IO調(diào)度模式:
Centos7:grubby --update-kernel=ALL --args="elevator=deadline"
Centos6:vi /etc/grub.conf 尾行添加 elevator=deadline? ? ?
? echo deadline > /sys/block/sda/queue/scheduler
3.SWAP使用力度:SWAP是一個對操作系統(tǒng)內(nèi)存的保護機制,是磁盤上文件到內(nèi)存的映射,在內(nèi)存不足或內(nèi)存任務不活躍時操作系統(tǒng)會將這些任務喚出到SWAP中,以防止系統(tǒng)負載過高,導致操作系統(tǒng)直接掛起,操作系統(tǒng)就是你的大腦,大腦燒掉了,身上的零件就都沒啥用了,但過多使用SWAP就會降低數(shù)據(jù)庫的性能,因為其本身并不是內(nèi)存,所以我們?nèi)∫粋€權(quán)衡值,既保障有SWAP使用,但盡量不使用(如果你的公司不差錢,機器的性能都特別高,那可以直接將swap設置為0,主庫如果down機直接進行切換從庫,性能至上)
查看當前分配比例:
[root@localhost /data/server]# cat /proc/sys/vm/swappiness
30
[root@localhost /data/server]#
修改使用優(yōu)先級比例:
當前修改:echo 10 > /proc/sys/vm/swappiness
開機調(diào)用:echo -e "echo 10 > /proc/sys/vm/swappiness">> /etc/rc.d/rc.local
4.文件系統(tǒng):CentOS6的默認文件系統(tǒng)為ex4,7的默認為XFS,進行數(shù)據(jù)庫業(yè)務選擇時我們建議使用XFS,后續(xù)學到Mysql索引時會了解到Mysql是B+TREE的結(jié)構(gòu),而XFS也是這種存儲方式,與Mysql結(jié)合更好,并且此文件系統(tǒng)類型更穩(wěn)定
CentOS6格式化XFS需要操作如下:
1.yum install -y xfsprogs xfsdump
2.將文件系統(tǒng)格式化為xfs格式
5.系統(tǒng)參數(shù):Mysql本身就是為應用提供服務的,所以生產(chǎn)上會有大量的連接到Mysql上,并且并發(fā)進行文件數(shù)據(jù)讀取,而Linux本身為了防止并發(fā)進程過多導致系統(tǒng)崩潰,對進行參數(shù)進行了限制,我們直接進行修改即可
查看:ulimit-a
1.打開文件的句柄數(shù):open files(防止too many open files錯誤)
2.針對用戶數(shù)量限制:max user processes (防止單機多實例,連接數(shù)過多拒絕新連接)
修改:echo-e"*? soft? nproc? 65535\n*? hard? nproc? 65535\n*? soft? nofile? 65535\n*? hard? nofile? 65535\n" >> /etc/security/limits.conf
這個版本的沒有生效,
生效:退出當前終端重新登陸ulimit –a查看兩項參數(shù)是否已變更為65535
(自己運行版本)
為了防止以上兩種報錯情況,我們可以修改系統(tǒng)的軟硬限制。編輯 /etc/security/limits.conf 加入限制的相關內(nèi)容。
記得更改完內(nèi)容之后,需要重啟操作系統(tǒng)才能生效。
vi /etc/security/limits.conf
*? ? ? soft? ? nproc? 65535
*? ? ? hard? ? nproc? 65535
*? ? ? soft? ? nofile? 65535
*? ? ? hard? ? nofile? 65535
以上我們就完成了基礎環(huán)境準備,下面就一起開始進行Mysql安裝
Mysql5.6安裝
一、環(huán)境準備:
1.目錄創(chuàng)建:
mkdir -p /data/{software,mysql}? ? ? ? ?
mkdir -p /data/mysql/{data,log,tmp}
2.用戶創(chuàng)建:useradd mysql
3.安裝依賴包:yum install perl perl-devel perl-Data-Dumper libaio-devel -y
二、安裝:
1.下載包文件:cd /data/software/? ? ? ?
wget https://cdn.mysql.com/archives/mysql-5.6/mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz? ? ? ?
解壓
tar -zxvf mysql-5.6.34-linux-glibc2.5-x86_64.tar.gz? ? ? ?
mv mysql-5.6.34-linux-glibc2.5-x86_64 /usr/local/mysql
2.權(quán)限賦值:chown -R mysql:mysql /usr/local/mysql /data/mysql/*
三、配置文件: vi /etc/my.cnf
大家也可以在群里找我要文件發(fā)送給大家(后續(xù)我們一一講解參數(shù)的意義)
[client]
port? ? = 3306
socket? = /data/mysql/tmp/mysql.sock
[mysql]
prompt="\u@db \R:\m:\s [\d]> "
no-auto-rehash
[mysqld]
user? ? = mysql
port? ? = 3306
basedir = /usr/local/mysql
datadir = /data/mysql/data
socket? = /data/mysql/tmp/mysql.sock
pid-file = /data/mysql/tmp/mysql.pid
character-set-server=utf8
collation-server = utf8_general_ci
#skip-character-set-client-handshake=true
#init_connect='insert into auditlog.accesslog(ConnectionID,ConnUserName,PrivMatchName,LoginTime) values(connection_id(),user(),current_user(),now());'
skip_name_resolve=1
event_scheduler = on
sql_mode='NO_UNSIGNED_SUBTRACTION,NO_ENGINE_SUBSTITUTION'
open_files_limit = 65535
innodb_open_files = 65535
back_log=1024
max_connections = 512
max_connect_errors=1000000
interactive_timeout=300
wait_timeout=300
max_allowed_packet = 1024M
table_open_cache=2048
table_definition_cache=2048
table_open_cache_instances = 32
thread_cache_size = 128
thread_stack = 512K
external-locking = FALSE
max_tmp_tables=200
tmp_table_size=100M
max_heap_table_size=100G
explicit_defaults_for_timestamp = 1
lock_wait_timeout = 3600
auto_increment_increment = 1
auto_increment_offset = 1
autocommit = ON
secure_file_priv=''
read_only = OFF
lower_case_table_names=1
innodb_fast_shutdown = 0
innodb_force_recovery=0
innodb_buffer_pool_dump_at_shutdown = 1
innodb_buffer_pool_load_at_startup = 1
log-error=/data/mysql/log/error.log
slow_query_log=ON
slow_query_log_file=/data/mysql/log/slow_mysql.log
long_query_time=2
innodb_flush_log_at_trx_commit=1
innodb_log_file_size =1G
innodb_log_files_in_group=3
innodb_log_group_home_dir=./
sync_binlog = 1?
binlog_cache_size = 16M
max_binlog_cache_size = 1G
max_binlog_size=1G
expire_logs_days = 30
default-storage-engine = INNODB
#internal_tmp_disk_storage_engine = INNODB
transaction_isolation=REPEATABLE-READ
innodb_max_dirty_pages_pct = 50
innodb_adaptive_flushing = ON
innodb_flush_method = O_DIRECT
sort_buffer_size=8M
join_buffer_size=8M
query_cache_size=0
query_cache_type=0
read_buffer_size = 8M
optimizer_switch="index_condition_pushdown=on,mrr=on,mrr_cost_based=on,batched_key_access=off,block_nested_loop=on"
read_rnd_buffer_size = 8M
innodb_old_blocks_pct=35
#innodb_additional_mem_pool_size= 128M
innodb_buffer_pool_size= 1G
innodb_buffer_pool_instances = 16
innodb_log_buffer_size =32M
bulk_insert_buffer_size=128M
innodb_change_buffer_max_size = 50
innodb_doublewrite=on
innodb_adaptive_hash_index = on
innodb_file_per_table =1
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_page_size = 16k
#innodb_checksum_algorithm =crc32?
innodb_lock_wait_timeout = 35
innodb_rollback_on_timeout = on
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
innodb_lru_scan_depth = 4000
innodb_thread_concurrency = 0
innodb_write_io_threads = 2
innodb_read_io_threads = 2
innodb_purge_threads = 2
innodb_io_capacity = 800
innodb_io_capacity_max = 1600
server-id = 3306110
log-bin= /data/mysql/log/binlog-mysql
binlog_format=row
四、初始化Mysql
1.查看初始化使用幫助:/usr/local/mysql/scripts/mysql_install_db --help
2.初始化當前Mysql:
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql/data --defaults-file=/etc/my.cnf --user=mysql
4.查看初始化后數(shù)據(jù)庫文件:ls /data/mysql/data/
如果包括mysql、information_schema、test目錄即可以視為初始化成功
[root@localhost data]# ls
ib_buffer_pool? ibdata1? ib_logfile0? ib_logfile1? ib_logfile2? mysql? test? undo001? undo002? undo003
5.最后我們啟動mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
6.修改密碼:/usr/local/mysql/bin/mysqladmin -u root password '123456'
登錄測試
/usr/local/mysql/bin/mysql -uroot -p
我們看一下圖示內(nèi)容:正常初始化后會出現(xiàn)兩個OK的提示,并提示我們使用mysqladmin命令進行密碼的初次配置,最后使用mysqld_safe方式啟動Mysql,我們在啟動時手工指定了配置文件的位置,其實也可以不用指定,但你需要知道Mysql找尋配置文件時的順序,如下:
/etc/my.cnf
/etc/mysql/my.cnf
/usr/local/mysql/etc/my.cnf
Mysql5.7安裝
Mysql5.7的安裝與5.6的安裝方式基本一致,不同的地方在于初始化部分,我們來看一下不同的地方
5.7初始化Mysql:
初始化操作:/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize
查看隨機密碼:可以看到我們的初始密碼為 "Eiv*/Dy!I44t"
[root@localhost data]# cat /data/mysql/log/error.log? | grep password
2019-02-21T10:45:24.067928Z 1 [Note] A temporary password is generated for root@localhost: Eiv*/Dy!I44t
5.啟動mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &
修改密碼
/usr/local/mysql/bin/mysqladmin -uroot -p password
登錄測試
/usr/local/mysql/bin/mysql -uroot -p
5.6與5.7區(qū)別總結(jié):此處僅介紹初始化后的不同,更多特性上的不同后續(xù)我們進行講解
Mysql5.6:
1.初始化命令為mysql_install_db,初始化之后會由我們自己來進行密碼的初次修改
2.數(shù)據(jù)目錄下包含mysql information_schema test performache_schema四個數(shù)據(jù)庫
Mysq.5.7:
1.初始化命令為mysqld,并多了一個initialize參數(shù)初始化之后默認會生成一個隨機密碼至error.log文件中后續(xù)我們使用這個密碼進行二次修改這個密碼只是Mysql提供給我們初次使用的登陸之后會提示我們密碼過期問題所以我們一般在初始化之后直接對密碼進行二次修改使用如下命令:
/usr/local/mysql/bin/mysqladmin -uroot -p password
輸入剛剛的隨機密碼,再輸入兩次你需要的密碼即可2.數(shù)據(jù)目錄下包含mysql information_schema sys performache_schema四個數(shù)據(jù)庫
5.7初始化參數(shù)介紹:
initialize參數(shù):當我們添加這個參數(shù)時Mysql會默認幫我們生成一個隨機密碼到error.log文件內(nèi)
initialize-insecure:如果我們在5.7初始化時指定這個參數(shù),那么此時會和5.6初始化后結(jié)果相同,不會為我們生成隨機密碼由用戶進行第一次的密碼配置
Mysql8.0安裝
一、環(huán)境準備:1.目錄創(chuàng)建:mkdir -p /data/{software,mysql}?
? ? ? ? ? ? ? ? ? mkdir -p /data/mysql/{data,log,tmp}
2.用戶創(chuàng)建:useradd mysql
3.安裝依賴包:yum install perl perl-devel perl-Data-Dumper libaio-devel -y
二、安裝:1.下載包文件:cd /data/software/? ? ? ?
wget https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz? ? ? ?
xz -d mysql-8.0.15-linux-glibc2.12-x86_64.tar.xz? ? ? ?
tar -xvf mysql-8.0.15-linux-glibc2.12-x86_64.tar? ? ? ?
mv mysql-8.0.15-linux-glibc2.12-x86_64 /usr/local/mysql
2.權(quán)限賦值:chown -R mysql:mysql /usr/local/mysql /data/mysql/*
三、配置文件: vi /etc/my.cnf
大家可以繼續(xù)使用上面的配置文件內(nèi)容但需要將部分參數(shù)進行刪減,因為有部分特性至Mysql8.0已經(jīng)徹底廢棄了,如下:
max_tmp_tables=200
query_cache_size=0
query_cache_type=0
后續(xù)講解8.0新特性時我們會添加一些新的配置參數(shù)
四、初始化
/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize
查看初始化后數(shù)據(jù)庫文件:ls /data/mysql/data/ 包括
[root@localhost data]# ls
auto.cnf? ? ca.pem? ? ? ? ? client-key.pem? ibdata1? ? ? ib_logfile1? ibtmp1? ? ? ? mysql? ? ? performance_schema? public_key.pem? server-key.pem? undo_001ca-key.pem? client-cert.pem? ib_buffer_pool? ib_logfile0? ib_logfile2? #innodb_temp? mysql.ibd? private_key.pem? ? server-cert.pem? sys? ? ? ? ? ? undo_002[root@localhost data]#
五、最后我們啟動mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf&
查看隨機密碼:可以看到我們的初始密碼為 "nekpGErvF9*i"
[root@localhost data]# cat /data/mysql/log/error.log? | grep password
修改密碼
/usr/local/mysql/bin/mysqladmin -uroot -p password
六、登入Mysql:
[root@localhost log]# /usr/local/mysql/bin/mysql -uroot -p
Enter password:
Welcome to the MySQL monitor.? Commands end with ; or \g.Your MySQL connection id is9Server version: 8.0.15 MySQL Community Server - GPLCopyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respectiveowners.Type 'help;'or'\h'for help. Type '\c' to clear the current input statement.root@db 10:36:? [(none)]>
關閉數(shù)據(jù)庫命令
cd /usr/local/mysql/bin
./mysqladmin -uroot -p123456 shutdown
Mysql密碼重置
至此,Mysql的安裝我們學習完成了,那安裝完成之后如果我們不小心把error.log文件搞丟了那就查看不到password信息了,或者二次進行修改密碼時輸入問題導致密碼登陸不上了,那應該怎么辦,此時我們也可以使用如下的方式進行密碼重置,操作很簡單,思路是將Mysql的密碼權(quán)限表跳過,直接可以不用家門鑰匙就能進到家門里面了,而且可以為所欲為,這時我們就可以去家里找到我們的鑰匙,或者把鑰匙和鎖都換一把,我們來實際操作一下
注:生產(chǎn)中可能我們不會進行此操作,密碼都會由DBA或DBA經(jīng)理進行嚴格保管,基本沒有丟失情況發(fā)生,并且一般業(yè)務都是禁止停庫操作的,但萬事也不能保證100% 如果在維護中不夠規(guī)范導致密碼丟失時,可以選擇性進行密碼重置
1)關閉Mysql:killall mysqld? 或? ps aux | grep mysql | grep -v grep |awk '{print $2}' |xargs kill -9 (不建議使用此類方式停止Mysql,但目前為非常情況因為沒有Mysql密碼,所以不能使用mysqladmin shutdown的正常關庫方式關閉Mysql)
2)使用跳過密碼權(quán)限表的方式啟動Mysql:/usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables &參數(shù):--skip-grant-tables是跳過了mysql.user表的權(quán)限驗證信息,讓我們可以直接進入Mysql進行數(shù)據(jù)庫操作
3)登陸:mysql (敲mysql命令就直接可以登入了)
4)查看用戶:select user,host from mysql.user;(查看一下我們需要修改的用戶信息)
5)修改密碼:(Mysql的權(quán)限我們后續(xù)會再次進行講解,先了解一下是由用戶%主機+密碼方式驗證的)update mysql.user set authentication_string=PASSWORD('new-password') where user='root'and host='localhost';注意:此處我們使用的版本是5.7,以前版本使用如下命令,5.7之后密碼的存儲字段發(fā)生了變化:update mysql.user set password=PASSWORD('new-password') where user='root'and host='localhost';
6)刷新權(quán)限:flush privileges;(Mysql修改user表后不會立即生效,需要執(zhí)行此命令進行權(quán)限的刷新)
7)重啟Mysql:
1.關閉Mysql:killall mysqld? 或? ps aux | grep mysql | grep -v grep |awk '{print $2}' |xargs kill -9
2.啟動Mysql:/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my.cnf &