一.前言
根據安全性和保密性的要求,內網服務器是不能訪問網絡的,所以只能離線安裝軟件,安裝MySQL的依賴包需要配置yum源,由於服務器架構的不同,考慮到兼容性,可定制性,以及為了提高MySQL運行性能,編譯安裝MySQL是最合適的方法。
二.關於MySQL
MySQL是最流行的關系型數據庫管理系統之一,使用簡單,部署快速,功能全面,可以快速滿足中小型公司的數據存儲需求。
三.MySQL安裝篇
3.1 部署環境
服務器版本 | MySQL軟件版本 | CPU架構 |
---|---|---|
CentOS Linux release 7.4.1708 (Core) | MySQL 5.7 | x86_64 |
3.2 前期准備工具
- CentOS-7-x86_64-DVD-1708.iso #下載地址: http://mirror.unpad.ac.id/centos/7.4.1708/isos/x86_64/
- gcc-7.3.0.tar.gz #下載地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/
- gmp-6.1.0.tar.bz2 #下載地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- mpfr-3.1.4.tar.bz2 #下載地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- mpc-1.0.3.tar.gz #下載地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- isl-0.16.1.tar.bz2 #下載地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- mysql-boost-5.7.22.tar.gz #下載地址為 https://dev.mysql.com/downloads/mysql/5.7.html#downloads
3.3 掛載系統ISO鏡像,配置yum源
由於內網無法訪問網絡,所以需先掛載centos7的ISO鏡像,然后配置yum源安裝mysql5.7編譯所需要的依賴包
創建ISO鏡像存放目錄並上傳ISO鏡像文件
[root@node8 ~]# mkdir /mnt/yum-iso
[root@node8 ~]# cd /mnt/
[root@node8 mnt]# cd yum-iso/
[root@node8 yum-iso]# mkdir /mnt/cdrom
[root@node8 yum-iso]# pwd
/mnt/yum-iso
使用xftp工具上傳ISO鏡像到/mnt/yum-iso目錄
掛載ISO鏡像到/mnt/cdrom目錄
[root@node8 yum-iso]# mount -o loop /mnt/yum-iso/CentOS-7-x86_64-DVD-1708.iso /mnt/cdrom #掛載系統鏡像
mount: /dev/loop0 is write-protected, mounting read-only
[root@node8 yum-iso]# df -h #查看磁盤
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 13G 4.3G 76% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 125M 890M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/loop0 4.3G 4.3G 0 100% /mnt/cdrom #顯示這一行說明已經鏡像已經掛載成功
配置yum源:
[root@node8 yum-iso]# cd /etc/yum.repos.d/
[root@node8 yum.repos.d]# mkdir yumbak
[root@node8 yum.repos.d]# mv *.repo yumbak/ #備份原有配置文件
[root@node8 yum.repos.d]# vim iso.repo
[root@node8 yum.repos.d]# cat iso.repo
[centos7-iso]
name=centos-iso
baseurl=file:///mnt/cdrom #此處寫鏡像掛載目錄
gpgcheck=0
enabled=1
清空yum緩存:
[root@node8 yum.repos.d]# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: centos7-iso
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
[root@node8 yum.repos.d]#
使用yum list檢查是否設置成功!如果有輸出就表示yum源配置成功
[root@node9 yum.repos.d]# yum list
設置開機自動掛載iso鏡像文件,在/etc/fstab的最后一行添加配置,將iso文件永久掛載到系統中
[root@node9 yum.repos.d]# vim /etc/fstab
[root@node9 yum.repos.d]# cat /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Apr 26 17:36:34 2019
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root / xfs defaults 0 0
UUID=c7de6c01-e93f-4907-b919-5989396f857b /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/mnt/yum-iso/CentOS-7-x86_64-DVD-1708.iso /mnt/cdrom iso9660 loop 0 0 #這行是新增的,注意這里要寫正確,不然服務器開不了機
再次查看磁盤,確認系統鏡像是否掛載成功
[root@node9 yum.repos.d]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 7.5G 9.5G 45% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.6M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 1014M 125M 890M 13% /boot
tmpfs 394M 0 394M 0% /run/user/0
/dev/loop0 4.3G 4.3G 0 100% /mnt/cdrom
3.4 安裝mysql編譯所需的依賴包
安裝mysql基本依賴包依賴包
[root@node9 ~]# yum install bison* ncurses* -y
[root@node9 ~]# yum install -y bzip2 wget -y
升級gcc到7.3版本用於編譯MySQL,編譯安裝gcc源碼包安裝gcc
[root@node9 yum.repos.d]# cd /home/
上傳gcc-7.3.0.tar.gz到/home目錄
[root@node9 home]# rz -E #rz命令上傳gcc源碼包
rz waiting to receive.
[root@node9 home]# ls
gcc-7.3.0.tar.gz
解壓gcc源碼包
[root@node9 home]# tar -xvf gcc-7.3.0.tar.gz #tar命令解壓gcc
[root@node9 home]# pwd
/home
[root@node9 home]# ls
gcc-7.3.0 gcc-7.3.0.tar.gz
[root@node9 gcc-7.3.0]# cd gcc-7.3.0
[root@node9 gcc-7.3.0]# pwd
/home/gcc-7.3.0
上傳gmp-6.1.0.tar.bz2,mpfr-3.1.4.tar.bz2,mpc-1.0.3.tar.gz,isl-0.16.1.tar.bz2到/home/gcc-7.3.0目錄下
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# ls
ABOUT-NLS COPYING3 isl-0.16.1.tar.bz2 libhsail-rt ltmain.sh mkinstalldirs
ChangeLog COPYING3.LIB LAST_UPDATED libiberty lt~obsolete.m4 move-if-change
ChangeLog.jit COPYING.LIB libada libitm lto-plugin mpc-1.0.3.tar.gz
ChangeLog.tree-ssa COPYING.RUNTIME libatomic libmpx ltoptions.m4 mpfr-3.1.4.tar.bz2
compile depcomp libbacktrace libobjc ltsugar.m4 NEWS
config fixincludes libcc1 liboffloadmic ltversion.m4 README
config.guess gcc libcilkrts libquadmath MAINTAINERS symlink-tree
config-ml.in gmp-6.1.0.tar.bz2 libcpp libsanitizer maintainer-scripts ylwrap
config.rpath gnattools libdecnumber libssp Makefile.def zlib
config.sub gotools libffi libstdc++-v3 Makefile.in
configure include libgcc libtool-ldflags Makefile.tpl
configure.ac INSTALL libgfortran libtool.m4 MD5SUMS
contrib install-sh libgo libvtv missing
COPYING intl libgomp ltgcc.m4 mkdep
在“gcc-7.3.0”目錄下,檢查gcc的依賴包是否已下載和安裝,如果沒有,會自動下載和安裝。
[root@node9 gcc-7.3.0]# ./contrib/download_prerequisites
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.#如果輸出為這樣,所以所以依賴都已滿足
使用configure命令檢查gcc編譯環境
[root@node9 gcc-7.3.0]# cd /home/gcc-7.3.0
[root@node9 gcc-7.3.0]# mkdir gcc-build-7.3.0
[root@node9 gcc-7.3.0]# cd gcc-build-7.3.0
[root@node9 gcc-build-7.3.0]# ../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr #--prefix=/usr是把gcc指定安裝在/usr目錄下
.......
....輸出內容過多,只列出如下...
checking where to find the target windmc... host tool
checking whether to enable maintainer-specific portions of Makefiles... no
configure: creating ./config.status
config.status: creating Makefile
[root@node9 gcc-build-7.3.0]# echo $? #輸出結果為0則說明gcc編譯環境滿足條件
0
使用make -j 4編譯gcc,4代表使用幾個線程來執行程序,如果是16核服務器則可以使用16
[root@node9 gcc-build-7.3.0]# make -j 4
[root@node9 gcc-build-7.3.0]# echo $? ##輸出結果為0則說明編譯成功
0
使用make install安裝gcc
[root@node9 gcc-build-7.3.0]# make install
[root@node9 gcc-build-7.3.0]# echo $? ##輸出結果為0則說明安裝成功
0
確定“libstdc++.so”是否在“/usr/lib64”目錄下
[root@node9 gcc-build-7.3.0]# cd /usr/lib64/
[root@node9 lib64]# ll | grep libstdc++.so
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so -> libstdc++.so.6.0.24
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so.6 -> libstdc++.so.6.0.24
-rwxr-xr-x. 1 root root 991616 Mar 14 2019 libstdc++.so.6.0.19
-rwxr-xr-x 1 root root 11515840 Nov 5 12:34 libstdc++.so.6.0.24
-rw-r--r-- 1 root root 2385 Nov 5 12:34 libstdc++.so.6.0.24-gdb.py
確定軟連接是否存在
[root@node9 lib64]# ll |grep libstdc++.so.6.0.24
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so -> libstdc++.so.6.0.24
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so.6 -> libstdc++.so.6.0.24
-rwxr-xr-x 1 root root 11515840 Nov 5 12:34 libstdc++.so.6.0.24
-rw-r--r-- 1 root root 2385 Nov 5 12:34 libstdc++.so.6.0.24-gdb.py
查看gcc版本
[root@node9 lib64]# gcc -v #輸出如下內容則說明gcc 7.3安裝成功
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr
Thread model: posix
gcc version 7.3.0 (GCC)
3.5 源碼編譯安裝mysql5.7
上傳mysql-boost-5.7.22.tar.gz到/usr/local/src/目錄下
[root@node9 lib64]# cd /usr/local/src/
[root@node9 src]# pwd
/usr/local/src
[root@node9 src]# rz -E
rz waiting to receive.
[root@node9 src]# ls
mysql-boost-5.7.28.tar.gz
解壓mysql源碼包
[root@node9 src]# tar -zxf mysql-boost-5.7.28.tar.gz
[root@node9 src]# ls
mysql-5.7.28 mysql-boost-5.7.28.tar.gz
下載mysql補丁文件,並放置到/usr/local/src/mysql-5.7.28路徑下(這步其實可以省略)
補丁下載路徑:https://bugs.mysql.com/file.php?id=28180&bug_id=94699
[root@node9 src]# cd mysql-5.7.28/
[root@node9 mysql-5.7.28]# pwd
/usr/local/src/mysql-5.7.28
[root@node9 mysql-5.7.28]# rz -E
rz waiting to receive.
[root@node9 mysql-5.7.28]# ls
0001-Bug-94699-Mysql-deadlock-and-bugcheck-on-aarch64.patch
[root@node9 mysql-5.7.28]# pwd
/usr/local/src/mysql-5.7.28
打mysql補丁,如果沒有patch命令則需要安裝patch命令
[root@node9 mysql-5.7.28]# patch -p1 < 0001-Bug-94699-Mysql-deadlock-and-bugcheck-on-aarch64.patch
-bash: patch: command not found #出現這個提示說明patch沒有安裝
#安裝patch命令
[root@node9 mysql-5.7.28]# yum -y install patch
...........................
.....輸出太多只顯示如下.......
Installed:
patch.x86_64 0:2.7.1-8.el7
Complete!
開始打補丁
#打補丁:全部回車即可
[root@node9 mysql-5.7.28]# patch -p1 < 0001-Bug-94699-Mysql-deadlock-and-bugcheck-on-aarch64.patch
patching file storage/innobase/sync/sync0rw.cc
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file storage/innobase/sync/sync0rw.cc.rej
創建mysql的cmake腳本
[root@node9 mysql-5.7.28]# pwd
/usr/local/src/mysql-5.7.28
[root@node9 mysql-5.7.28]# vim cmake.sh #由於mysql的編譯參數較多,寫到腳本里便於運行以及復用
[root@node9 mysql-5.7.28]# cat cmake.sh
#CMAKE_INSTALL_PREFIX路徑和WITH_BOOST路徑按照您的真實路徑填寫
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DTRACE=0 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EMBEDDED_SERVER=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/src/mysql-5.7.28/boost/boost_1_59_0
給cmake.sh賦予可執行權限
[root@node9 mysql-5.7.28]# chmod +x cmake.sh
再次安裝mysql依賴包
[root@node9 mysql-5.7.28]# yum -y install openssl openssl-devel expat-deve
執行腳本
[root@node9 mysql-5.7.28]# ./cmake.sh
[root@node9 mysql-5.7.28]# echo $? #輸出為0則說明腳本執行成功
0
編譯mysql
[root@node9 mysql-5.7.28]# make -j 5
[root@node9 mysql-5.7.28]# echo $? #輸出為0則說明MySQL編譯成功
0
安裝mysql
[root@node9 mysql-5.7.28]# make install
[root@node9 mysql-5.7.28]# echo $? #輸出為0則說明MySQL安裝成功
0
3.6 配置mysql
刪除系統殘留的mysql用戶和用戶組,以免造成干擾
[root@node9 mysql-5.7.28]# userdel -r mysql #刪除用戶
userdel: mysql mail spool (/var/spool/mail/mysql) not found
userdel: mysql home directory (/home/mysql) not found
[root@node9 mysql-5.7.28]# groupdel mysql #刪除用戶組
groupdel: group 'mysql' does not exist
創建mysql用戶和用戶組
[root@node9 mysql-5.7.28]# groupadd mysql #創建MySQL用戶組
[root@node9 mysql-5.7.28]# useradd -g mysql mysql #創建MySQL用戶
修改/usr/local/mysql權限
[root@node9 mysql-5.7.28]# chown -R mysql:mysql /usr/local/mysql
進入安裝路徑,創建data、log、run文件夾,分別用戶保存數據,日志,進程ID
[root@node9 mysql-5.7.28]# cd /usr/local/mysql/
[root@node9 mysql]# mkdir -p /data/log /data/data /data/run
進行mysql初始化
[root@node9 mysql]# bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/data --user=mysql #basedir填MySQL安裝目錄,datadir填數據存在目錄,user填MySQL運行用戶
2019-11-05T06:33:23.155541Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-11-05T06:33:23.247376Z 0 [ERROR] Could not open file '/var/log/mysqld.log' for error logging: Permission denied #出現這個錯誤,說明/var/log/mysqld.log權限不足
2019-11-05T06:33:23.247427Z 0 [ERROR] Aborting
#賦予/var/log/mysqld.log的擁有者為mysql
[root@node9 mysql]# chown -R mysql:mysql /var/log/mysqld.log
#再次進行MySQL初始化
[root@node9 mysql]# bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/data --user=mysql
[root@node9 mysql]# echo $? #此輸出為0則說明MySQL初始化成功
0
創建mysql.log和mysql.pid文件,並賦予mysql用戶及用戶組權限
[root@node9 mysql]# touch /data/log/mysql.log
[root@node9 mysql]# touch /data/run/mysql.pid
[root@node9 mysql]# chown -R mysql:mysql /data
編輯mysql配置文件(配置文件最好和我保持一致)
[root@node9 mysql]# vim /etc/my.cnf
[root@node9 mysql]# cat /etc/my.cnf
[mysqld]
basedir=/var/lib/mysql
datadir=/data/data #數據存放目錄
port=3306 #端口號
socket=/data/data/mysql.sock
character-set-server=utf8 #字符集編碼
symbolic-links=0
log-error=/data/log/mysql.log #日志存放目錄
pid-file=/data/run/mysql.pid #MySQL進程ID存放目錄
!includedir /etc/my.cnf.d
啟動mysql
[root@node9 mysql]# pwd
/usr/local/mysql
[root@node9 mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@node9 mysql]# chkconfig mysql on #配置MySQL開機自啟動
[root@node9 mysql]# service mysql start #啟動MySQL
Starting MySQL SUCCESS! #如果出現此,則說明MySQL啟動成功
添加mysql路徑到當前用戶的環境變量里,這樣可以直接在shell中使用MySQL命令
[root@node9 mysql]# vim ~/.bash_profile
[root@node9 mysql]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
#export PATH
export PATH=/usr/local/mysql/bin:$PATH #新增
使環境變量生效並重啟MySQL
[root@node9 mysql]# source ~/.bash_profile
[root@node9 mysql]# service mysql restart
ERROR! MySQL server PID file could not be found!
Starting MySQL. SUCCESS!
[root@node9 mysql]# ps -ef | grep mysql #查看MySQL進程是否存在
root 121678 1 0 14:55 pts/0 00:00:00 /bin/sh /var/lib/mysql/bin/mysqld_safe --datadir=/data/data --pid-file=/data/run/mysql.pid
mysql 121933 121678 1 14:55 pts/0 00:00:00 /var/lib/mysql/bin/mysqld --basedir=/var/lib/mysql --datadir=/data/data --plugin-dir=/var/lib/mysql/lib/plugin --user=mysql --log-error=/data/log/mysql.log --pid-file=/data/run/mysql.pid --socket=/data/data/mysql.sock --port=3306
root 121963 1325 0 14:55 pts/0 00:00:00 grep --color=auto mysql
進入mysql數據庫
[root@node9 mysql]# mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
#出現這種報錯說明sock出錯,方法為建立套接字軟鏈接,接入MySQL環境
[root@node9 mysql]# ln -s /data/data/mysql.sock /tmp/mysql.sock
首先查詢mysql默認密碼:
[root@node9 ~]# grep 'temporary password' /var/log/mysqld.log
2019-11-05T06:35:28.565529Z 1 [Note] A temporary password is generated for root@localhost: T<&loC3=%t+Q
#T<&loC3=%t+Q就是mysql初始密碼
#進入mysql數據庫
[root@node9 mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.26-log
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.
mysql> SET PASSWORD = PASSWORD('123456');#修改mysql的root用戶密碼為123456
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> UPDATE mysql.user SET authentication_string =PASSWORD('123456') WHERE User='mysql';#修改mysql的mysql用戶密碼為123456
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 1
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@"%" IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES ; #刷新mysql權限
Query OK, 0 rows affected (0.00 sec)
mysql> exit #退出MySQL
Bye
再次進入mysql數據庫,密碼為修改后的密碼123456
[root@node9 mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.26-log Source distribution
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.
mysql> show databases; #展示MySQL數據庫
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
自此,mysql5.7源碼編譯安裝完成。
四.MySQL調優篇
4.1 對MySQL進行安全設置
[root@node9 ~]# mysql_secure_installation #此命令用於對MySQL進行安全設置
Securing the MySQL server deployment.
Enter password for user root: #鍵入root密碼
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No: n #如果要安全MySQL密碼強度插件,則y,安裝之后簡單的密碼是設置不成功的
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n #是否更改root密碼,修改則y
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y #是否移除匿名用戶,建議移除
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y #是否禁止root用戶遠程登錄,建議禁止,輸入y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y #是否移除test數據庫,按個人需求選擇即可
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y #輸入y,立即刷新權限表,使配置生效
Success.
All done!
4.2 設置MySQL超時時間
MySQL默認連續8小時內沒有訪問數據庫的操作,就會斷開數據庫連接,mysql數據庫拒絕訪問,在某些場景下,8小時是不夠的,需要把MySQL超時時間調大,此時就需要調節MySQL的wait_timeout和interactive_timeout參數
mysql> show variables like '%timeout%';#用於查看MySQL時間相關的參數
修改MySQL配置文件,使wait_timeout和interactive_timeout參數變為31536000
[root@node9 mysql]# vim /etc/my.cnf
[root@node9 mysql]# cat /etc/my.cnf
[mysqld]
basedir=/var/lib/mysql
datadir=/data/data #數據存放目錄
port=3306 #端口號
socket=/data/data/mysql.sock
character-set-server=utf8 #字符集編碼
symbolic-links=0
log-error=/data/log/mysql.log #日志存放目錄
pid-file=/data/run/mysql.pid #MySQL進程ID存放目錄
wait_timeout=31536000 #此為新增,配置MySQL超時時間,默認8小時,針對非交互式場景(jdbc,pymysql類似)
interactive_timeout=31536000 #此為新增,配置MySQL超時時間, 默認8小時,針對交互式場景(手動執行,mysqldump)
!includedir /etc/my.cnf.d
MySQL配置文件修改后,重啟MySQL使配置文件生效
[root@node9 ~]# service mysql restart
Shutting down MySQL. SUCCESS!
Starting MySQL. SUCCESS!
進入MySQL,查看MySQL超時時間是否修改成功
[root@node9 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution
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.
mysql> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 31536000 | #interactive_timeout已經變了
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 31536000 | #wait_timeout已經變了
+-----------------------------+----------+
13 rows in set (0.01 sec)
4.3 MySQL配置文件優化參考1(按需配置即可)
[root@node9 mysql]# vim /etc/my.cnf
[root@node9 mysql]# cat /etc/my.cnf
[mysqld]
symbolic-links=0
log-error=/data/log/mysql.log #日志存放目錄
wait_timeout=31536000 #此為新增,配置MySQL超時時間,默認8小時,針對非交互式場景(jdbc,pymysql類似)
interactive_timeout=31536000 #此為新增,配置MySQL超時時間, 默認8小時,針對交互式場景(手動執行,mysqldump)
!includedir /etc/my.cnf.d
[client] #客戶端設置,即客戶端默認的連接參數
port = 3306 #默認連接端口
socket=/data/data/mysql.sock #用於本地連接的socket套接字
default-character-set = utf8mb4 #字符編碼編碼,utf8mb4編碼是utf8編碼的超集,兼容utf8,並且能存儲4字節的表情字符。采用utf8mb4編碼的好處是:存儲與獲取數據的時候,不用再考慮表情字符的編碼與解碼問題。
[mysqld] #服務端基本設置
port = 3306 #MySQL監聽端口
socket = /data/mysqldata/3307/mysql.sock #為MySQL客戶端程序和服務器之間的本地通訊指定一個套接字文件
pid-file = /data/run/mysql.pid #pid文件所在目錄
basedir = /var/lib/mysql #使用該目錄作為根目錄(安裝目錄)
datadir = /data/data #數據文件存放的目錄
tmpdir = /data/mysqldata/3307/tmp #MySQL存放臨時文件的目錄
character_set_server = utf8mb4 #服務端默認編碼(數據庫級別)
collation_server = utf8mb4_bin #服務端默認的比對規則,排序規則
user = mysql #MySQL啟動用戶
log_bin_trust_function_creators = 1 #This variable applies when binary logging is enabled. It controls whether stored function creators can be trusted not to create stored functions that will cause #unsafe events to be written to the binary log. If set to 0 (the default), users are not permitted to create or alter stored functions unless they have the SUPER #privilege in addition to the CREATE ROUTINE or ALTER ROUTINE privilege. 開啟了binlog后,必須設置這個值為1.主要是考慮binlog安全
performance_schema = 0 #性能優化的引擎,默認關閉
secure_auth = 1 #secure_auth 為了防止低版本的MySQL客戶端(<4.1)使用舊的密碼認證方式訪問高版本的服務器。MySQL 5.6.7開始secure_auth 默認為啟用值1
#ft_min_word_len = 1 #開啟全文索引
#myisam_recover #自動修復MySQL的myisam表
explicit_defaults_for_timestamp #明確時間戳默認null方式
event_scheduler #計划任務(事件調度器)
skip-external-locking #跳過外部鎖定;External-locking用於多進程條件下為MyISAM數據表進行鎖定
skip-name-resolve #跳過客戶端域名解析;當新的客戶連接mysqld時,mysqld創建一個新的線程來處理請求。該線程先檢查是否主機名在主機名緩存中。如果不在,線程試圖解析主機名。
#使用這一選項以消除MySQL進行DNS解析的時間。但需要注意,如果開啟該選項,則所有遠程主機連接授權都要使用IP地址方式,否則MySQL將無法正常處理連接請求!
#bind-address = 127.0.0.1 #MySQL綁定IP,允許哪台服務器登錄,則在后面添加IP即可,多個IP空格隔開
skip-slave-start #為了安全起見,復制環境的數據庫還是設置--skip-slave-start參數,防止復制隨着mysql啟動而自動啟動
slave_net_timeout = 30 #The number of seconds to wait for more data from a master/slave connection before aborting the read. MySQL主從復制的時候,
#當Master和Slave之間的網絡中斷,但是Master和Slave無法察覺的情況下(比如防火牆或者路由問題)。
#Slave會等待slave_net_timeout設置的秒數后,才能認為網絡出現故障,然后才會重連並且追趕這段時間主庫的數據。
#1.用這三個參數來判斷主從是否延遲是不准確的Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master.還是用pt-heartbeat吧。
#2.slave_net_timeout不要用默認值,設置一個你能接受的延時時間。
local-infile = 0 #設定是否支持命令load data local infile。如果指定local關鍵詞,則表明支持從客戶主機讀文件
back_log = 1024 #指定MySQL可能的連接數量。當MySQL主線程在很短的時間內得到非常多的連接請求,該參數就起作用,之后主線程花些時間(盡管很短)檢查連接並且啟動一個新線程。
#back_log參數的值指出在MySQL暫時停止響應新請求之前的短時間內多少個請求可以被存在堆棧中。
#sql_mode = 'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
sql_mode = NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER #sql_mode,定義了mysql應該支持的sql語法,數據校驗等! NO_AUTO_CREATE_USER:禁止GRANT創建密碼為空的用戶。
#NO_ENGINE_SUBSTITUTION 如果需要的存儲引擎被禁用或未編譯,可以防止自動替換存儲引擎
key_buffer_size = 32M #索引塊的緩沖區大小,對MyISAM表性能影響最大的一個參數.決定索引處理的速度,尤其是索引讀的速度。默認值是16M,通過檢查狀態值Key_read_requests
#和Key_reads,可以知道key_buffer_size設置是否合理
max_allowed_packet = 512M #一個查詢語句包的最大尺寸。消息緩沖區被初始化為net_buffer_length字節,但是可在需要時增加到max_allowed_packet個字節。
#該值太小則會在處理大包時產生錯誤。如果使用大的BLOB列,必須增加該值。
#這個值來限制server接受的數據包大小。有時候大的插入和更新會受max_allowed_packet 參數限制,導致寫入或者更新失敗。
thread_stack = 256K #線程緩存;主要用來存放每一個線程自身的標識信息,如線程id,線程運行時基本信息等等,我們可以通過 thread_stack 參數來設置為每一個線程棧分配多大的內存。
sort_buffer_size = 16M #是MySQL執行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。
#如果不能,可以嘗試增加sort_buffer_size變量的大小。
read_buffer_size = 16M #是MySQL讀入緩沖區大小。對表進行順序掃描的請求將分配一個讀入緩沖區,MySQL會為它分配一段內存緩沖區。read_buffer_size變量控制這一緩沖區的大小。
#如果對表的順序掃描請求非常頻繁,並且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內存緩沖區大小提高其性能。
join_buffer_size = 16M #應用程序經常會出現一些兩表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的時候(all/index join),為了減少參與Join的“被驅動表”的
#讀取次數以提高性能,需要使用到 Join Buffer 來協助完成 Join操作。當 Join Buffer 太小,MySQL 不會將該 Buffer 存入磁盤文件,
#而是先將Join Buffer中的結果集與需要 Join 的表進行 Join 操作,
#然后清空 Join Buffer 中的數據,繼續將剩余的結果集寫入此 Buffer 中,如此往復。這勢必會造成被驅動表需要被多次讀取,成倍增加 IO 訪問,降低效率。
read_rnd_buffer_size = 32M #是MySQL的隨機讀緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySQL會首先掃描一遍該緩沖,以避免磁盤搜索,
#提高查詢速度,如果需要排序大量數據,可適當調高該值。但MySQL會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大。
net_buffer_length = 16K #通信緩沖區在查詢期間被重置到該大小。通常不要改變該參數值,但是如果內存不足,可以將它設置為查詢期望的大小。
#(即,客戶發出的SQL語句期望的長度。如果語句超過這個長度,緩沖區自動地被擴大,直到max_allowed_packet個字節。)
myisam_sort_buffer_size = 128M #當對MyISAM表執行repair table或創建索引時,用以緩存排序索引;設置太小時可能會遇到” myisam_sort_buffer_size is too small”
bulk_insert_buffer_size = 32M #默認8M,當對MyISAM非空表執行insert … select/ insert … values(…),(…)或者load data infile時,使用樹狀cache緩存數據,每個thread分配一個;
#注:當對MyISAM表load 大文件時,調大bulk_insert_buffer_size/myisam_sort_buffer_size/key_buffer_size會極大提升速度
thread_cache_size = 384 #thread_cahe_size線程池,線程緩存。用來緩存空閑的線程,以至於不被銷毀,如果線程緩存在的空閑線程,需要重新建立新連接,
#則會優先調用線程池中的緩存,很快就能響應連接請求。每建立一個連接,都需要一個線程與之匹配。
query_cache_size = 0 #工作原理: 一個SELECT查詢在DB中工作后,DB會把該語句緩存下來,當同樣的一個SQL再次來到DB里調用時,DB在該表沒發生變化的情況下把結果從緩存中返回給Client。
#在數據庫寫入量或是更新量也比較大的系統,該參數不適合分配過大。而且在高並發,寫入量大的系統,建系把該功能禁掉。
query_cache_type = 0 #決定是否緩存查詢結果。這個變量有三個取值:0,1,2,分別代表了off、on、demand。
tmp_table_size = 1024M #它規定了內部內存臨時表的最大值,每個線程都要分配。(實際起限制作用的是tmp_table_size和max_heap_table_size的最小值。)
#如果內存臨時表超出了限制,MySQL就會自動地把它轉化為基於磁盤的MyISAM表,存儲在指定的tmpdir目錄下
max_heap_table_size = 512M #獨立的內存表所允許的最大容量.# 此選項為了防止意外創建一個超大的內存表導致永盡所有的內存資源.
open_files_limit = 10240 #mysql打開最大文件數
max_connections = 2000 #MySQL無論如何都會保留一個用於管理員(SUPER)登陸的連接,用於管理員連接數據庫進行維護操作,即使當前連接數已經達到了max_connections。
#因此MySQL的實際最大可連接數為max_connections+1;
#這個參數實際起作用的最大值(實際最大可連接數)為16384,即該參數最大值不能超過16384,即使超過也以16384為准;
#增加max_connections參數的值,不會占用太多系統資源。系統資源(CPU、內存)的占用主要取決於查詢的密度、效率等;
#該參數設置過小的最明顯特征是出現”Too many connections”錯誤;
max-user-connections = 0 #用來限制用戶資源的,0不限制;對整個服務器的用戶限制
max_connect_errors = 100000 #max_connect_errors是一個MySQL中與安全有關的計數器值,它負責阻止過多嘗試失敗的客戶端以防止暴力破解密碼的情況。max_connect_errors的值與性能並無太大關系。
#當此值設置為10時,意味着如果某一客戶端嘗試連接此MySQL服務器,但是失敗(如密碼錯誤等等)10次,則MySQL會無條件強制阻止此客戶端連接。
table_open_cache = 5120 #表描述符緩存大小,可減少文件打開/關閉次數;
interactive_timeout = 86400 #interactive_time -- 指的是mysql在關閉一個交互的連接之前所要等待的秒數(交互連接如mysql gui tool中的連接
wait_timeout = 86400 #wait_timeout -- 指的是MySQL在關閉一個非交互的連接之前所要等待的秒數
binlog_cache_size = 16M #二進制日志緩沖大小
#我們知道InnoDB存儲引擎是支持事務的,實現事務需要依賴於日志技術,為了性能,日志編碼采用二進制格式。那么,我們如何記日志呢?有日志的時候,就直接寫磁盤?
#可是磁盤的效率是很低的,如果你用過Nginx,,一般Nginx輸出access log都是要緩沖輸出的。因此,記錄二進制日志的時候,我們是否也需要考慮Cache呢?
#答案是肯定的,但是Cache不是直接持久化,於是面臨安全性的問題——因為系統宕機時,Cache中可能有殘余的數據沒來得及寫入磁盤。因此,Cache要權衡,要恰到好處:
#既減少磁盤I/O,滿足性能要求;又保證Cache無殘留,及時持久化,滿足安全要求。
slow_query_log = 1 #開啟慢查詢
long_query_time = 1 #超過的時間為1s;MySQL能夠記錄執行時間超過參數 long_query_time 設置值的SQL語句,默認是不記錄的。
log-slow-admin-statements
log-queries-not-using-indexes #記錄管理語句和沒有使用index的查詢記錄
# *** Replication related settings ***
binlog_format = ROW #在復制方面的改進就是引進了新的復制技術:基於行的復制。簡言之,這種新技術就是關注表中發生變化的記錄,而非以前的照抄 binlog 模式。
#從 MySQL 5.1.12 開始,可以用以下三種模式來實現:基於SQL語句的復制(statement-based replication, SBR),基於行的復制(row-based replication, RBR),
混合模式復制(mixed-based replication, MBR)。相應地,binlog的格式也有三種:STATEMENT,ROW,MIXED。MBR 模式中,SBR 模式是默認的。
#max_binlog_cache_size = 102400 # 為每個session 最大可分配的內存,在事務過程中用來存儲二進制日志的緩存。
log-bin = /data/mysqldata/3307/binlog/mysql-bin #開啟二進制日志功能,binlog數據位置
log-bin-index = /data/mysqldata/3307/binlog/mysql-bin.index
relay-log = /data/mysqldata/3307/relay/mysql-relay-bin #relay-log日志記錄的是從服務器I/O線程將主服務器的二進制日志讀取過來記錄到從服務器本地文件,
#然后SQL線程會讀取relay-log日志的內容並應用到從服務器
relay-log-index = /data/mysqldata/3307/relay/mysql-relay-bin.index #binlog傳到備機被寫道relaylog里,備機的slave sql線程從relaylog里讀取然后應用到本地。
server_id = 100 #服務端ID,用來高可用時做區分
log_slave_updates = 1 #log_slave_updates是將從服務器從主服務器收到的更新記入到從服務器自己的二進制日志文件中。
expire-logs-days = 15 #二進制日志自動刪除的天數。默認值為0,表示“沒有自動刪除”。啟動時和二進制日志循環時可能刪除。
max_binlog_size = 512M #如果二進制日志寫入的內容超出給定值,日志就會發生滾動。你不能將該變量設置為大於1GB或小於4096字節。 默認值是1GB。
replicate-wild-ignore-table = mysql.% #replicate-wild-ignore-table參數能同步所有跨數據庫的更新,比如replicate-do-db或者replicate-ignore-db不會同步類似
#replicate-wild-do-table = db_name.% #設定需要復制的Table
#slave-skip-errors = 1062,1053,1146 #復制時跳過一些錯誤;不要胡亂使用這些跳過錯誤的參數,除非你非常確定你在做什么。當你使用這些參數時候,MYSQL會忽略那些錯誤,
#這樣會導致你的主從服務器數據不一致。
auto_increment_offset = 1
auto_increment_increment = 2 #這兩個參數一般用在主主同步中,用來錯開自增值, 防止鍵值沖突
relay_log_info_repository = TABLE #將中繼日志的信息寫入表:mysql.slave_realy_log_info
master_info_repository = TABLE #將master的連接信息寫入表:mysql.salve_master_info
relay_log_recovery = on #中繼日志自我修復;當slave從庫宕機后,假如relay-log損壞了,導致一部分中繼日志沒有處理,則自動放棄所有未執行的relay-log,
#並且重新從master上獲取日志,這樣就保證了relay-log的完整性
# *** innodb setting ***
innodb_buffer_pool_size = 4G #InnoDB 用來高速緩沖數據和索引內存緩沖大小。 更大的設置可以使訪問數據時減少磁盤 I/O。
innodb_data_file_path = ibdata1:1G:autoextend #單獨指定數據文件的路徑與大小
innodb_flush_log_at_trx_commit = 0 #每次commit 日志緩存中的數據刷到磁盤中。通常設置為 1,意味着在事務提交前日志已被寫入磁盤, 事務可以運行更長以及服務崩潰后的修復能力。
#如果你願意減弱這個安全,或你運行的是比較小的事務處理,可以將它設置為 0 ,以減少寫日志文件的磁盤 I/O。這個選項默認設置為 0。
#sync_binlog = 1000 #sync_binlog=n,當每進行n次事務提交之后,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。
innodb_read_io_threads = 8
innodb_write_io_threads = 8 #對於多核的CPU機器,可以修改innodb_read_io_threads和innodb_write_io_threads來增加IO線程,來充分利用多核的性能
innodb_file_format = Barracuda #Innodb Plugin引擎開始引入多種格式的行存儲機制,目前支持:Antelope、Barracuda兩種。其中Barracuda兼容Antelope格式。
innodb_open_files = 65536 #限制Innodb能打開的表的數量
innodb_purge_threads = 1 #開始碎片回收線程。這個應該能讓碎片回收得更及時而且不影響其他線程的操作
innodb_support_xa = FALSE #分布式事務
innodb_log_buffer_size = 256M #InnoDB 將日志寫入日志磁盤文件前的緩沖大小。理想值為 1M 至 8M。大的日志緩沖允許事務運行時不需要將日志保存入磁盤而只到事務被提交(commit)。
#因此,如果有大的事務處理,設置大的日志緩沖可以減少磁盤I/O。
innodb_log_file_size = 1G #日志組中的每個日志文件的大小(單位 MB)。如果 n 是日志組中日志文件的數目,那么理想的數值為 1M 至下面設置的緩沖池(buffer pool)大小的 1/n。較大的值,
#可以減少刷新緩沖池的次數,從而減少磁盤 I/O。但是大的日志文件意味着在崩潰時需要更長的時間來恢復數據。
innodb_log_files_in_group = 3 #指定有三個日志組
#innodb_lock_wait_timeout = 120 #在回滾(rooled back)之前,InnoDB 事務將等待超時的時間(單位 秒)
innodb_max_dirty_pages_pct = 75 #innodb_max_dirty_pages_pct作用:控制Innodb的臟頁在緩沖中在那個百分比之下,值在范圍1-100,默認為90.這個參數的另一個用處:
#當Innodb的內存分配過大,致使swap占用嚴重時,可以適當的減小調整這個值,使達到swap空間釋放出來。建義:這個值最大在90%,最小在15%。
#太大,緩存中每次更新需要致換數據頁太多,太小,放的數據頁太小,更新操作太慢。
innodb_buffer_pool_instances = 4 #innodb_buffer_pool_size 一致 可以開啟多個內存緩沖池,把需要緩沖的數據hash到不同的緩沖池中,這樣可以並行的內存讀寫。
innodb_io_capacity = 500 #這個參數據控制Innodb checkpoint時的IO能力
innodb_file_per_table = 1 #作用:使每個Innodb的表,有自已獨立的表空間。如刪除文件后可以回收那部分空間。
#分配原則:只有使用不使用。但DB還需要有一個公共的表空間。
innodb_change_buffering = inserts #當更新/插入的非聚集索引的數據所對應的頁不在內存中時(對非聚集索引的更新操作通常會帶來隨機IO),會將其放到一個insert buffer中,
#當隨后頁面被讀到內存中時,會將這些變化的記錄merge到頁中。當服務器比較空閑時,后台線程也會做merge操作
innodb_adaptive_flushing = 1 #該值影響每秒刷新臟頁的操作,開啟此配置后,刷新臟頁會通過判斷產生重做日志的速度來判斷最合適的刷新臟頁的數量;
transaction-isolation = READ-COMMITTED #數據庫事務隔離級別 ,讀取提交內容
innodb_flush_method = O_DIRECT #innodb_flush_method這個參數控制着innodb數據文件及redo log的打開、刷寫模式
#InnoDB使用O_DIRECT模式打開數據文件,用fsync()函數去更新日志和數據文件。
#innodb_use_sys_malloc = 1 #默認設置值為1.設置為0:表示Innodb使用自帶的內存分配程序;設置為1:表示InnoDB使用操作系統的內存分配程序。
[mysqldump]
quick #它強制 mysqldump 從服務器查詢取得記錄直接輸出而不是取得所有記錄后將它們緩存到內存中
max_allowed_packet = 512M #限制server接受的數據包大小;指代mysql服務器端和客戶端在一次傳送數據包的過程當中數據包的大小
net_buffer_length = 16384 #TCP/IP和套接字通信緩沖區大小,創建長度達net_buffer_length的行
[mysql]
auto-rehash #auto-rehash是自動補全的意思
[isamchk] #isamchk數據檢測恢復工具
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk] #使用myisamchk實用程序來獲得有關你的數據庫桌表的信息、檢查和修復他們或優化他們
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout #mysqlhotcopy使用lock tables、flush tables和cp或scp來快速備份數據庫.它是備份數據庫或單個表最快的途徑,完全屬於物理備份,但只能用於備份MyISAM存儲引擎和運行在數據庫目錄所在的機器上.
#與mysqldump備份不同,mysqldump屬於邏輯備份,備份時是執行的sql語句.使用mysqlhotcopy命令前需要要安裝相應的軟件依賴包.
4.4 MySQL配置文件優化參考2(按需配置即可)
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
#支持符號鏈接,就是可以通過軟連接的方式,管理其他目錄的數據庫,最好不要開啟,當一個磁盤或分區空間不夠時,可以開啟該參數將數據存儲到其他的磁盤或分區。
#https://blog.csdn.net/moxiaomomo/article/details/17092871
symbolic-links=0
########basic settings########
server-id = 11
port = 3306
user = mysql
#設置autocommit=0,則用戶將一直處於某個事務中,直到執行一條commit提交或rollback語句才會結束當前事務重新開始一個新的事務。set autocommit=0的好處是在頻繁開啟事務的場景下,減少一次begin的交互。
autocommit = 1
#utf8mb4編碼是utf8編碼的超集,兼容utf8,並且能存儲4字節的表情字符。
#采用utf8mb4編碼的好處是:存儲與獲取數據的時候,不用再考慮表情字符的編碼與解碼問題。
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
# 對於同一主機,如果有超出該參數值個數的中斷錯誤連接,則該主機將被禁止連接。如需對該主機進行解禁,執行:FLUSH HOST。
max_connect_errors = 1000
#數據庫隔離級別
transaction_isolation = READ-COMMITTED
#MySQL在完成某些join(連接)需求的時候,為了減少參與join的“被驅動表”的讀取次數以提高性能,需要使用到join buffer來協助完成join操作當join buffer 太小,MySQL不會將該buffer存入磁盤文件而是先將join buffer中的結果與需求join的表進行操作,然后清空join buffer中的數據,繼續將剩余的結果集寫入次buffer中
join_buffer_size = 128M
tmp_table_size = 64M
tmpdir = /tmp
#該值設置過小將導致單個記錄超過限制后寫入數據庫失敗,且后續記錄寫入也將失敗
max_allowed_packet = 64M
#mysql在關閉一個交互的連接之前所要等待的秒數
interactive_timeout = 1200
#mysql在關閉一個非交互的連接之前所要等待的秒數
wait_timeout = 600
#MySQL讀入緩沖區的大小
read_buffer_size = 16M
#MySQL的隨機讀緩沖區大小
read_rnd_buffer_size = 8M
#MySQL的順序讀緩沖區大小
sort_buffer_size = 8M
########log settings########
log_error = /var/log/docker_log/mysql/error.log
#開啟慢查詢日志
slow_query_log = 1
#超出次設定值的SQL即被記錄到慢查詢日志
long_query_time = 6
slow_query_log_file = /var/log/docker_log/mysql/slow.log
#表示記錄下沒有使用索引的查詢
log_queries_not_using_indexes = 1
#記錄管理語句
log_slow_admin_statements = 1
#開啟復制從庫復制的慢查詢的日志
log_slow_slave_statements = 1
#設置每分鍾增長的沒有使用索引查詢的日志數量
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
min_examined_row_limit = 100
########replication settings########
#將master.info和relay.info保存在表中
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
#當每進行n次事務提交之后,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。設置為零是讓系統自行決定
sync_binlog = 5
#開啟全局事務ID,GTID能夠保證讓一個從服務器到其他的從服務器那里實現數據復制而且能夠實現數據整合的
gtid_mode = on
#開啟gtid,必須主從全開
enforce_gtid_consistency = 1
#從服務器的更新是否寫入二進制日志
log_slave_updates = 1
#三種模式 STATEMENT(有可能主從數據不一致,日質量小)、ROW(產生大量二進制日志)、MIXED
binlog_format = mixed
#relay-log日志記錄的是從服務器I/O線程將主服務器的二進制日志讀取過來記錄到從服務器本地文件,然后SQL線程會讀取relay-log日志的內容並應用到從服務器
relay_log = /var/log/docker_log/mysql/relay.log
relay_log_recovery = 1
#開啟簡單gtid,開啟此項會提升mysql執行恢復的性能
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
#這個參數在一開始初始化時就要加入my.cnf里,如果已經創建了表,再修改,啟動MySQL會報錯。最好為8K
#innodb_page_size = 16K
innodb_page_size = 8K
#數據緩沖區buffer pool大小,建議使用物理內存的 75%
innodb_buffer_pool_size = 2G
#當buffer_pool的值較大的時候為1,較小的設置為8
innodb_buffer_pool_instances = 8
#運行時load緩沖池,快速預熱緩沖池,將buffer pool的內容(文件頁的索引)dump到文件中,然后快速load到buffer pool中。避免了數據庫的預熱過程,提高了應用訪問的性能
innodb_buffer_pool_load_at_startup = 1
#運行時dump緩沖池
innodb_buffer_pool_dump_at_shutdown = 1
#在innodb中處理用戶查詢后,其結果在內存空間的緩沖池已經發生變化,但是還未記錄到磁盤。這種頁面稱為臟頁,將臟頁記錄到磁盤的過程稱為刷臟
innodb_lru_scan_depth = 2000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
#事務等待獲取資源等待的最長時間,超過這個時間還未分配到資源則會返回應用失敗,默認50s
innodb_lock_wait_timeout = 30
#日志組所在的路徑,默認為data的home目錄;
innodb_log_group_home_dir = /data/mysql/
#innodb_undo_directory = /data/mysql/undolog/
#這個參數控制着innodb數據文件及redo log的打開、刷寫模式,https://blog.csdn.net/gua___gua/article/details/44916207
#innodb_flush_method = O_DIRECT-不經過系統緩存直接存入磁盤,
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_strict_mode = 1
#innodb獨享表空間,有點很多,缺點會導致單個表文件過大
#innodb_file_per_table = 1
#undo日志回滾段 默認為128
innodb_undo_logs = 128
#傳統機械硬盤建議使用,而對於固態硬盤可以關閉
#innodb_flush_neighbors = 1
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
#控制是否使用獨立purge線程
innodb_purge_threads = 1
#改為ON時,允許單列索引最大達到3072。否則最大為767
innodb_large_prefix = 1
innodb_thread_concurrency = 8
#開啟后會將所有的死鎖記錄到error_log中
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 16M
########semi sync replication settings########
#半同步復制
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
#表示轉儲每個bp instance LRU上最熱的page的百分比。通過設置該參數可以減少轉儲的page數。
innodb_buffer_pool_dump_pct = 40
#刷臟的進程N-1
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
#控制回收(收縮)undo log的頻率.undo log空間在它的回滾段沒有得到釋放之前不會收縮,
innodb_purge_rseg_truncate_frequency = 128
log_timestamps=system
#該參數基於MySQL5.7 Group Replication組復制的,沒有使用不要設置
#transaction_write_set_extraction=MURMUR32
#https://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html
show_compatibility_56=on