MySQL 安装部署(源码/二进制)
本篇覆盖 MySQL 5.5 之前的
./configure源码安装、MySQL 5.6 的cmake源码编译安装、MySQL 5.7 二进制包(glibc 版)部署、初始化、启动配置、密码修改、服务管理以及my.cnf常用参数参考。
一、概述
源码版安装过程较复杂,技术要求高,但可以按需定制功能,生产环境如有特殊功能需求应尽量使用源码版。
MySQL 5.5 是编译方式的分界点:
| 版本 | 编译工具 |
|---|---|
| 5.5 之前 | ./configure + make |
| 5.5 及之后 | cmake + make |
二、MySQL 5.5 之前源码安装(了解)
2.1 编译准备
# 中文系统
yum groupinstall "开发工具" "开发库"
# 英文系统
yum groupinstall "Development tools" -y
# 编译工具与依赖
yum install gcc gcc-c++ ncurses-devel perl
查看 CPU 信息(影响编译速度):
cat /proc/cpuinfo
2.2 常用 configure 参数
可先导出参数帮助:
./configure --help > /root/Desktop/mysqlconfigure.help
| 参数 | 说明 |
|---|---|
--prefix |
安装家目录 |
--enable-assembler |
使用字符函数的汇编版本 |
--enable-profiling |
构建带剖析(profiling)代码的版本 |
--enable-local-infile |
允许外部表格数据导入数据库 |
--with-charset |
默认字符集(MySQL 支持约 30 多种) |
--with-collation |
默认字符校验规则(约 80 多种) |
--with-extra-charsets |
扩展字符集 |
--with-server-suffix |
数据库版本后缀 |
--with-pthread |
线程库 |
--with-unix-socket-path |
socket 文件路径 |
--with-tcp-port |
服务端口 |
--with-mysqld-user |
运行 mysqld 的系统用户 |
--with-libwrap |
支持 TCP Wrapper |
--without-debug |
关闭 debug 信息,提升性能 |
--with-mysqld-ldflags / --with-client-ldflags |
静态编译可提升 5%~10% 性能 |
--with-low-memory |
低内存支持 |
--with-mysqlmanager |
启用 MySQL 多实例管理器 |
--with-big-tables |
支持大表 |
存储引擎相关参数:
--with-example-storage-engine
--with-archive-storage-engine
--with-csv-storage-engine
--with-blackhole-storage-engine
--with-ndbcluster
--with-federated-storage-engine
5.1 之后存储引擎改为插件式,使用
--with-plugins指定要编译进去的引擎。
2.3 解压、配置、编译、安装
tar xf mysql/mysql-5.1.72.tar.gz -C /usr/src
cd /usr/src/mysql-5.1.72/
./configure --prefix=/usr/local/mysql \
--enable-assembler --enable-profiling --enable-local-infile \
--with-charset=gbk --with-extra-charsets=utf8,gb2312 \
--with-pthread \
--with-mysqld-ldflags=-all-static \
--with-client-ldflags=-all-static \
--with-low-memory --with-big-tables \
--with-plugins=myisam,innobase,ndbcluster \
--with-mysqlmanager
make
make install
编译完成后安装目录结构:
bin lib mysql-test sql-bench
docs include libexec share
2.4 安装后配置
第一步:编写配置文件
mkdir /usr/local/mysql/etc
vim /usr/local/mysql/etc/my.cnf
[mysqld]
port=3307
datadir=/data/mysql51
socket=/data/mysql51/mysql51.socket
pid-file=/var/run/mysqld/mysql51.pid
log=/var/log/mysqld/mysql51.log
log-error=/var/log/mysqld/mysqld51.log
[client]
socket=/data/mysql51/mysql5.socket
第二步:创建目录并授权
mkdir /data/mysql51 /var/run/mysqld/ /var/log/mysqld
chown -R mysql.mysql /data/mysql51 /var/log/mysqld /var/run/mysqld/ /usr/local/mysql/
第三步:配置服务脚本
cp /usr/src/mysql-5.1.72/support-files/mysql.server /etc/init.d/mysql51
vim /etc/init.d/mysql51
修改以下两行:
47 datadir=/data/mysql51
218 conf=/usr/local/mysql/etc/my.cnf
chmod 755 /etc/init.d/mysql51
第四步:初始化数据库
/usr/local/mysql/bin/mysql_install_db \
--datadir=/data/mysql51/ \
--user=mysql
若本机已安装 RPM 版 MySQL,则不要执行
mysql_secure_installation;未安装时再执行。
第五步:启动并登录
/etc/init.d/mysql51 start
# 没有服务脚本时可用 mysqld_safe 启动
/usr/local/mysql/bin/mysqld_safe \
--defaults-file=/usr/local/mysql/etc/my.cnf &
/usr/local/mysql/bin/mysql
2.5 socket 相关报错
若登录时报:
ERROR 2002 (HY000): Can't connect to local MySQL server through
socket '/tmp/mysql.sock' (111)
原因是编译时未指定 --with-unix-socket-path,客户端默认查找 /tmp/mysql.sock。可临时指定:
/usr/local/mysql/bin/mysql --socket=/data/mysql51/mysql5.socket
要免去每次指定,需在 my.cnf 中加入:
[client]
socket=/data/mysql51/mysql5.socket
为简化登录命令:
cp /usr/local/mysql/bin/mysql /bin/mysql5
2.6 关闭数据库
建议使用自带管理命令,不推荐直接用服务脚本:
/usr/local/mysql/bin/mysqladmin shutdown -p
三、MySQL 5.6 源码编译安装
3.1 编译前三切记
- 一定要安装软件依赖;
- 一定要学会看报错信息;
- 一定要学会自己查资料(官方文档、搜索引擎等)。
3.2 准备依赖
yum groupinstall "开发工具" "开发库"
yum groupinstall "Development tools" -y
yum install gcc gcc-c++ ncurses-devel perl cmake -y
下载源码包:
wget http://192.168.2.254/mysql/pack/mysql-5.6.41.tar.gz
3.3 cmake 常用参数
可通过以下命令查看支持的参数:
cmake . -LH
| 参数 | 说明 |
|---|---|
CMAKE_INSTALL_PREFIX |
MySQL 程序安装目录,默认 /usr/local/mysql |
DEFAULT_CHARSET |
服务器默认字符集,默认 latin1 |
DEFAULT_COLLATION |
默认校对规则,默认 latin1_general_ci |
ENABLED_LOCAL_INFILE |
是否允许 LOAD DATA INFILE,默认 OFF |
WITH_COMMENT |
编译备注信息 |
WITH_xxx_STORAGE_ENGINE |
静态编译进服务器的存储引擎;MyISAM、MERGE、MEMORY、CSV 默认已编译 |
WITHOUT_xxx_STORAGE_ENGINE |
不编译的存储引擎 |
SYSCONFDIR |
初始化参数文件目录 |
MYSQL_DATADIR |
数据文件目录 |
MYSQL_TCP_PORT |
服务端口,默认 3306 |
MYSQL_UNIX_ADDR |
socket 文件路径,默认 /tmp/mysql.sock |
3.4 编译安装
tar xf mysql-5.6.26.tar.gz -C /usr/src/
cd /usr/src/mysql-5.6.26/
cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql56 \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=gbk,gb2312 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1
make && make install
3.5 安装后配置
第一步:编写 my.cnf
mkdir /usr/local/mysql56/etc
vim /usr/local/mysql56/etc/my.cnf
[mysqld]
port=3307
user=mysql
datadir=/data/mysql56
log-error=/var/log/mysqld/mysql56-err.log
[mysqld_safe]
pid-file=/var/run/mysqld/mysql56.pid
socket=/data/mysql56/mysql56.socket
[client]
socket=/data/mysql56/mysql56.socket
第二步:创建目录并授权
mkdir /data/mysql56 /var/run/mysqld /var/log/mysqld
chown -R mysql.mysql /data/mysql56 /var/run/mysqld /var/log/mysqld /usr/local/mysql56/
第三步:初始化数据库
/usr/local/mysql56/scripts/mysql_install_db \
--user=mysql \
--basedir=/usr/local/mysql56 \
--datadir=/data/mysql56
第四步:启动服务
/usr/local/mysql56/bin/mysqld \
--user=mysql \
--basedir=/usr/local/mysql56 \
--datadir=/data/mysql56 \
--defaults-file=/usr/local/mysql56/etc/my.cnf &
/usr/local/mysql56/bin/mysql
简化登录命令:
cp /usr/local/mysql56/bin/mysql /usr/bin/mysql56
配置环境变量(多版本共存时不推荐):
export PATH=$PATH:/usr/local/mysql56/bin
# 写入 /etc/profile 末尾持久化
vim /etc/profile
# export PATH=$PATH:/usr/local/mysql56/bin
第五步:配置系统服务(可选)
cp /usr/local/mysql56/support-files/mysql.server /etc/init.d/mysql56
vim /etc/init.d/mysql56
修改为实际路径:
basedir=/usr/local/mysql56
datadir=/data/mysql56
conf=/usr/local/mysql56/etc/my.cnf
/etc/init.d/mysql56 start
chkconfig --add mysql56
chkconfig mysql56 on
至此源码版 MySQL 安装完成。
3.6 启动故障排查
熟悉以上五步,常见问题一般是:权限问题、参数写错、磁盘空间满。
排查手段:
- 重新初始化数据库;
- 查看是否有卡死进程;
- 使用以下命令检查配置文件,无报错即 OK,并会打印所有参数及值:
/usr/local/mysql/libexec/mysqld --verbose --help
多版本 MySQL 共存可能导致配置文件查找混乱,参数不生效甚至服务无法启动,需特别注意。
四、MySQL 5.7 二进制包安装
4.1 下载并解压
wget -P /root/ \
https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz
# 或从内网拷贝
scp 192.168.2.254:/www/mysql/pack/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz /root/
tar xf /root/mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz -C /usr/local
cd /usr/local
注意:二进制版安装目录重命名时必须命名为
mysql,否则会报错。
mv mysql-5.7.23-linux-glibc2.12-x86_64 /usr/local/mysql
4.2 编写配置文件
cd /usr/local/mysql
mkdir etc
vim etc/my.cnf
[mysqld]
user=mysql
port=3308
basedir=/usr/local/mysql
datadir=/data
log-error=/var/log/mysqld/mysql57-err.log
socket=/data/mysql57.sock
pid-file=/data/mysql57.pid
[mysqld_safe]
log-error=/var/log/mysqld/mysql57-err.log
pid-file=/data/mysql57.pid
[client]
socket=/data/mysql57.sock
4.3 创建目录与用户
mkdir -p /data /var/log/mysqld
# 未安装 mariadb 时系统不存在 mysql 用户,需手动创建
useradd -s /usr/sbin/nologin mysql
chown -R mysql.mysql /data /var/log/mysqld
4.4 初始化数据库
/usr/local/mysql/bin/mysqld --initialize \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/data
初始化使用的目录必须与配置文件一致。
初始化成功后,数据目录内应有:
auto.cnf ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1
mysql performance_schema sys
4.5 初始密码
初始密码存放在错误日志中:
cat /var/log/mysqld/mysql57-err.log | grep password
4.6 配置启动脚本
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
vim /etc/init.d/mysqld
basedir=/usr/local/mysql
datadir=/data
conf=$basedir/etc/my.cnf
启动:
/etc/init.d/mysqld start
验证端口:
lsof -i:3308
4.7 登录与密码修改
/usr/local/mysql/bin/mysql -p
加入环境变量简化命令:
export PATH=$PATH:/usr/local/mysql/bin
vim /etc/profile
# export PATH=$PATH:/usr/local/mysql/bin
修改初始密码:
/usr/local/mysql/bin/mysqladmin -uroot -p password "123"
五、my.cnf 参数参考大全
以下是 MySQL 5.7 常用配置参考。
5.1 基础设置
[client]
port = 3306
socket = /tmp/mysql.sock
[mysqld]
################################ 基础设置 ################################
# MySQL 服务唯一编号,主从复制中每个实例必须唯一
server-id = 1
# 服务端口,默认 3306
port = 3306
# 安装根目录
basedir = /opt/mysql
# 数据文件目录
datadir = /opt/mysql/data
# 临时目录,load data infile 会用到
tmpdir = /tmp
# socket 文件目录
socket = /tmp/mysql.sock
# 主要用于 MyISAM,多台服务器连接同一库时建议注释
skip-external-locking
# 只通过 IP 检查客户端登录,不使用主机名
skip_name_resolve = 1
# 事务隔离级别,默认可重复读(RC 可减少间隙锁)
transaction_isolation = READ-COMMITTED
# 默认字符集,utf8mb4 支持 emoji 等 4 字节字符
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# 客户端连接时设置字符集,防止乱码
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 时建议调大
max_allowed_packet = 128M
# 连接闲置超时(秒),interactive_timeout 需同时配置才生效
interactive_timeout = 1800
wait_timeout = 1800
# 内部内存临时表最大值,超过将写入磁盘
tmp_table_size = 134217728
max_heap_table_size = 134217728
# 查询缓存,多数情况下关闭
query_cache_size = 0
query_cache_type = 0
#------------------------ 用户进程内存设置 BEGIN ------------------------#
# 顺序扫描读缓冲,一般 128k~256k,用于 MyISAM
# read_buffer_size = 131072
# 随机读缓冲,按非索引字段排序时使用
# read_rnd_buffer_size = 262144
# order by / group by 缓冲,建议先设 2M
sort_buffer_size = 2097152
# 大事务不多时设为 1~2M,默认 32k
binlog_cache_size = 524288
#------------------------ 用户进程内存设置 END ------------------------#
# 短时间内可存入堆栈的请求数
# 官方建议 back_log = 50 + (max_connections/5),封顶 900
back_log = 130
5.2 日志设置
################################ 日志设置 ################################
# 错误日志
log_error = error.log
# 慢查询日志
slow_query_log = 1
slow_query_log_file = slow.log
# 记录未使用索引的 SQL
log_queries_not_using_indexes = 1
# 每分钟记录未使用索引 SQL 的条数上限
log_throttle_queries_not_using_indexes = 5
# 从库复制中的慢 SQL 也记录
log_slow_slave_statements = 1
# 慢查询阈值(秒)
long_query_time = 8
# 检索行数达到此值才可被记为慢查询
min_examined_row_limit = 100
# binlog 过期天数
expire_logs_days = 5
5.3 主从复制设置
################################ 主从复制设置 #############################
# 开启 binlog
log-bin = mysql-bin
# ROW 模式记录每行变更
binlog_format = ROW
# 只记录受影响的列
binlog_row_image = minimal
# master info / relay log info 存放于表
master_info_repository = TABLE
relay_log_info_repository = TABLE
# 级联复制时从库也记录 binlog
log_slave_updates
# 中继日志自我修复
relay_log_recovery = 1
# 主从复制时忽略的错误
slave_skip_errors = ddl_exist_errors
#---------------- redo log 与 binlog 关系 BEGIN ----------------#
# 提交流程:
# 1) prepare DML,将 redo log buffer 持久化到磁盘
# 2) prepare 成功后将事务日志持久化到 binlog
# 3) 成功后在 redo log 写入 commit 记录
#
# innodb_flush_log_at_trx_commit 与 sync_binlog 都为 1 最安全,但 IO 最频繁、最慢。
# =0:mysqld 进程崩溃可能丢失上一秒所有事务
# =2:仅操作系统崩溃或掉电才可能丢失上一秒事务
innodb_flush_log_at_trx_commit = 2
sync_binlog = 1
#---------------- redo log 与 binlog 关系 END ----------------#
5.4 InnoDB 设置
################################ InnoDB 设置 ##############################
# 数据页大小,默认 16k;8k 对 SELECT 吞吐更大
# innodb_page_size = 8192
# buffer pool 一般设为物理内存的 60%~70%
innodb_buffer_pool_size = 1G
# 5.7.6 之后默认 16M
# innodb_log_buffer_size = 16777216
# O_DIRECT 减少 OS VFS 缓存与 InnoDB buffer 的双重缓存
innodb_flush_method = O_DIRECT
# 支持压缩的文件格式,5.7.7 后默认
innodb_file_format = Barracuda
# 多核 IO 线程,读多写少可设为 2:6 比例
innodb_write_io_threads = 4
innodb_read_io_threads = 4
# 刷新脏页数量,根据近期 IOPS 调整
innodb_io_capacity = 500
# 锁等待超时(秒),超过报错:
# ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
innodb_lock_wait_timeout = 30
# buffer pool 转储时最近使用页的百分比
innodb_buffer_pool_dump_pct = 40
# redo log 目录与文件数量
innodb_log_group_home_dir = /opt/mysql/redolog/
innodb_log_files_in_group = 3
# 官方建议尽量大;单文件 <=256GB,总大小 <=512GB
innodb_log_file_size = 1024M
# undo log 目录与回收
innodb_undo_directory = /opt/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,后台 purge 线程数
# innodb_purge_threads = 4
# 并发线程限制,官方建议:
# 并发 < 64:设 0
# 负载较高:先设 128,再逐步降低到最佳值
# innodb_thread_concurrency = 0
# 将所有死锁记录到 error.log
innodb_print_all_deadlocks = 1
5.5 其他工具段
################################ 其他设置 ################################
[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
六、安装与启动小结
| 版本/方式 | 编译/部署工具 | 初始化命令 | 启动方式 |
|---|---|---|---|
| 5.1 源码 | ./configure + make |
mysql_install_db |
mysql.server / mysqld_safe |
| 5.6 源码 | cmake + make |
scripts/mysql_install_db |
mysqld / mysql.server |
| 5.7 二进制 | 解压即用 | mysqld --initialize |
support-files/mysql.server |
启动失败排查顺序:权限 → 配置参数 → 磁盘空间 → 残留进程 → 错误日志。
此处评论已关闭