一、MySQL 版本选择
1. MySQL5.6以后的版本,推荐使用官方版本。
2. MySQL在5.6以后不断重构源码,安装包越来越大,功能和性能在持续改进。
3. MariaDB:无Innodb,且核心代码较老。
## 二、MySQL 官网介绍
1. **官方网站**:https://www.mysql.com
2. **模块介绍**:
- **DOWNLOADS**: MySQL下载
* MySQL Enterprise Edition :MySQL企业版
* MySQL Community (GPL) Downloads :MySQL社区版,我们使用此版本
## 三、MySQL 下载
1. 下载地址:https://dev.mysql.com/downloads/mysql/
2. 下载Linux操作系统安装包时建议操作系统选择“Linux-Generic” Generic [dʒəˈnerɪk] adj. 通用的
3. 推荐Version 5.7.X,不推荐Version 5.5.X,有部分bug。
## 四、MySQL 安装
```
1. rpm安装
2. 通用二进制安装包安装(以下演示此方式安装)
3. 源码编译安装(不推荐)
-主要用于内核调试
```
### 1. 安装通用步骤:
* 解压缩安装包`mysql-VERSION-linux-glibc2.5-x86_64.tar.gz`到/usr/local目录;
* 进入到解压后的目录,打开`INSTALL_BINARY` 文件,按照`shell>`开头的步骤进行操作。
* 将`export PATH=/`安装路径`../mysql/bin:$PATH`添加到`/etc/profile`
* `chkconfig mysqld on`或者`chkconfig mysqld.server on` (视你的环境而定)来设置开机自启动,之后可通过service管理服务。
### 2. MySQL 5.6.X 安装
```
1. 卸载操作系统自带的mariadb
[root@Study ~]# rpm -qa |grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
[root@Study ~]# yum remove -y mariadb-libs-5.5.60-1.el7_5.x86_64
2. 上传下载好的安装包到/opt目录并解压到/usr/local目录
[root@Study opt]# tar -zxf mysql-5.6.27-linux-glibc2.5-x86_64.tar.gz -C /usr/local/
3. 进入到/usr/local/mysql-5.6.27-linux-glibc2.5-x86_64目录,打开INSTALL-BINARY文件,按照shell>开头的步骤进行操作。
83 shell> groupadd mysql
84 shell> useradd -r -g mysql mysql
85 shell> cd /usr/local
86 shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
87 shell> ln -s full-path-to-mysql-VERSION-OS mysql
88 shell> cd mysql
89 shell> chown -R mysql .
90 shell> chgrp -R mysql .
# 若是生产环境,进行初始化之前需要先将my.cnf上传到/etc目录。
91 shell> scripts/mysql_install_db --user=mysql
# 初始化MySQL;若提示“-bash: scripts/mysql_install_db: /usr/bin/perl: 坏的解释器: 没有那个文件或目录”,则需要执行 yum install -y 'perl(Data::Dumper)' 来安装perl。
92 shell> chown -R root .
93 shell> chown -R mysql data
94 shell> bin/mysqld_safe --user=mysql &
# 此时MySQL已经启动,可ctrl+c后使用ps查看进程。
95 # Next command is optional
96 shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell> chkconfig --add mysql.server #之后可使用service管理mysql服务
4. 接着将export PATH=/usr/local/mysql/bin:$PATH添加到/etc/profile文件并使用source /etc/profile重载一下配置。
5. 最后我们就可以在任意目录登录mysql了。
[root@Study ~]# mysql -uroot #MySQL5.6默认root用户是空密码
6. 给root用户设置密码(mysql5.6需要通过passwod()函数,passwod()对密码进行哈希处理。)
mysql> set password = password('123');
#MySQL启动
1. "mysqld_safe --user=mysql &" 即可启动MySQL,mysqld_safe是一个守护mysql的进程,旨在当mysql发生意外中断时可自动重启mysql进程。
2. 也可以使用/etc/init.d/mysql.server start (启动脚本以复制的实际名字为准,通常改为mysqld等)来启动。
```
### 3. MySQL 5.7.X 安装
- 官方文档:https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html
- 说明:以下安装步骤和官方文档略有不同,但都可以。
```
1. 卸载操作系统自带的mariadb
[root@Study ~]# rpm -qa |grep mariadb
mariadb-libs-5.5.60-1.el7_5.x86_64
[root@Study ~]# yum remove -y mariadb-libs-5.5.60-1.el7_5.x86_64
2. 上传下载好的安装包到/opt目录
3. 按照如下步骤操作
shell> groupadd mysql
shell> useradd -r -s /bin/false mysql -g mysql
shell> cd /usr/local
shell> tar zxvf /opt/mysql-VERSION-OS.tar.gz -C /usr/local
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> mkdir mysql-files
shell> chmod 770 mysql-files
shell> chown -R mysql .
shell> chgrp -R mysql .
# 若是生产环境,进行初始化之前需要先将my.cnf上传到/etc目录。
shell> bin/mysql_install_db --user=mysql # Before MySQL 5.7.6
shell> bin/mysqld --initialize --user=mysql # MySQL 5.7.6 and up;需要记录生成的密码。
shell> bin/mysql_ssl_rsa_setup # MySQL 5.7.6 and up
#此步骤的作用(即hava_ssl 是YES,若不执行此命令,则不支持ssl)如下:
mysql> show variables like '%ssl%';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
+---------------+-----------------+
9 rows in set (0.00 sec)
shell> chown -R root .
shell> chown -R mysql data mysql-files
shell> bin/mysqld_safe --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server
shell> chkconfig --add mysql.server #之后可使用service管理mysql服务
4. 接着将export PATH=/usr/local/mysql/bin:$PATH添加到/etc/profile文件并使用source /etc/profile重载一下配置。
5. 最后我们就可以在任意目录登录mysql了。
[root@Study ~]# mysql -uroot -p #提示需要先修改root密码
mysql> set password = '123456'; #设置root密码为123456,mysql5.7设置密码时不用使用password()函数。
```
## 五、配置文件my.cnf说明
### 1. 姜承尧的MySQL配置文件,MySQL 5.6.X 和 MySQL 5.7.X 都可以用。
```
测试服务器配置:4核8G
#[mysqld]表示此标签下的参数在所有mysql版本中都生效。
[mysqld]
########basic settings########
server-id = 11
port = 3306
user = mysql
#bind_address = 10.166.224.32
#autocommit = 0 即自动提交。此参数在mysql5.6中初始化前需要注释掉,之后再关闭mysql去掉注释。
autocommit = 0
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
max_connect_errors = 1000
#datadir = 为数据文件等存放位置,它的所有者和所属组都必须是mysql
datadir = /usr/local/mysql/data
transaction_isolation = READ-COMMITTED
explicit_defaults_for_timestamp = 1
join_buffer_size = 134217728
tmp_table_size = 67108864
tmpdir = /tmp
max_allowed_packet = 16777216
sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
interactive_timeout = 1800
wait_timeout = 1800
read_buffer_size = 16777216
read_rnd_buffer_size = 33554432
sort_buffer_size = 33554432
########log settings########
log_error = error.log
slow_query_log = 1
slow_query_log_file = 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
long_query_time = 2
min_examined_row_limit = 100
########replication settings########
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
sync_binlog = 1
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log = relay.log
relay_log_recovery = 1
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
innodb_page_size = 8192
#innodb_buffer_pool_size 物理内存的 70%-80%即可,若物理内存很大(256G)可设90%
innodb_buffer_pool_size = 6G
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_lru_scan_depth = 2000
innodb_lock_wait_timeout = 5
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_flush_method = O_DIRECT
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
#innodb_log_group_home_dir 的所有者和所属组必须要都是mysql
#innodb_log_group_home_dir = /redolog/
#innodb_undo_directory 的所有者和所属组必须要都是mysql
#innodb_undo_directory = /undolog/
innodb_undo_logs = 128
innodb_undo_tablespaces = 3
innodb_flush_neighbors = 1
#innodb_log_file_size = 1G 生产环境中至少要2G,建议设置4G,初始化之前要修改;默认值是48M
innodb_log_file_size = 1G
innodb_log_buffer_size = 16777216
innodb_purge_threads = 1
innodb_large_prefix = 1
innodb_thread_concurrency = 64
innodb_print_all_deadlocks = 1
innodb_strict_mode = 1
innodb_sort_buffer_size = 67108864
########semi sync replication settings########
plugin_dir=/usr/local/mysql/lib/plugin
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
#[mysqld-5.7] 表示此标签下的参数只在mysqld-5.7.x版本中生效。
[mysqld-5.7]
innodb_buffer_pool_dump_pct = 40
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
innodb_purge_rseg_truncate_frequency = 128
binlog_gtid_simple_recovery=1
log_timestamps=system
transaction_write_set_extraction=MURMUR32
show_compatibility_56=on
```
### 2. 配置文件my.cnf中几个重要参数配置和说明
```
innodb_log_file_size = 4G #做测试可调小一点,但生产环境建议4G。
innodb_undo_logs = 128 #建议在安装之前就确定好该值,后续修改比较麻烦。
innodb_undo_tablespaces = 3 #建议在安装之前就确定好该值,后续修改比较麻烦。
datadir #它的权限是 mysql:mysql
innodb_log_group_home_dir #它的权限是 mysql:mysql
innodb_undo_directory #它的权限是 mysql:mysql
```
### 3. my.cnf问题
```
1. 配置文件my.cnf的读取顺序。
使用mysqld --help -v| grep my.cnf 可以查看mysql的配置文件的读取顺序。
[root@Study ~]# mysqld --help -v|grep my.cnf
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default
说明:
<1>.mysql启动时会依次读取/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/mysql/etc/my.cnf、~/.my.cnf四个配置文件,
若后读取的配置文件中和前面的配置文件中有相同项但设置的值不一样,mysql会以后面的为准,即参数覆盖原则。
<2>.若一台服务器上安装了多个版本的mysql,可使用--defaults-files可指定配置文件,指定后则该mysql仅使用指定的配置文件。
[root@Study ~]# mysqld --help -vv|grep defaults-file
--defaults-file=# Only read default options from the given file #.
2. 修改配置文件my.cnf
当更换my.cnf文件后需要重新初始化。(修改个别参数时只需要关闭mysql即可)
<1>. 关掉mysql服务并清空data目录(生产环境决不允许!!!);
<2>. 重新初始化;
#若my.cnf中若指定了error.log,则临时密码会保存在此文件中(如temporary password is generated for root@localhost: i4;1?CZ=c?C))
shell> bin/mysqld --initialize --user=mysql #
shell> bin/mysql_ssl_rsa_setup
<3>. 重新启动mysql
<4>. 登录即可(临时密码在error.log中)
```
## 六、MySQL 升级
### 1. 环境说明
```
1. 已安装 MySQL 5.6.27
2. datadir = /usr/local/mysql/data
#如果datadir指定的单独的目录,即数据和程序不在同一个目录下,例如datadir=/data,程序安装在/usr/local/mysql,则以下升级步骤中的第5步就不用做。
3. root密码已设置:123
4. 操作目的:将MySQL 5.6.27升级到MySQL 5.7.39
说明:一般说来,MySQL数据库的二进制数据文件,也就是my.cnf中的配置项datadir所在的位置,和MySQL应用程序安装的位置是分开的,
仅通过配置项告诉MySQL数据库的数据存在datadir这个目录下。当程序和数据分离以后,方便我们对数据库应用程序做版本的升级或者回退。
```
### 2. 升级步骤
```
注意:先停掉mysql服务
1. 将MySQL 5.7.39的tar包解压到/usr/local目录
[root@Study opt]# tar -zxf mysql-5.7.39-linux-glibc2.12-x86_64.tar.gz -C /usr/local
2. 安全的停掉当前运行的 MySQL 5.6.27
[root@Study ~]# service mysql.server stop
3. 取消原有MySQL 5.6.27的软链接
[root@Study ~]# cd /usr/local
[root@Study local]# unlink mysql
4. 重新建立新版本的软链接(注意修改所有者和所属组为mysql)
[root@Study local]# ln -s mysql-5.7.39-linux-glibc2.12-x86_64 mysql
5. 从旧版mysql目录中拷贝data目录到新版mysql的软链接目录中(注意data目录的所有者和所属组均为mysql)
[root@Study local]# cp -a mysql-5.6.27-linux-glibc2.5-x86_64/data mysql
-----------------------------------------------------------------
【版本回退】
1. 备份MySQL 5.6.27版本的系统表到opt目录
[root@Study local]# cp -a /usr/local/mysql/data/mysql /opt/
2. 软链接重做,拷贝data目录到旧版本,拷贝备份的系统表到旧版本
3. 启动即可
-----------------------------------------------------------------
# 此时,MySQL应用程序版本已升级完成,可直接启动mysql服务。
# 且可以使用 mysql -uroot -p(原密码)进入数据库。
# 执行show databases;看到存在test表,但没有sys表(数据的二进制文件兼容)
# 此时去看error.log会发现有很多的WARNNING,所以这个时候我们需要使用 mysql_upgrade 去升级。
6. 使用mysql_upgrade更新系统表(mysql8.0.16及以后的版本不需要执行此步)
[root@Study local]# mysql_upgrade -s -p
# 参数-s一定要加,表示只更新系统表(-s 即upgrade-system-tables,系统表指的是../data/mysql),如果不加-s则会把所有库的表以5.7.39的方式重建,生产库千万别这样!
# 当一些老的版本的存储格式需要新的特性来提升性能时,可不加-s参数。
# 参数-p是输入密码,若旧版本未设置密码,则-p参数不用加。
7. 此时连接mysql,执行show databases;可以看到存在test表和sys表,表示已全部升级完毕。
```
最后修改时间:2025-01-07 09:46:16
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。