Skip to content

MySQL安装与配置

一、安装方式对比

方式适用场景优势劣势
包管理器安装快速部署标准版自动处理依赖关系版本选择受限
二进制包安装定制化生产环境版本灵活/隔离部署需手动处理依赖
源码编译安装深度定制/开发环境极致性能调优耗时/需开发工具链

二、安装

2.1 包管理器安装

bash
#CentOS/RedHat
sudo yum install -y mysql-server
sudo systemctl start mysqld

#Ubuntu/Debian
sudo apt install -y mysql-server
sudo systemctl start mysql

#自动初始化后获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log

2.2 二进制包安装

bash
#下载解压(以8.0.32为例)
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.12-x86_64.tar.xz
tar -xvf mysql-8.0.32-*.tar.xz -C /usr/local/
mv /usr/local/mysql-8.0.32 /usr/local/mysql

#创建系统用户
groupadd mysql
useradd -r -g mysql -s /bin/false mysql

#初始化数据库
/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

2.3 源码编译安装

bash
#安装依赖
yum install -y cmake ncurses-devel openssl-devel bison

#编译配置
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql
-DMYSQL_DATADIR=/data/mysql
-DSYSCONFDIR=/etc
-DWITH_INNOBASE_STORAGE_ENGINE=1
-DWITH_SSL=system

#编译安装
make -j$(nproc) && make install

三、核心配置项详解(my.cnf)

查看配置文件路径:

bash
mysqld --verbose --help | grep "my.cnf"

3.1 基础配置模块

ini
[mysqld]

#网络设置
port=3306
bind-address=0.0.0.0 # 允许远程连接

#文件路径
datadir=/data/mysql
socket=/var/lib/mysql/mysql.sock

#字符集配置
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

3.2 内存优化模块

ini

#缓冲池(推荐物理内存的60-80%)
innodb_buffer_pool_size=16G

#连接设置
max_connections=1000
thread_cache_size=100

#询缓存(8.0+已废弃)
#query_cache_type=0

3.3 日志管理模块

ini
ini

错误日志
log_error=/var/log/mysql/error.log

慢查询日志
slow_query_log=1
slow_query_log_file=/var/log/mysql/slow.log
long_query_time=2

二进制日志(主从复制)
server-id=1
log-bin=/var/log/mysql/mysql-bin
expire_logs_days=7

3.4 引入目录下配置

ini
!includedir /etc/my.cnf.d

四、安装后安全配置

4.1 密码策略加固

sql
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPassword123!';
SET GLOBAL validate_password.policy=STRONG;

4.2 远程访问控制

sql
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'UserPass123!';
GRANT SELECT,INSERT,UPDATE ON app_db.* TO 'app_user'@'192.168.1.%';
REVOKE SUPER ON . FROM 'root'@'%';

4.3 防火墙配置

bash
# CentOS
firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload

# Ubuntu
ufw allow 3306/tcp

4.4 忘记密码(8.0版本)

(1) 进入安全模式,跳过权限认证:

修改my.cnf

ini
[mysqld]
skip-grant-tables

(2) 重启服务

bash
# Ubuntu/Debian
sudo systemctl restart mysql   

# CentOS/RedHat
sudo systemctl restart mysqld

(3) 无密码登录

bash
mysql -u root -p  # 直接按回车(无需输入密码)

(4) 清空root密码

bash
USE mysql;
UPDATE user SET authentication_string = '' WHERE user = 'root';
FLUSH PRIVILEGES;
EXIT;

(5) 移除安全模式配置

删除配置项:my.cnf中的skip-grant-tables

(6) 设置新密码

bash
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword';
FLUSH PRIVILEGES;

密码需包含大小写字母、数字和符号,否则可能因安全策略报错


五、高级配置技巧

5.1 存储引擎优化

ini

# InnoDB配置
innodb_flush_log_at_trx_commit=1 # ACID保证
innodb_log_file_size=2G # 日志文件大小
innodb_file_per_table=ON # 独立表空间

# MyISAM配置(仅遗留系统需要)
key_buffer_size=512M

5.2 事务隔离级别

sql
-- 查看当前级别
SELECT @@transaction_isolation;

-- 设置级别(建议READ-COMMITTED)
SET GLOBAL transaction_isolation='READ-COMMITTED';

5.3 性能监控配置

ini
# 开启性能模式
performance_schema=ON

# 状态监控
userstat=1
innodb_monitor_enable=all

六、版本差异

功能点MySQL 5.7MySQL 8.0
密码策略validate_password插件内置密码强度组件
身份认证mysql_native_passwordcaching_sha2_password
默认字符集latin1utf8mb4
数据字典MyISAM系统表InnoDB事务型字典

七、配置样例

ini
[client]
user = root
password = StrongPassword123_
port = 3306
socket = /home/db/mysql/mysql/run/mysql.sock

[mysql]
init_command = set names utf8mb4
port = 3306
socket = /home/db/mysql/mysql/run/mysql.sock
prompt= \\u@<本机hostname>\\R:\\m:\\s [\d]>     # hostname is the server hostname

[mysqld]
# 主从配置唯一id。
server-id = 10  # denpend on server-id rule (slave:20/30/40)

port = 3306
user = mysql
basedir = /usr
datadir = /home/db/mysql/data
tmpdir = /home/db/mysql/tmp
socket = /home/db/mysql/mysql/run/mysql.sock
character_set_server=utf8mb4
collation_server= utf8mb4_bin
lower_case_table_names=1
pid-file=/home/db/mysql/mysql/run/mysqld.pid
log_timestamps=SYSTEM

