1.入門篇:安裝使用Mysql及版本區別(5.6 5.7)
回顧
各位朋友好,很高興又和大家見面,經過上一章的學習,我們簡單的認識了一下Mysql,學習了Mysql的發展歷程,Mysql的分支公司,Mysql的優勢所在及簡單解剖了Mysql的組成部分。
按照上章節安裝完成所需環境之后(如果是初學Linux的同學在安裝操作系統上有什么疑問可以直接將問題發送至我的郵箱,聯系小助手微信:cto51boke 獲取),在本章就開始在我們的環境上進行實際搭建,此次搭建參考以下幾個版本,並在其中介紹5.6與5.7的區別所在,應之前朋友們的要求,此處將8.0的安裝也一並進行演示安裝
Mysql5.6.34(Mysql穩定版本) Mysql5.7.20(Mysql穩定版本) Mysql8.0.15(官方最新GA版本)
下載地址:
鏈接:https://pan.baidu.com/s/1_GttW_Bm6nfs4ADK0abgvA
提取碼:tf6c
安裝介紹
之前我們說過Mysql很輕量,那么Mysql的安裝就一定很簡單嗎? 答:是的,很簡單,但是死板的安裝大家上網上找篇文章誰都能搭建出來,無非就是時間長短問題罷了,所以考慮到以后大家在生產環境上安裝,我們直接就將需要考慮到的准備工作做全,在安裝Mysql之前我們也需要對自己的環境進行優化之后再進行安裝,這樣就像一個出生的嬰兒,他可以在一個溫暖家庭出生及生長,費話不多說,先看一下我的基礎環境(三個版本我是分三個虛機安裝,條件有限的朋友可以嘗試重復安裝)
機器1:
網絡:橋接
OS:CentOS7.4 CPU:4核 內存:8G 磁盤:100G 機器2: 網絡:橋接 OS:CentOS7.4 CPU:4核 內存:8G 磁盤:100G 機器3: 網絡:橋接 OS:CentOS7.4 CPU:4核 內存:8G 磁盤:100G
環境准備
5.6、5.6、8.0的環境准備均是一樣的
1.網絡環境:因為我們目前是學習使用,所以可以將服務器的防火牆、selinux進行關閉,避免影響到我們學習時一些通訊問題,文件權限寫入問題等等,一般生產上selinux也是不開的,防火牆也是在硬件上進行維護,所以大家關閉即可,關閉方式如下:
CentOS7:
防火牆臨時關閉:systemctl stop firewalld 關閉防火牆開機自啟:systemctl disable firewalld selinux臨時關閉:setenforce 0 selinux永久關閉:sed -i 's/SELINUX=.*/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
建議大家將四部分全部執行操作,不然服務可能還是處於開啟狀態,如selinux 修改了配置文件並不會立即生效
Selinux簡單帶一下:防火牆的作用大家都清楚,是對外保護的服務,Selinux通俗的說其主要保護的是對Linux文件寫入、修改、刪除進行保護的,其有一套特定的規則可以進行配置,有興趣了解的朋友可以研究一下,現在生產上用的很少,所以也不用當作重點
2.CPU IO調度模型:IO調度模式對數據庫也至關重要,Mysql是通過CPU進行IO調度去磁盤獲取數據,但IO調度也有適應的不同場景,比如SAS磁盤和固態盤的不同選擇,讓我們一起看下,
查看當前IO調度模式:[]內為默認
[root@localhost /data/server]# cat /sys/block/sda/queue/scheduler noop [deadline] cfq [root@localhost /data/server]# 1)cfg模式為比較通用的算法,保證所有任務盡量公平 此模式會給進程任務分配一個請求隊列與時間片 在此時間片內由進程向設備文件進行請求,時間片消耗完后被掛起等待調度 2)deadline模式是在cfg的基礎上,確保了在一個截止時間內服務請求,這個截止時間是可調整的 而默認讀期限短於寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象 deadline是數據庫服務器IO模型的最好選擇 優先處於讀請求 比較適合於SAS似機械磁盤 3)noop模式只有一個隊列,每當有新的請求進來會將其與最近請求進行合並設備文件 此模式優先寫而餓死讀操作,與deadline相點相反的意思 此模式如果是機械磁盤極度不建議使用,如果是固態磁盤則可以嘗試 修改當前IO調度模式: 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是一個對操作系統內存的保護機制,是磁盤上文件到內存的映射,在內存不足或內存任務不活躍時操作系統會將這些任務喚出到SWAP中,以防止系統負載過高,導致操作系統直接掛起,操作系統就是你的大腦,大腦燒掉了,身上的零件就都沒啥用了,但過多使用SWAP就會降低數據庫的性能,因為其本身並不是內存,所以我們取一個權衡值,既保障有SWAP使用,但盡量不使用(如果你的公司不差錢,機器的性能都特別高,那可以直接將swap設置為0,主庫如果down機直接進行切換從庫,性能至上)
查看當前分配比例:
[root@localhost /data/server]# cat /proc/sys/vm/swappiness 30 [root@localhost /data/server]# 修改使用優先級比例: 當前修改:echo 10 > /proc/sys/vm/swappiness 開機調用:echo -e "echo 10 > /proc/sys/vm/swappiness" >> /etc/rc.d/rc.local
4.文件系統:CentOS6的默認文件系統為ex4,7的默認為XFS,進行數據庫業務選擇時我們建議使用XFS,后續學到Mysql索引時會了解到Mysql是B+TREE的結構,而XFS也是這種存儲方式,與Mysql結合更好,並且此文件系統類型更穩定
CentOS6格式化XFS需要操作如下: 1.yum install -y xfsprogs xfsdump 2.將文件系統格式化為xfs格式
5.系統參數:Mysql本身就是為應用提供服務的,所以生產上會有大量的連接到Mysql上,並且並發進行文件數據讀取,而Linux本身為了防止並發進程過多導致系統崩潰,對進行參數進行了限制,我們直接進行修改即可
查看:ulimit -a 1.打開文件的句柄數:open files(防止too many open files錯誤) 2.針對用戶數量限制:max user processes (防止單機多實例,連接數過多拒絕新連接) 修改: echo -e "* soft nproc 65535\n* hard nproc 65535\n* soft nofile 65535\n* hard nofile 65535\n" >> /etc/security/limits.conf 生效:退出當前終端重新登陸ulimit –a查看兩項參數是否已變更為65535
以上我們就完成了基礎環境准備,下面就一起開始進行Mysql安裝
Mysql5.6安裝
一、環境准備:
1.目錄創建:mkdir -p /data/{software,mysql}
mkdir -p /data/mysql/{data,log,tmp}
2.用戶創建: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.權限賦值:chown -R mysql:mysql /usr/local/mysql /data/mysql/*
三、配置文件: vi /etc/my.cnf
大家也可以在群里找我要文件發送給大家(后續我們一一講解參數的意義)
[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 3.初始化完成后會提示你修改密碼:/usr/local/mysql/bin/mysqladmin -u root password '123456' 4.查看初始化后數據庫文件: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 &
我們看一下圖示內容:正常初始化后會出現兩個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 &
5.6與5.7區別總結:此處僅介紹初始化后的不同,更多特性上的不同后續我們進行講解
Mysql5.6:
1.初始化命令為mysql_install_db,初始化之后會由我們自己來進行密碼的初次修改
2.數據目錄下包含mysql information_schema test performache_schema四個數據庫 Mysq.5.7: 1.初始化命令為mysqld,並多了一個initialize參數 初始化之后默認會生成一個隨機密碼至error.log文件中 后續我們使用這個密碼進行二次修改 這個密碼只是Mysql提供給我們初次使用的 登陸之后會提示我們密碼過期問題 所以我們一般在初始化之后直接對密碼進行二次修改使用如下命令: /usr/local/mysql/bin/mysqladmin -uroot -p password 輸入剛剛的隨機密碼,再輸入兩次你需要的密碼即可 2.數據目錄下包含mysql information_schema sys performache_schema四個數據庫
5.7初始化參數介紹: initialize參數:當我們添加這個參數時Mysql會默認幫我們生成一個隨機密碼到error.log文件內 initialize-insecure:如果我們在5.7初始化時指定這個參數,那么此時會和5.6初始化后結果相同,不會為我們生成隨機密碼由用戶進行第一次的密碼配置
Mysql8.0安裝
一、環境准備:
1.目錄創建:mkdir -p /data/{software,mysql} mkdir -p /data/mysql/{data,log,tmp} 2.用戶創建: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.權限賦值:chown -R mysql:mysql /usr/local/mysql /data/mysql/* 三、配置文件: vi /etc/my.cnf 大家可以繼續使用上面的配置文件內容 但需要將部分參數進行刪減,因為有部分特性至Mysql8.0已經徹底廢棄了,如下: max_tmp_tables=200 query_cache_size=0 query_cache_type=0 后續講解8.0新特性時我們會添加一些新的配置參數 四、初始化 /usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --basedir=/usr/local/mysql --datadir=/data/mysql/data --user=mysql --initialize 查看初始化后數據庫文件: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_001 ca-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 & 六、登入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 is 9 Server version: 8.0.15 MySQL Community Server - GPL Copyright (c) 2000, 2019, 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. root@db 10:36: [(none)]>
Mysql密碼重置
至此,Mysql的安裝我們學習完成了,那安裝完成之后如果我們不小心把error.log文件搞丟了那就查看不到password信息了,或者二次進行修改密碼時輸入問題導致密碼登陸不上了,那應該怎么辦,此時我們也可以使用如下的方式進行密碼重置,操作很簡單,思路是將Mysql的密碼權限表跳過,直接可以不用家門鑰匙就能進到家門里面了,而且可以為所欲為,這時我們就可以去家里找到我們的鑰匙,或者把鑰匙和鎖都換一把,我們來實際操作一下
注:生產中可能我們不會進行此操作,密碼都會由DBA或DBA經理進行嚴格保管,基本沒有丟失情況發生,並且一般業務都是禁止停庫操作的,但萬事也不能保證100% 如果在維護中不夠規范導致密碼丟失時,可以選擇性進行密碼重置
1)關閉Mysql:killall mysqld 或 ps aux | grep mysql | grep -v grep |awk '{print $2}' |xargs kill -9 (不建議使用此類方式停止Mysql,但目前為非常情況因為沒有Mysql密碼,所以不能使用mysqladmin shutdown的正常關庫方式關閉Mysql) 2)使用跳過密碼權限表的方式啟動Mysql: /usr/local/mysql/bin/mysqld_safe –defaults-file=/etc/my.cnf –skip-grant-tables & 參數:--skip-grant-tables是跳過了mysql.user表的權限驗證信息,讓我們可以直接進入Mysql進行數據庫操作 3)登陸:mysql (敲mysql命令就直接可以登入了) 4)查看用戶:select user,host from mysql.user;(查看一下我們需要修改的用戶信息) 5)修改密碼:(Mysql的權限我們后續會再次進行講解,先了解一下是由用戶%主機+密碼方式驗證的) update mysql.user set authentication_string=PASSWORD('new-password') where user='root' and host='localhost'; 注意:此處我們使用的版本是5.7,以前版本使用如下命令,5.7之后密碼的存儲字段發生了變化: update mysql.user set password=PASSWORD('new-password') where user='root' and host='localhost'; 6)刷新權限:flush privileges;(Mysql修改user表后不會立即生效,需要執行此命令進行權限的刷新) 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 &
小結
在本章中我們學習了Mysql5.6、Mysql5.7、Mysql8.0每個版本的安裝過程,並介紹了在安裝Mysql之前我們應該先對操作系統進行優化的知識點,同時若在工作中或練習中忘記了root的密碼應該怎么進行處理,建議大家在練習時一定要進行反復練習,並且在前期學習最好是手敲方式練習,不要復制粘貼,這樣效率雖然高,但是我們現在是學習階段,不要追求快,多敲幾遍這樣才記得牢固,包括后面一些知識點學習中遇到問題可以有一個處理思路,Mysql的安裝其實很簡單,一共就分為5部分,很多的應用服務也基本都可以總結為這5部分:環境准備、安裝、配置、初始化、啟動,在安裝過程中如果遇到問題先去檢查一下自己的操作是否是按照老師的操作過程來的,然后再去檢查一下自己的環境是不是有問題,多去思考動腦,在下章中我們就開始學習Mysql.user這張表,以及其他一些針對權限方面的控制,權限控制在生產環境中是必然的,如果控制不好用戶及開發人員的權限,那出了問題就是你DBA的問題,同時會介紹一些8.0中帶入的新特性,我們下章再會!