文章目錄
- Linux 環境下安裝 MySQL 8.0(二進制)詳細教程
- 準備工作
- 安裝依賴包
- 下載并解壓 MySQL
- 下載 MySQL 二進制包
- 解壓 MySQL
- 移動目錄并創建 MySQL 用戶
- 配置 MySQL
- 配置數據目錄與日志目錄
- 編輯配置文件 /etc/my.cnf
- 初始化 MySQL 數據庫
- 配置啟動腳本與環境變量
- 配置系統啟動腳本
- 配置環境變量
- 啟動 MySQL 服務
- 登錄 MySQL 并修改 root 密碼
- 使用初始化密碼登錄
- 修改 root 用戶密碼
- 允許遠程訪問(可選)
- 測試遠程連接
- 總結
- docker-compose.yml
- k8s
- configmap
- deployment
- svc
Linux 環境下安裝 MySQL 8.0(二進制)詳細教程
在生產環境或部分場景下,我們通常不會直接使用 yum
或 apt
安裝 MySQL,而是通過官方提供的二進制 tar 包進行安裝。本文以 CentOS 7.x 為例,詳細記錄 MySQL 8.0.34 的安裝步驟及配置方法。
準備工作
安裝依賴包
MySQL 運行需要依賴一些系統庫,因此需要提前安裝:
yum -y install tar # 安裝 tar 解壓工具
yum -y install libaio # 異步 I/O 庫
yum -y install numactl # NUMA 支持庫
下載并解壓 MySQL
下載 MySQL 二進制包
可以到 MySQL 官方下載頁面 獲取相應的版本。本文以 mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz 為例。
解壓 MySQL
tar xf mysql-8.0.34-linux-glibc2.12-x86_64.tar.xz
移動目錄并創建 MySQL 用戶
創建 MySQL 專用的用戶和用戶組:
groupadd mysql
useradd -g mysql mysql
將解壓后的文件移動至 /usr/local/mysql
:
mkdir -p /usr/local/mysql
mv mysql-8.0.34-linux-glibc2.12-x86_64/* /usr/local/mysql/
配置 MySQL
配置數據目錄與日志目錄
創建 MySQL 數據和日志存儲目錄,并授權給 mysql 用戶:
mkdir -p /data/app/mysql/
chown -R mysql:mysql /data/app/mysql/mkdir -p /usr/local/mysql/log
touch /usr/local/mysql/log/mysql_error.log
chown -R mysql:mysql /usr/local/mysql
編輯配置文件 /etc/my.cnf
根據實際需求編寫配置文件,例如:
[mysql]
# MySQL客戶端默認字符集
default-character-set=utf8mb4
socket=/tmp/mysql.sock[mysqld]
skip_ssl
skip_name_resolve# 端口與時區
port=3306
default_time_zone='+08:00'# 表名大小寫(Linux默認區分大小寫,若跨平臺建議設置為1)
lower_case_table_names=1# 二進制日志
log_bin=master-bin
server_id=10
binlog_format=ROW
sync_binlog=1
expire_logs_days=10
max_binlog_size=500M# 目錄
basedir=/usr/local/mysql
datadir=/data/app/mysql
socket=/tmp/mysql.sock# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci# 存儲引擎
default_storage_engine=INNODB
max_allowed_packet=64M
key_buffer_size=32M# InnoDB優化
innodb_buffer_pool_size=2G # (2C4G改成1G,8C16G改成8G)
innodb_buffer_pool_instances=2
innodb_buffer_pool_dump_at_shutdown=1
innodb_buffer_pool_load_at_startup=1
innodb_flush_method=O_DIRECT
innodb_log_file_size=512M # (2C4G可改256M,8C16G可改2G)
innodb_log_buffer_size=64M
innodb_lock_wait_timeout=50
innodb_io_capacity=2000
innodb_io_capacity_max=4000# 慢查詢日志
slow_query_log=1
slow_query_log_file=/usr/local/mysql/log/master.slow
long_query_time=2# 錯誤日志
log_error=/usr/local/mysql/log/mysql_error.log# SQL模式(MySQL8推薦嚴格模式)
sql_mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY# GTID復制
gtid_mode=ON
enforce_gtid_consistency=TRUE
log_slave_updates=ON
binlog_checksum=NONE# 連接與超時
max_connections=500 # (2C4G改200,8C16G可到2000)
max_connect_errors=1000
wait_timeout=120
interactive_timeout=120# Performance Schema
performance_schema=ON# 線程池(需要企業版/社區版Percona才支持,官方MySQL可忽略)
# thread_handling=pool-of-threads
初始化 MySQL 數據庫
執行初始化操作,生成數據文件和 root 初始密碼:
cd /usr/local/mysql/bin/
./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/app/mysql
初始化完成后,可通過以下命令查看初始 root 密碼:
cat ../log/mysql_error.log
日志中會出現類似以下內容:
A temporary password is generated for root@localhost: y_U(lb-D/3Lj
請記下該密碼,用于首次登錄。
配置啟動腳本與環境變量
配置系統啟動腳本
復制官方提供的啟動腳本并賦予執行權限:
cp /usr/local/mysql/support-files/mysql.server /etc/rc.d/init.d/mysqld
chmod +x /etc/rc.d/init.d/mysqld
如有需要,可編輯 /etc/rc.d/init.d/mysqld
中的 basedir
與 datadir
。
配置環境變量
為了方便直接使用 mysql
命令,將 MySQL 的 bin 目錄加入系統 PATH:
echo 'export PATH=$PATH:/usr/local/mysql/bin/' >> /etc/profile
source /etc/profile
啟動 MySQL 服務
檢查 MySQL 狀態并啟動服務:
/etc/rc.d/init.d/mysqld status
/etc/rc.d/init.d/mysqld start
登錄 MySQL 并修改 root 密碼
使用初始化密碼登錄
mysql -u root -p'y_U(lb-D/3Lj'
注意:如果出現
libtinfo.so.5
缺失,可通過以下方法解決:
[root@test ~]# mysql -uroot -p
mysql: error while loading shared libraries: libtinfo.so.5: cannot open shared object file: No such file or directory
[root@test ~]# find / -name libtinfo.so*
/usr/lib64/libtinfo.so.6
/usr/lib64/libtinfo.so.6.2
[root@test ~]# ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5
[root@test ~]#
find / -name libtinfo.so*
ln -s /usr/lib64/libtinfo.so.6.2 /usr/lib64/libtinfo.so.5
修改 root 用戶密碼
進入 MySQL 后執行以下語句:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '123.com';
FLUSH PRIVILEGES;
允許遠程訪問(可選)
如果需要遠程登錄,可將 root 用戶的 host 設置為 %
:
USE mysql;
UPDATE user SET host='%' WHERE user='root';
FLUSH PRIVILEGES;
測試遠程連接
mysql -u root -p'123.com' -h <server_ip> -P3306
如果連接正常,說明 MySQL 已安裝并配置成功。
總結
以上就是在 Linux 下通過 tar 包安裝 MySQL 8.0 的完整步驟。總結下關鍵點:
- 選擇二進制包安裝的原因:可控性更強、版本靈活、適合生產環境定制化需求。
- 注意初始化密碼:安裝后第一次必須使用日志中的臨時密碼。
- 安全建議:不要直接暴露 root 用戶遠程訪問,建議新建具有相應權限的業務賬戶。
docker-compose.yml
注:
官方鏡像
version: '3.8'services:mysql:image: mysql:8.0.34container_name: mysql-testrestart: alwaysenvironment:MYSQL_ROOT_PASSWORD: "123.com" # 初始化 root 密碼(需要 Dockerfile 中支持此變量)ports:- "3307:3306" # 宿主機端口映射volumes:- ./data:/var/lib/mysql # 數據持久化到當前目錄- ./my.cnf:/etc/my.cnf # 自定義 my.cnf(可選)networks:- mysql-netnetworks:mysql-net:driver: bridge
my.cnf
[mysqld]
# 基本配置
user=mysql
port=3306
basedir=/usr/local/mysql
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock# 字符集
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci# 日志相關
slow_query_log=1
slow_query_log_file=/var/lib/mysql/mysql-slow.log
long_query_time=2# 緩存大小示例
innodb_buffer_pool_size=256M# 其他根據需求定制
k8s
configmap
apiVersion: v1
kind: ConfigMap
metadata:name: mysql-confignamespace: test
data:my.cnf: |[mysqld]character-set-server=utf8mb4collation-server=utf8mb4_unicode_cislow_query_log=1slow_query_log_file=/var/lib/mysql/mysql-slow.loglong_query_time=2log-error=/var/lib/mysql/mysql-error.logmax_connections=1000max_connect_errors=1000wait_timeout=28800# 時區設置default_time_zone='+08:00'
deployment
apiVersion: apps/v1
kind: Deployment
metadata:name: mysqlnamespace: test
spec:replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: harbor-ioscar.cbf.com/hawk/mysql:8.0.34env:- name: MYSQL_ROOT_PASSWORDvalue: "123.com"ports:- containerPort: 3306volumeMounts:- name: mysql-datamountPath: /var/lib/mysql- name: mysql-configmountPath: /etc/mysql/conf.dreadOnly: truevolumes:- name: mysql-datahostPath:path: /data/mysql/testtype: DirectoryOrCreate- name: mysql-configconfigMap:name: mysql-config
svc
apiVersion: v1
kind: Service
metadata:name: mysqlnamespace: test
spec:selector:app: mysqlports:- protocol: TCPport: 3306targetPort: 3306nodePort: 30505 # 可以換成自己的端口type: NodePort