# MySQL的对外IP地址
report_host=<本机生产IP>

max_connect_errors=18446744073709551615
local_infile=ON

# 在主库中关闭而在从库中打开。防止双活写库。
# read_only=OFF
# super_read_only=OFF

#Mysqldump -T信任目录
secure_file_priv = /home/db/mysql
#-------------------------------------binlog-----------------------------------------------
log_bin=/home/db/mysql/binlog/master-bin
binlog_cache_size=2M

binlog_rows_query_log_events=1

gtid-mode=on
enforce-gtid-consistency=on
binlog_format=ROW
sync_binlog=1

#-------------------------------------replication------------------------------------------
# rpl_semi_sync_master_enabled=1
# rpl_semi_sync_master_timeout=1000     # 1second
# rpl_semi_sync_slave_enabled=1
master_info_repository=table
relay_log_info_repository=table
relay_log=/home/db/mysql/binlog/relay/master-relay-bin
relay_log_recovery=ON
gtid_mode=ON
enforce_gtid_consistency=ON
group_concat_max_len=10240

#---------------------------------InnoDB Cluster--------------------------------------------
# plugin_load_add='group_replication.so'
# loose-group_replication_single_primary_mode=ON
# loose-group_replication_group_name='9c1bb66d-8c73-4223-ab11-1dec63d1d95b'
# loose-group_replication_start_on_boot=OFF
#本地IP及集群通信端口
# loose-group_replication_local_address='192.168.22.96:33061'
# loose-group_replication_group_seeds='192.168.22.96:33061,192.168.22.97:33061,192.168.22.98:33061'
# loose-group_replication_bootstrap_group=OFF

[mysqld-8.0.27]
log_replica_updates=ON
replica_parallel_type=LOGICAL_CLOCK
replica_preserve_commit_order=1
replica_parallel_workers=32
replica_pending_jobs_size_max=128M

[mysqld-8.0.23]
log_slave_updates=ON
slave_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=1
slave_parallel_workers=32
slave_pending_jobs_size_max=128M


[mysqld-5.7.33]
log_slave_updates=ON
slave_parallel_type=LOGICAL_CLOCK
slave_preserve_commit_order=1
slave_parallel_workers=32
slave_pending_jobs_size_max=128M


[mysqld]
#-------------------------------------slow log---------------------------------------------
slow_query_log=ON
slow_query_log_file = /home/db/mysql/log/mysql_slow.log
long_query_time = 10

#-------------------------------------error log--------------------------------------------
log_error =/home/db/mysql/log/mysql_error.log

#-------------------------------------thread-----------------------------------------------
max_connections = 10000         # dependent on machine parameter
key_buffer_size = 256M
max_allowed_packet = 128M
table_open_cache = 6000
table_open_cache_instances = 4                  # CPU COUNT and <64
sort_buffer_size = 8M
read_rnd_buffer_size=16M
join_buffer_size = 2M
tmp_table_size = 64M
max_heap_table_size = 64M
group_concat_max_len=10240

#-------------------------------------innodb-----------------------------------------------
innodb_data_file_path=ibdata1:1024M:autoextend
innodb_buffer_pool_size = 4G                    # physical memory’s 50%
innodb_buffer_pool_instances = 4        # CPU COUNT and <64
innodb_log_file_size = 1G
innodb_log_files_in_group = 4
innodb_log_buffer_size = 32M
innodb_lock_wait_timeout = 600
innodb_print_all_deadlocks=ON

innodb_thread_concurrency = 4                   # CPU COUNT and <64
innodb_flush_method=O_DIRECT
innodb_read_io_threads =32
innodb_write_io_threads =32
innodb_io_capacity = 20000              # HDD 800 SSD 4000--
innodb_temp_data_file_path=ibtmp1:512M:autoextend:max:32G
innodb_flush_log_at_timeout=2
log_bin_trust_function_creators=ON
transaction_isolation=READ-COMMITTED
innodb_undo_directory=/home/db/mysql/data
innodb_undo_log_truncate=ON
innodb_max_undo_log_size=2G
innodb_purge_rseg_truncate_frequency=16
innodb_page_cleaners = 4                                # CPU COUNT and <64
innodb_numa_interleave=ON
innodb_online_alter_log_max_size=2G

#-------------------------------------other------------------------------------------------
init_file=/home/db/mysql/scripts/performance_collection
default-time-zone='+08:00'
skip-name-resolve

[mysqld-5.7]
# binlog日志的自动清理时间,默认是99天,最大值就是99天。
expire_logs_days=30
default_authentication_plugin=mysql_native_password

# 8.0版本数据库专用参数
[mysqld-8.0]
# 8.0数据库使用,5.7中系统表依然使用MyISAM,使用该选项会导致数据全量导入失败
disabled_storage_engines='MyISAM,BLACKHOLE,FEDERATED,ARCHIVE,MEMORY'
innodb_print_ddl_logs=ON
default_authentication_plugin=mysql_native_password
binlog_transaction_dependency_tracking = WRITESET
slave_parallel_type = LOGICAL_CLOCK
slave_preserve_commit_order = ON

# binlog日志的自动清理时间,默认是99天,最大值就是99天。
binlog_expire_logs_seconds=2592000

[mysqld_safe]
malloc-lib=/usr/lib64/libtcmalloc.so