mysql版本升级

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

 

导入成功,并进行检查。

原文地址:https://www.cnblogs.com/hmwh/p/9661731.html