MYSQL 升级方式有两种,一种叫做In-place Upgrade,另一种叫logical upgrade(逻辑升级方式)。
Logical upgrade:利用mysqldump直接导出sql文件,然后倒入到新库中,适用于跨度大的版本的升级方案,做法相对安全,并能整理表中碎片。但如果有数据量较大的库需要mysqldump导出,时间就会很长。
In-place upgrade:他的工作方法简单快速,就是直接替换掉原来版本的MySQL的安装目录和my.cnf配置文件,利用mysql_upgrade 脚本来完成系统表的升级。
注意:跨小版本升级可以使用in-place这种方法。
1、in-place upgrade
1.1. 环境介绍
IP: 172.16.10.22
数据目录:/mydata/mysql/mysql3306/data
安装目录:/usr/local/mysql5.6
配置文件:/etc/my3306.cnf
当前版本:5.6.38
1.2. 升级(5.6.38升级到5.7.20)
a) 设置INNODB_FAST_SHUTDOWN参数设置为0
set global innodb_fast_shutdown=0;
innodb_fast_shutdown有0,1,2三个值。参数0代表mysql关闭,innodb需要完成所有full purge和merge insert buffer操作,这个过程需要一定的时间,有事可能会花上几个小时。参数值为1是该参数的默认值,表示关闭mysql时不完成full purge和merge insert buffer操作,但是缓冲池中的脏页还是会写到磁盘中。参数值为2时,表示既不完成full purge和merge insert buffer 操作,也不将缓冲池中的脏页刷新到磁盘,而是将日志写入到日志文件中。
b) 关闭mysql服务
mysqladmin -S /tmp/mysql3306.sock -uroot -pmysql shutdown
c) 替换mysql的安装文件和参数以及路径
cp /soft/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz /usr/local/
tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
unlink mysql5.6
ln -s mysql-5.7.20-linux-glibc2.12-x86_64 mysql5.7
mv /etc/my3306.cnf /etc/my3306.cnf.bak
vi /root/.bash_profile
export PATH=$PATH:/usr/local/mysql5.7/bin
source /root/.bash_profile
cd /mydata/mysql/
mv mysql3306 mysql3307
由于我的数据文件路径是:/mydata/mysql/mysql3306/data
现在需要修改成:
/mydata/mysql/mysql3307/data
设置新的my3307.cnf文件(具体情况具体修改):
[client]
port = 3307
socket = /tmp/mysql5.7.sock
[mysql]
prompt="\u@db \R:\m:\s [\d]> "
no-auto-rehash
[mysqld]
user = mysql
port = 3307
basedir = /usr/local/mysql5.7
datadir = /mydata/mysql/mysql3307/data
log_bin_trust_function_creators=1
socket = /tmp/mysql3307.sock
lower_case_table_names=1
character-set-server = utf8mb4
skip_name_resolve = 1
innodb_undo_log_truncate=1
open_files_limit = 65535
back_log = 1024
max_connections = 500
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
table_open_cache_instances = 64
thread_stack = 512K
external-locking = FALSE
max_allowed_packet = 32M
sort_buffer_size = 4M
join_buffer_size = 4M
thread_cache_size = 768
query_cache_size = 0
query_cache_type = 0
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
slow_query_log = 1
slow_query_log_file = /mydata/mysql/mysql3307/logs/slow.log
log-error = /mydata/mysql/mysql3307/logs/error.log
long_query_time = 0.1
server-id = 3307101
log-bin = /mydata/mysql/mysql3307/logs/mysql-binlog
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 1G
max_binlog_size = 1G
expire_logs_days = 7
master_info_repository = TABLE
relay_log_info_repository = TABLE
gtid_mode = on
enforce_gtid_consistency = 1
log_slave_updates
binlog_format = row
relay_log_recovery = 1
relay-log-purge = 1
key_buffer_size = 32M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
lock_wait_timeout = 3600
explicit_defaults_for_timestamp = 1
innodb_thread_concurrency = 0
innodb_sync_spin_loops = 100
innodb_spin_wait_delay = 30
transaction_isolation = REPEATABLE-READ
innodb_buffer_pool_size = 1024M
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 1
innodb_buffer_pool_dump_at_shutdown = 1
innodb_data_file_path = ibdata1:1G:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 2
innodb_max_undo_log_size = 4G
innodb_io_capacity = 2000
innodb_io_capacity_max = 4000
innodb_flush_neighbors = 0
innodb_write_io_threads = 8
innodb_read_io_threads = 8
innodb_purge_threads = 4
innodb_page_cleaners = 4
innodb_open_files = 65535
innodb_max_dirty_pages_pct = 50
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_checksum_algorithm = crc32
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_file_per_table = 1
innodb_online_alter_log_max_size = 4G
internal_tmp_disk_storage_engine = InnoDB
innodb_stats_on_metadata = 0
innodb_status_file = 1
innodb_status_output = 0
innodb_status_output_locks = 0
performance_schema = 1
performance_schema_instrument = '%=on'
#innodb monitor
innodb_monitor_enable="module_innodb"
innodb_monitor_enable="module_server"
innodb_monitor_enable="module_dml"
innodb_monitor_enable="module_ddl"
innodb_monitor_enable="module_trx"
innodb_monitor_enable="module_os"
innodb_monitor_enable="module_purge"
innodb_monitor_enable="module_log"
innodb_monitor_enable="module_lock"
innodb_monitor_enable="module_buffer"
innodb_monitor_enable="module_index"
innodb_monitor_enable="module_ibuf_system"
innodb_monitor_enable="module_buffer_page"
innodb_monitor_enable="module_adaptive_hash"
[mysqldump]
quick
max_allowed_packet = 32M
d) 启动mysql服务
启动过程需要加上 --skip-grant-tables和--skip-networking 参数,来保证没有任何的应用连接,让升级过程更加安全。
/usr/local/mysql5.7/bin/mysqld_safe --defaults-file=/etc/my3307.cnf --skip-grant-tables --skip-networking &
错误日志很多报错:
证明系统没有升级系统表信息。
e) 升级系统数据字典信息
/usr/local/mysql5.7/bin/mysql_upgrade -S /tmp/mysql3307.sock
没有报错表示系统表升级成功。
f) 正常启动MYSQL不使用--skip-grant-tables和--skip-networking 参数
/usr/local/mysql5.7/bin/mysqladmin -S /tmp/mysql3307.sock -uroot -pmysql shutdown
/usr/local/mysql5.7/bin/mysqld_safe --defaults-file=/etc/my3307.cnf &
/usr/local/mysql5.7/bin/mysql -S /tmp/mysql3307.sock -uroot -pmysql
查看sys库也存在:
2、logical upgrade
第二种办法多用于跨度大的版本升级,我一般是用于一台服务器迁移到另一台服务器:
例如,我从5.1.72升级到5.7.20
首先利用MySQLDUMP 出数据库文件,由于版本差距太大,我把导出的SQL文件引擎全部换成INNODB。
在5.1.72库上执行:
mysql -S /tmp/mysql.sock -uroot -p smsdbtest > /soft/smsdbtest.sql
把导出的文件传到安装的5.7.20库上进行导入:
导入:
mysql -S /tmp/mysql3307.sock -uroot -p smsdbtest < /soft/smsdbtest.sql
导入成功,并进行检查。