先前一直使用mysql5.7,最新公司新項目,無意翻閱看下5.x版本mysql官方已經不再支持,于是準備選用MySQL8,官方8.4版本是個長期支持版本,選則最新版本8.4.4,如下是MySQL官方對版本支持計劃
MySQL版本下載查看地址:https://dev.mysql.com/downloads/mysql/
本文基于docker安裝,docker版本如下,配置文件抽象出來,數據、日志輸出到服務器上
[root@uat-gateway-001 logs]# docker --version
Docker version 26.1.4, build 5650f9b
如下為詳細安裝步驟?
mysql
docker pull mysql:8.4.4啟動mysql8,目的提取配置文件到容器外
docker run -p 13308:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=ybwCloud@123 -d mysql:8.4.4#拷貝mysql配置文件到本地
docker cp mysql8:/etc/mysql /etc/docker/mysql8/config
#拷貝mysql配置文件數據源到本地
docker cp mysql8:/var/lib/mysql /etc/docker/mysql8/data
#在本地創建logs日志存儲文件
#創建錯誤日志存放文件
mkdir -p /etc/docker/mysql8/logs/error/
touch /etc/docker/mysql8/logs/error/error_log.log#不建議改
#創建查詢日志存放地址 原地址/var/lib/mysql/9056323b388c.log 最好復制源文件否則有權限問題
#在外部加了mysql權限沒成功,直接在運行容器時加了--privilged 也沒成功
mkdir -p /etc/docker/mysql8/logs/general/
touch /etc/docker/mysql8/logs/general/mysql_general.log
#創建慢查詢日志存放文件 原本存在/var/lib/mysql/9056323b388c-slow.log 最好復制源文件否則有問題
mkdir -p /etc/docker/mysql8/logs/show_query/
touch /etc/docker/mysql8/logs/show_query/show_query.log
#給日志賦權限
chmod 777 /etc/docker/mysql8/logs/error/error_log.log
chmod 777 /etc/docker/mysql8/logs/general/mysql_general.log
chmod 777 /etc/docker/mysql8/logs/show_query/show_query.log#chmod -R 777 /etc/docker/mysql8/logs/配置MYsql參數
vim /etc/docker/mysql8/config/my.cnf移除原始啟動容器
docker rm -f mysql8
mysql的配置文件需要抽象出來方便后續調整,否則重啟容器后配置丟失需要重新處理
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /etc/docker/mysql8/data
secure-file-priv= NULL#管理多因素身份認證功能
#authentication_policy=caching_sha2_password#server級別字符集,服務器安裝時指定的默認編碼格式,不要人為定義,讓系統自己定義
character-set-server = utf8mb4
#設置字段編碼
collation-server = utf8mb4_general_ci
#設置初始化連接編碼SET NAMES utf8mb4
init_connect='SET NAMES utf8mb4'#不區分數據大小寫
lower_case_table_names = 1
#innodb使用后臺線程處理數據頁的讀取IO(輸入輸出請求),根據cpu核數來更改默認是4
innodb_read_io_threads = 4
#數據庫落盤臟頁個數
innodb_io_capacity = 400#定義innodb存儲引擎的表數據和索引數據的最大內存緩沖區,看機器內存情況定
innodb_buffer_pool_size = 2G
#每個日志文件的大小,綜合大小到緩沖池大小的5%~100%,避免日志覆寫上不必要的緩沖池刷新行為。注意一個大的日志文件大小會增加恢復進程所需要的時間
#廢棄innodb_log_file_size = 128M
innodb_redo_log_capacity = 128M
#獨立表空間模式,每個數據庫的沒表表都會生成一個數據空間
innodb_file_per_table = 1#設置innodb線程的并發數
innodb_thread_concurrency=4#innodb存儲引擎下 Buffer Pool緩存大小,一般為物理內存的60%-70%存的60%-70%
innodb_buffer_pool_size=2G#innodb存儲引擎下,行鎖鎖定時間
innodb_lock_wait_timeout=10#每次事務提交的時候會把log buffer刷到文件系統中去,但并不會立即刷寫到磁盤。如果只是MySQL數據庫掛掉了,由于文件系統沒有問題數據不會丟失,減少由事務日志引起的磁盤 I/O
innodb_flush_log_at_trx_commit = 2#索引緩沖區大小
key_buffer_size = 512M#禁用 local-infile選項
local-infile = on#指定鏈接空閑多長時間斷開
lock_wait_timeout = 3600#鏈接十次數據庫服務不正常,會鎖住IP安全設置
max_connect_errors = 10#表描述符的緩存大小
table_open_cache = 20000#數據字典緩存中打開的表數量軟限制
table_definition_cache = 2000#每個線程的內存大小
thread_stack = 512k#每個需要排序的線程分配該大小的一個緩沖空間。增加該值可以加速ORDER BY或GROUP BY操作。不宜過大,占內存
sort_buffer_size = 2M#用于表關聯緩存空間(緩存塊嵌套循環連接) 可以避免多次的內表掃描,從而提高性能
join_buffer_size=2M#線程池緩存大小
thread_cache_size = 256#關閉一個交互鏈接之前所需要等待的時間秒
interactive_timeout = 600
#關閉一個非交互鏈接之前所需要等待的時間秒
wait_timeout = 600#最大進程連接數
max_connections = 6000
#用戶的最大鏈接數量,剩余鏈接數用于DBA管理
max_user_connections = 5800
# 暫存的等待的鏈接數量
back_log = 1024#默認存儲引擎 5.5以上默認就是InnoDB
default-storage-engine=InnoDB#臨時表的內存緩存大小
tmp_table_size = 32M#臨時表的最大值
max_heap_table_size = 512M#log settings 錯誤日志存放地址
log_error = /var/log/mysql/error/mysql-error.log
#通用查詢日志是否開啟 默認關閉 OFF關閉 ON開啟
general_log=OFF
#查詢日志地址
general_log_file = /var/log/mysql/query/mysql_general.log#開啟二進制日志 正常情況必須開啟 ON開啟 OFF關閉
log-bin=mysql-bin-log
#binlog的日志存放地址
#log_bin_basename=/var/log/mysql/binlog
log_bin = /var/log/mysql/mysql-binlogs/mysql-bin
# mysql binlog日志文件保存的過期時間,過期后自動刪除 一般不啟用,主從中更加不能啟用
#expire_logs_days = 5#顯示日志中的時間參數
log_timestamps = SYSTEM#配置時區
default-time_zone = '+8:00' #密碼加密方式
mysql_native_password=ON
#default_authentication_plugin = caching_sha2_password#服務能處理的請求包最大大小
max_allowed_packet = 512M#設置最大包,限制server接受的數據包大小
#slave_max_allowed_packet = 512M
replica_max_allowed_packet = 512M#打開的文件描述符限制
open_files_limit = 65536#標識數據庫
server_id = 1
#二進制文件大小
binlog_expire_logs_seconds = 604800#存儲整個事務生成的binlog event的內存大小
binlog_cache_size=10480
#二進制非事務語句的緩存大小
binlog_stmt_cache_size=4096#sync_binlog:是MySQL 的二進制日志(binary log)同步到磁盤的頻率。當每進行1次事務提交之后,MySQL將進行一次fsync之類的磁盤同步指令來將binlog_cache中的數據強制寫入磁盤。保證數據不丟失。
sync_binlog = 1#二進制啟用后,變量則啟用,控制是否可以信任存儲函數創建者,1 不會對創建存儲函數實施做控制
log_bin_trust_function_creators = 1# 檢索的行數必須達到此值才可被記為慢查詢
#min_examined_row_limit = 100# 作為從庫時生效,從庫復制中如何有慢sql也將被記錄
#log_slow_slave_statements = 1# Custom config should go here 調用/ect/mysql/conf.d下的配置文件
!includedir /etc/mysql/conf.d/
mysql.cnf是看著別人都有調整,我這里沒有對這個文件進行個性化調整配置
#配置mysql.cnf
#vim /usr/local/src/docker/mysql/config/conf.d/mysql.cnf
##############################
[mysql]
prompt = "\\u@\\d \\r:\\m:\\s>"
no_auto_rehash
loose-skip-binary-as-hex
################################
prompt = "\\u@\\d \\r:\\m:\\s>" #設置命令行工具的提示符 默認為 mysql>
no_auto_rehash #命令行工具中的自動命令補全功能
loose-skip-binary-as-hex #
啟動運行容器
docker run -p 3308:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD=設置數據庫root密碼 -e TZ=Asia/Shanghai \
-v /etc/docker/mysql8/config:/etc/mysql \
-v /etc/docker/mysql8/data:/etc/docker/mysql8/data \
-v /etc/docker/mysql8/logs:/var/log/mysql \
--privileged=true --restart=always -d mysql:8.4.4 --lower_case_table_names=1
#說明下,3308為容器外訪問端口,3306容器內訪問端口,-v 設置環境,冒號前為容器外路徑,冒號后為容器內路徑,privileged=true為給與最大權限,restart=always 自動啟動容器,lower_case_table_names 為0區分大小寫 1不區分大小寫
#創建庫、創建用戶、給用戶授權庫權限 % 表示隨處訪問,此處可以改為Ip固定Ip訪問,localhost本地訪問
CREATE USER 'user'@'%' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON youDatabase.* TO 'user'@'%';
這里踩雷幾處:
1:mysql8和MySQL5.7配置項很多對參數名稱進行調整,上述配置文件已調整為mysql8
2:mysql8默認使用的身份認證插件
3:重啟容器后,一直報錯原因是舊數據和新容器不兼容,后來data目錄全部刪除,重啟解決
4:binlog目錄5.7參數名log_bin_basename,8參數名log_bin,上述配置文件已調整可直接使用