總結一下,mysql的安裝,
1.在官網上下載一個***.tar.gz的壓縮包(已經編譯好的),解壓到指定位置,然后 把這個位置和/usr/local/mysql 做一個軟連接(ln -s [mysql實際目錄] /usr/local/mysql)
2.添加/usr/local/mysql 的一些用戶和用戶組權限 (之后一切安裝和配置的路徑將圍繞/usr/local/mysql進行)
3.進行初始化命令 ./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize (會顯示初始密碼)
4.新建/etc/my.cnf配置文件
5.啟動mysql進入mysql,改密碼訪問權限等.
一、安裝包下載
下載地址:https://dev.mysql.com/downloads/mysql/5.6.html#downloads
二、安裝
先檢查是否已經安裝了mysql和mariadb
rpm -qa | grep -i mysql
rpm -qa | grep mariadb
[root@localhost ~]# rpm -qa | grep mariadb
mariadb-libs-5.5.56-2.el7.x86_64
[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.56-2.el7.x86_64
1.將下載好的安裝到解壓到/usr/local目錄下(或其他目錄,之后會建立一個軟連接指向/usr/local/mysql/)
tar -zxvf mysql-5.7.9-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
2.進入/usr/local目錄
cd /usr/local/
3.為mysql安裝目錄創建軟鏈接
ln -s mysql-5.7.9-linux-glibc2.5-x86_64 mysql
4.為centos添加mysql用戶組和mysql用戶(-s /bin/false參數指定mysql用戶僅擁有所有權,而沒有登錄權限)
groupadd mysql useradd -r -g mysql -s /bin/false mysql
5.進入安裝mysql軟件的目錄,命令如下
cd /usr/local/mysql
6.修改當前目錄擁有者為新建的mysql用戶,命令如下:
chown -R mysql:mysql ./
7.安裝mysql,命令如下:
./bin/mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --initialize
如果出現如下圖所示則為安裝成功,紅線部分為生成的默認密碼:
8.開啟mysql服務,命令如下:
./support-files/mysql.server start
如果出現如下錯誤,則說明mysql配置文件/etc/my.cnf中的路徑不對,修改內容如下,datadir(datadir一定要加)和socket都修改成mysql的安裝目錄下,增加[client]板塊,用於命令行連接mysql數據庫。
[mysqld] port=3306 datadir=/usr/local/mysql/data socket=/usr/local/mysql/mysql.sock user=mysql max_connections=151 # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # 設置忽略大小寫 lower_case_table_names = 1 # 指定編碼 character-set-server=utf8 collation-server=utf8_general_ci # 開啟ip綁定 bind-address = 0.0.0.0 [mysqld_safe] log-error=/var/log/mysqld.log pid-file=/var/run/mysqld/mysqld.pid #指定客戶端連接mysql時的socket通信文件路徑 [client] socket=/usr/local/mysql/mysql.sock default-character-set=utf8
9.重新啟開啟mysql服務,如下圖所示則開啟成功!
./support-files/mysql.server start
10.將mysql進程放入系統進程中,命令如下:
cp support-files/mysql.server /etc/init.d/mysqld
11.重新啟動mysql服務,命令如下:
service mysqld restart
12.配置mysql環境變量
輸入 vi /etc/profile,
按 i 鍵后 進入insert模式,進入insert模式后才能進行修改 輸入 export PATH=$PATH:/usr/local/mysql/bin
修改完成后
按esc鍵進入command模式,
然后:wq 保存文件並退出vi(注意先冒號)
保存退出,再編譯下:
source /etc/profile
13.使用隨機密碼登錄mysql數據庫,命令如下:
mysql -u root -p
14. 輸入show databases;進入mysql操作行,為root用戶設置新密碼(小編設為root):
或者輸入
alter user 'root'@'localhost' identified by 'root';
15.設置允許遠程連接數據庫,命令如下:
先選擇數據庫:
use mysql; update user set user.Host='%' where user.User='root'; 查看修改后的值: select user,host from user;
16.刷新權限,命令如下:
flush privileges;
17、開啟3306防火牆端口,然后即可遠程連接mysql(因為我的防火牆是全部關閉,所以省略了這步)
18、如果還是無法遠程連接,查看/etc/my.cnf
找到bind-address = 127.0.0.1這一行
改為bind-address = 0.0.0.0即可
19, 設置開機自啟
chkconfig mysqld on 要取消掉某個服務自動啟動,只需要將最后的參數 “on” 變更為 “off” 即可。
查看自啟項目 chkconfig --list
20, firewall-cmd --list-all 看看3306是否列出來,如果沒列出來,需要打開
打開3306端口 firewall-cmd --permanent --add-port=3306/tcp
成功后重啟防火牆service firewalld restart
-----------------------------------------------------------------
通過show processlist查看MySQL的進程狀態,在State列上面的狀態有如下這些:
Analyzing
線程對MyISAM 表的統計信息做分析(例如, ANALYZE TABLE )。
checking permissions
線程檢查服務器是否具有所需的權限來執行該語句。
Checking table
線程正在執行表檢查操作。
cleaning up
線程處理一個命令,並正准備釋放內存和重置某些狀態變量。
closing tables
線程改變表中的數據刷新到磁盤和關閉使用的表。
converting HEAP to MyISAM
線程從轉換內部臨時表MEMORY內存表到磁盤MyISAM表。
copy to tmp table
線程正在處理一個ALTER TABLE語句。
Copying to group table
如果語句有不同的ORDER BY和GROUP BY標准,按組排序並復制到一個臨時表。
Copying to tmp table
服務器復制到內存中的臨時表。
Copying to tmp table on disk
服務器復制到一個臨時表在磁盤上。
Creating index
線程正在處理ALTER TABLE ... ENABLE KEYS。
Creating sort index
線程正在處理一個SELECT,使用內部臨時表解決。
creating table
線程創建一個表, 這包括建立臨時表。
Creating tmp table
線程創建一個臨時表在內存或磁盤上。 如果表是在內存中創建,但后來被轉換成一個磁盤上的表,在該操作狀態為Copying to tmp table on disk。
deleting from main table
服務器正在執行多表刪除的第一部分。 它只能從第一個表中刪除,並保存列和刪除從其他表(參考)偏移。
deleting from reference tables
服務器正在執行多表刪除的第二部分,從其他表中刪除匹配的行。
discard_or_import_tablespace
線程正在處理一個ALTER TABLE ... DISCARD TABLESPACE或ALTER TABLE ... IMPORT TABLESPACE語句。
end
這發生在最后的清理工作,有ALTER TABLE , CREATE VIEW , DELETE , INSERT , SELECT或UPDATE語句。
executing
線程已開始執行語句。
Execution of init_command
線程正在執行中的init_command系統變量。
freeing items
線程已執行的命令。 釋放一些在這種狀態下完成的項目,涉及的查詢緩存。 這種狀態通常后跟cleaning up 。
Flushing tables
線程正在執行FLUSH TABLES ,等待所有線程關閉其表。
FULLTEXT initialization
該服務器是准備執行一個自然語言的全文檢索。
init
在發生之前的初始化ALTER TABLE , DELETE , INSERT , SELECT或UPDATE語句。 服務器在這種狀態下采取的行動包括沖洗二進制日志中InnoDB日志,和一些查詢緩存清理操作。
Killed
有人發送一個KILL線程的語句,它應該中止在下一次檢查殺死標志。
Locked
查詢被鎖定由另一個查詢。
logging slow query
線程正在寫慢查詢日志的語句。
NULL
這種狀態是用於SHOW PROCESSLIST狀態。
login
連接線程的初始狀態,直到客戶端已成功通過身份驗證。
Opening tables , Opening table
線程試圖打開一個表。 這應該是非常快的過程中,除非有阻止打開。
optimizing
服務器執行查詢的初始優化。
preparing
這種狀態出現在查詢優化過程中。
Purging old relay logs
線程是消除不必要的中繼日志文件。
query end
這種狀態發生后處理查詢,但在此freeing items的項目狀態。
Reading from net
服務器讀網絡數據包。
Removing duplicates
查詢使用SELECT DISTINCT在這樣一種方式。 MySQL需要一個額外的的階段,將結果發送到客戶端之前刪除所有重復行。
removing tmp table
線程移除臨時表。 如果沒有創建臨時表,這種狀態是不使用。
rename
線程重命名表。
rename result table
線程正在處理一個ALTER TABLE語句,創建新表並重新命名它來取代原來的表。
Reopen tables
線程有一個表鎖,並試圖重新打開它。
Repair by sorting
使用排序修復索引。
Repair done
修復完成。
Repair with keycache
修復使用鍵緩存。用於myisam表,出現該狀態應加大myisam_max_sort_file_size。
Rolling back
回滾事務。
Saving state
保存狀態。
Searching rows for update
線程做第一階段前更新他們找到所有匹配的行。
Sending data
線程處理一個SELECT語句,將數據發送到客戶端。 因為在這個狀態發生的操作往往執行大量的磁盤訪問(讀取),查詢的生命周期最長的運行狀態。
setup
線程開始一個ALTER TABLE操作。
Sorting for group
線程做一個分組。
Sorting for order
線程做ORDER BY排序。
Sorting index
線程排序索引,更高效的訪問MyISAM表的優化操作。
Sorting result
對於SELECT語句,這是Creating sort index類似,但不用臨時表。
statistics
服務器計算統計數據,以制定一個查詢執行計划。 如果一個線程處於這種狀態很長一段時間,可能是磁盤在執行其他工作。
System lock
該線程正在等待內部或外部的系統鎖表。 可以與外部系統--skip-external-locking鎖定選項。
Table lock
線程要求內部表鎖。
Updating
線程正在尋找要更新的行。
updating main table
服務器正在執行多表更新的第一部分,它只更新第一個表。
updating reference tables
服務器正在執行多表更新的第二部分。
User lock
線程請求或要求與鎖等待GET_LOCK()調用。
Waiting for release of readlock
線程正在等待另一個線程的鎖被釋放。
Waiting for tables , Waiting for table
線程得到一個表的基本結構發生了變化的通知,它需要重新打開表,以獲取新的結構。 必須等到所有其他線程已經關閉表。
如果另一個線程已FLUSH TABLES或表執行下面的語句:FLUSH TABLES tbl_name、ALTER TABLE、RENAME TABLE、REPAIR TABLE、ANALYZE TABLE、OPTIMIZE TABLE。
Waiting on cond
在該線程正在等待一個條件。
Waiting to get readlock
線程已發出一個FLUSH TABLES WITH READ LOCK語句獲得全局讀鎖,並正在等待獲取鎖。
Writing to net、waiting for net
服務器寫一個數據包活等待網絡,要是大量出現請迅速檢查數據庫到前端的網絡連接狀態和流量。
----------------------------------
# MySql5.7配置文件my.cnf設置
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
###############################基礎設置#####################################
#Mysql服務的唯一編號 每個mysql服務Id需唯一
server-id = 1
#服務端口號 默認3306
port = 3306
#mysql安裝根目錄
basedir = /opt/mysql
#mysql數據文件所在位置
datadir = /opt/mysql/data
#臨時目錄 比如load data infile會用到
tmpdir = /tmp
#設置socke文件所在目錄
socket = /tmp/mysql.sock
#主要用於MyISAM存儲引擎,如果多台服務器連接一個數據庫則建議注釋下面內容
skip-external-locking
#只能用IP地址檢查客戶端的登錄,不用主機名
skip_name_resolve = 1
#數據庫默認字符集,主流字符集支持一些特殊表情符號(特殊表情符占用4個字節)
character-set-server = utf8mb4
#數據庫字符集對應一些排序等規則,注意要和character-set-server對應
collation-server = utf8mb4_general_ci
#設置client連接mysql時的字符集,防止亂碼
init_connect='SET NAMES utf8mb4'
#是否對sql語句大小寫敏感,1表示不敏感
lower_case_table_names = 1
#最大連接數
max_connections = 400
#最大錯誤連接數
max_connect_errors = 1000
#TIMESTAMP如果沒有顯示聲明NOT NULL,允許NULL值
explicit_defaults_for_timestamp = true
#SQL數據包發送的大小,如果有BLOB對象建議修改成1G
max_allowed_packet = 128M
#MySQL連接閑置超過一定時間后(單位:秒)將會被強行關閉
#MySQL默認的wait_timeout 值為8個小時, interactive_timeout參數需要同時配置才能生效
interactive_timeout = 1800
wait_timeout = 1800
#內部內存臨時表的最大值 ,設置成128M。
#比如大數據量的group by ,order by時可能用到臨時表,
#超過了這個值將寫入磁盤,系統IO壓力增大
tmp_table_size = 134217728
max_heap_table_size = 134217728
##----------------------------用戶進程分配到的內存設置BEGIN-----------------------------##
##每個session將會分配參數設置的內存大小
#用於表的順序掃描,讀出的數據暫存於read_buffer_size中,當buff滿時或讀完,將數據返回上層調用者
#一般在128kb ~ 256kb,用於MyISAM
#read_buffer_size = 131072
#用於表的隨機讀取,當按照一個非索引字段排序讀取時會用到,
#一般在128kb ~ 256kb,用於MyISAM
#read_rnd_buffer_size = 262144
#order by或group by時用到
#建議先調整為2M,后期觀察調整
sort_buffer_size = 2097152
#一般數據庫中沒什么大的事務,設成1~2M,默認32kb
binlog_cache_size = 524288
############################日 志 設置##########################################
#數據庫錯誤日志文件
log_error = error.log
#慢查詢sql日志設置
slow_query_log = 1
slow_query_log_file = slow.log
#檢查未使用到索引的sql
log_queries_not_using_indexes = 1
#針對log_queries_not_using_indexes開啟后,記錄慢sql的頻次、每分鍾記錄的條數
log_throttle_queries_not_using_indexes = 5
#作為從庫時生效,從庫復制中如何有慢sql也將被記錄
log_slow_slave_statements = 1
#慢查詢執行的秒數,必須達到此值可被記錄
long_query_time = 2
#檢索的行數必須達到此值才可被記為慢查詢
min_examined_row_limit = 100
#mysql binlog日志文件保存的過期時間,過期后自動刪除
expire_logs_days = 5
############################主從復制 設置########################################
#開啟mysql binlog功能
log-bin=mysql-bin
#binlog記錄內容的方式,記錄被操作的每一行
binlog_format = ROW
#作為從庫時生效,想進行級聯復制,則需要此參數
log_slave_updates
#作為從庫時生效,中繼日志relay-log可以自我修復
relay_log_recovery = 1
#作為從庫時生效,主從復制時忽略的錯誤
slave_skip_errors = ddl_exist_errors
##---redo log和binlog的關系設置BEGIN---##
#(步驟1) prepare dml相關的SQL操作,然后將redo log buff中的緩存持久化到磁盤
#(步驟2)如果前面prepare成功,那么再繼續將事務日志持久化到binlog
#(步驟3)如果前面成功,那么在redo log里面寫上一個commit記錄
#當innodb_flush_log_at_trx_commit和sync_binlog都為1時是最安全的,
#在mysqld服務崩潰或者服務器主機crash的情況下,binary log只有可能丟失最多一個語句或者一個事務。
#但是都設置為1時會導致頻繁的io操作,因此該模式也是最慢的一種方式。
#當innodb_flush_log_at_trx_commit設置為0,mysqld進程的崩潰會導致上一秒鍾所有事務數據的丟失。
#當innodb_flush_log_at_trx_commit設置為2,只有在操作系統崩潰或者系統掉電的情況下,上一秒鍾所有事務數據才可能丟失。
#commit事務時,控制redo log buff持久化磁盤的模式 默認為1
innodb_flush_log_at_trx_commit = 2
#commit事務時,控制寫入mysql binlog日志的模式 默認為 0
#innodb_flush_log_at_trx_commit和sync_binlog都為1時,mysql最為安全但性能上壓力也是最大
sync_binlog = 1
##---redo log 和 binlog的關系設置END---##
############################Innodb設置##########################################
#數據塊的單位8k,默認是16k,16kCPU壓力稍小,8k對select的吞吐量大
#innodb_page_size的參數值也影響最大索引長度,8k比16k的最大索引長度小
#innodb_page_size = 8192
#一般設置物理存儲的60% ~ 70%
innodb_buffer_pool_size = 1G
#5.7.6之后默認16M
#innodb_log_buffer_size = 16777216
#該參數針對unix、linux,window上直接注釋該參數.默認值為NULL
#O_DIRECT減少操作系統級別VFS的緩存和Innodb本身的buffer緩存之間的沖突
innodb_flush_method = O_DIRECT
#此格式支持壓縮, 5.7.7之后為默認值
innodb_file_format = Barracuda
#CPU多核處理能力設置,假設CPU是2顆4核的,設置如下
#讀多,寫少可以設成2:6的比例
innodb_write_io_threads = 4
innodb_read_io_threads = 4
#提高刷新臟頁數量和合並插入數量,改善磁盤I/O處理能力
#默認值200(單位:頁)
#可根據磁盤近期的IOPS確定該值
innodb_io_capacity = 500
#為了獲取被鎖定的資源最大等待時間,默認50秒,超過該時間會報如下錯誤:
# ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
innodb_lock_wait_timeout = 30
#調整buffer pool中最近使用的頁讀取並dump的百分比,通過設置該參數可以減少轉儲的page數
innodb_buffer_pool_dump_pct = 40
#設置redoLog文件所在目錄, redoLog記錄事務具體操作內容
innodb_log_group_home_dir = /opt/mysql/redolog/
#設置undoLog文件所在目錄, undoLog用於事務回滾操作
innodb_undo_directory = /opt/mysql/undolog/
#在innodb_log_group_home_dir中的redoLog文件數, redoLog文件內容是循環覆蓋寫入。
innodb_log_files_in_group = 3
#MySql5.7官方建議盡量設置的大些,可以接近innodb_buffer_pool_size的大小
#之前設置該值較大時可能導致mysql宕機恢復時間過長,現在恢復已經加快很多了
#該值減少臟數據刷新到磁盤的頻次
#最大值innodb_log_file_size * innodb_log_files_in_group <= 512GB,單文件<=256GB
innodb_log_file_size = 1024M
#設置undoLog文件所占空間可以回收
#5.7之前的MySql的undoLog文件一直增大無法回收
innodb_undo_log_truncate = 1
innodb_undo_tablespaces = 3
innodb_undo_logs = 128
#5.7.7默認開啟該參數 控制單列索引長度最大達到3072
#innodb_large_prefix = 1
#5.7.8默認為4個, Inodb后台清理工作的線程數
#innodb_purge_threads = 4
#通過設置配置參數innodb_thread_concurrency來限制並發線程的數量,
#一旦執行線程的數量達到這個限制,額外的線程在被放置到對隊列中之前,會睡眠數微秒,
#可以通過設定參數innodb_thread_sleep_delay來配置睡眠時間
#該值默認為0,在官方doc上,對於innodb_thread_concurrency的使用,也給出了一些建議:
#(1)如果一個工作負載中,並發用戶線程的數量小於64,建議設置innodb_thread_concurrency=0;
#(2)如果工作負載一直較為嚴重甚至偶爾達到頂峰,建議先設置innodb_thread_concurrency=128,
###並通過不斷的降低這個參數,96, 80, 64等等,直到發現能夠提供最佳性能的線程數
#innodb_thread_concurrency = 0
############################其他內容 設置##########################################
[mysqldump]
quick
max_allowed_packet = 128M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 256k
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
[mysqld_safe]
#增加每個進程的可打開文件數量.
open-files-limit = 28192