MySQL 升级步骤
MySQL 5.1.72 升级到 MySQL 5.5.36
鉴于我在升级的时候遇到的麻烦问题,我觉得有必要把一些细节说清楚,免得引起误解了。感觉官方文档上的升级步骤写的比较简单,很容易引起混淆,感觉同我当时参照官方文档学习定制安装 MySQL 一样蛋疼。可能真的是外国淫的思维跟我差距太大了。
数据库情况:本人测试的都是 Linux Generic x86_64 版本的,也是定制安装到制定的数据库目录的。
详细升级步骤
1.MySQL 5.1.72 启动的实例 ins1
假设你已经安装了 MySQL 5.1.72,并且成功的启动了一个实例 ins1。软件可以在官网 MySQL 5.1.72 下载。
2.备份 ins1的数据和配置文件my1.cnf
无论以前操作了多少次升级步骤,升级前备份数据那是必须的!我这里是测试数据,就直接通过mysqldump 工具备份的,如果是生产库,可以使用 percona 公司的在线备份工具进行备份。
复制一份my1.cnf到其他位置进行备份,防止升级失败后能够快速的恢复 ins1。
3.关闭 ins1
mysqladmin -uroot -p -S $sockdir shutdown
4.通过 MySQL 5.5.36 启动 实例ins1 原来的数据目录,命名为 ins2
1)修改my1.cnf ,把一些与高版本不兼容的参数或者一些废弃的参数修改成高版本能够接受的参数。
2)用高版本的 MySQL 5.5.36 来启动,切记不要用低版本的 MySQL 启动,那样 my1.cnf 的修改也米有意义了。
因为高版本的系统库 mysql database 和低版本的 mysql database 会有一些表是不兼容的,所以为了让高版本的 MySQL 能够启动 低版本的系统数据,需要加上参数 --skip-grant-tables 来忽略mysql database 里授权表(grant tables)的验证。同时,忽略授权表启动 MySQL 实例 ins2 后, 为了保证 MySQL 实例的安全,可以加上参数 --skip-networking 来阻止通过网络来访问的客户端。
mysqld_safe --defaults-file=$cnf_path --skip-grant-tables --skip-networking &
5.执行 mysql_upgrade
启动实例 ins2 成功以后,通过高版本的 MySQL 5.5.36 的 bin 目录 mysql_upgrade 命令来升级 ins2
mysql_upgrade -uroot -p -S $socket_path
这个步骤实际执行的内容(来源于手册):
mysqlcheck --all-databases --check-upgrade --auto-repair mysql < fix_priv_tables mysqlcheck --all-databases --check-upgrade --fix-db-names --fix-table-names
如果看到最后面显示的OK,表示成功了
... mysql.time_zone_transition_type OK mysql.user OK percona51.ptablet OK Running 'mysql_fix_privilege_tables'... OK
6.重启 mysql 实例ins2
用MySQL 5.5.36 的二进制包(不是 MySQL 5.1.72)
mysqladmin -uroot -p -S $sockdir shutdown
#这次正常启动,不需要带上其他参数。
mysqld_safe --defaults-file=$cnf_path &
Percona Server 5.1.61 升级到 Percona Server 5.5.39
Percona Server 是 Percona 公司根据 MySQL 存在的一些性能上的缺陷进行改进,从而形成了一个新的免费的 MySQL 版本。 他们的升级文档就是三个字来形容就是 “太简单”,为了把一些步骤说清楚,也为了我以后少走点弯路,我还是把我升级步骤详细的罗列出来,以供日后查阅吧。
这次升级我从安装 Percona Server 实例开始讲述,因为 Percona 的配置文件和 MySQL 还是有部分区别的,新手用二进制文件安装的话可能需要一回来查找执行文件。
1.安装 Percona Server 5.1.61 实例 P1
2)解压缩文件,然后进入到安装目录下。
我这里是 /home/devops/Percona-Server-5.1.61
3)根据 配置文件来文件:Percona5.1.txt 安装系统库目录
这个目录是针对我自己的安装目录,参数需要根据自己的 OS 进行调整。主要需要注意的是如下几个参数:
#这两个参数在高版本的参数文件中需要调整 ledir = /home/devops/Percona-Server-5.1.61/libexec language = /home/devops/Percona-Server-5.1.61/share/mysql/english #根据自己内存大小来调整 innodb_buffer_pool_size = 256M
配置文件穿件完毕后,安装系统库。执行命令:
./bin/mysql_install_db --defaults-file=/home/devops/cnf/mysql4308.cnf --basedir=/home/devops/Percona-Server-5.1.61
4)验证系统库是否安装成功
要验证系统库是否安装成功,可以在参数文件中指定的data-dir目录下看看是否有 mysql,test文件夹,以及mysql文件夹下面是否有很多以 frm、MYI、MYD 接尾的系统文件。
5)启动实例 P1
$ cd /home/devops/Percona-Server-5.1.61/bin ./mysqld_safe --defaults-file=/home/devops/cnf/mysql4308.cnf & # ps -ef | grep 4308 验证是否成功,如果没有,请看看 MySQL 错误日志,是否哪里的参数出现了问题。
2.备份5.1参数文件,修改参数文件来满足 Percona 5.5 的参数要求(重要!!)
备份 mysql4308.cnf :$ cp mysql4308.cnf mysql4308_bak.cnf。修改 mysql4308.cnf 来符合 Percona Server 5.5.36 的参数需求,具体的差异可以查看 Percona文档,本人操作的时候主要修改了如下的几个参数:
ledir = /home/devops/percona/percona5.5.39/bin lc-messages-dir =/home/devops/percona/percona5.5.39/share
修改后的参数文件 文件:Percona5.5.txt
3.关闭 实例 P1,用 Percona Server 5.5.39 以(skip-grant-tables)方式启动 实例 P2
1)下载Percona Server 5.5.39 http://www.percona.com/redir/downloads/Percona-Server-5.5/Percona-Server-5.5.39-36.0/binary/tarball/Percona-Server-5.5.39-rel36.0-697.Linux.x86_64.tar.gz,解压缩。
2)重启 MySQL
这次是第一次用高版本的 MySQL软件启动低版本的数据,避免权限表的验证,需要加上 skip-grant-tables 参数。
cd /home/devops/percona/percona5.5.39/bin ./mysqladmin -uroot -p -S /home/devops/mysql4308/mysqld.sock shutdown ./mysqld_safe --defaults-file=/home/devops/cnf/mysq4308.cnf --skip-grant-tables --skip-networking &
note: 最后一步执行mysqld_safe的时候,很可能因为参数文件的参数不能被识别而导致出现启动错误,请根据错误日志的提示来修正。
4.执行 Percona Server 5.5.36 的 mysql_upgrade
./mysql_upgrade -uroot -p -S /home/devops/mysql4308/mysqld.sock
执行后如果出现下面的情况,表示 OK 了。
...... mysql.user OK percona51.ptablet OK Running 'mysql_fix_privilege_tables'... OK
5.关闭实例 P2,然后重启 MySQL
cd /home/devops/percona/percona5.5.39/bin mysqladmin -uroot -p -S /home/devops/mysql4308/mysqld.sock shutdown ./mysqld_safe --defaults-file=/home/devops/cnf/mysq4308.cnf &
6.验证是否成功
./mysql -uroot -p -S /home/devops/mysql4308/mysqld.sock
mysql> status -------------- ./mysql Ver 14.14 Distrib 5.5.39-36.0, for Linux (x86_64) using readline 5.1 .... Server version: 5.5.39-36.0-log Percona Server (GPL), Release 36.0, Revision 697 ....
可以看到版本是 5.5.39-36.0的了。
Percona Server 5.1.61 升级到 MySQL 5.5.36
可能是因为 Percona 和 MySQL 对于系统表空间的解读方式不一致,我在升级以后,发现无法用 MySQL 5.5.36 来启动 Percona Server 5.1.61 的实例。错误日志提示的是 共享表空间无法打开,暂时先不这么跨软件升级,以后闲的时候可以再看看两者的区别。
目前只是知道 Percona 对 MySQL 做了一些性能上的优化与拓展。
Percona5.1.txt
[client] port = 4308 socket = /home/devops/mysql4308/mysqld.sock [mysqld_safe] user = devops nice = 0 #ledir = /home/devops/percona/percona5.5.39/bin ledir = /home/devops/Percona-Server-5.1.61/libexec #ledir = /home/mysql/ #mysqld = @home_mysql_mysql_libexec_mysqld [mysqld] server-id = 2949 bind-address = localhost port = 4308 pid-file = /home/devops/mysql4308/mysqld.pid socket = /home/devops/mysql4308/mysqld.sock basedir = /home/devops/percona/Percona-Server-5.1.61 datadir = /home/devops/mysql4308 innodb_data_home_dir = /home/devops/mysql4308 innodb_log_group_home_dir = /home/devops/mysql4308 tmpdir = /home/devops/mysql4308 log-error = /home/devops/mysql4308/mysqld.log slow_query_log = 2 slow_query_log_file = /home/devops/mysql4308/mysql-slow.log log_bin = /home/devops/mysql4308/mysql-bin.log binlog_format = MIXED relay-log = mysqld-relay-bin user = devops language = /home/devops/Percona-Server-5.1.61/share/mysql/english #lc-messages-dir =/home/devops/percona/percona5.5.39/share table_cache = 512 long_query_time = 5 max_connections = 300 query_cache_type = 0 character-set-server = utf8 #default-character-set = utf8 default-storage-engine = innodb skip-external-locking expire_logs_days = 7 max_binlog_size = 100M max_allowed_packet = 16M # innodb plugin innodb_buffer_pool_size = 256M innodb_data_file_path = ibdata1:64M:autoextend innodb_autoextend_increment = 16 innodb_log_files_in_group = 2 innodb_log_file_size = 64M innodb_lock_wait_timeout = 5 innodb_flush_method = O_DIRECT innodb_flush_log_at_trx_commit = 0 innodb_file_per_table = 1 innodb_file_format = Barracuda innodb_file_format_check = ON #innodb_adaptive_checkpoint = estimate #innodb_expand_import = 1 innodb_read_io_threads = 8 #innodb_stats_method = nulls_unequal #innodb_strict_mode = 1 innodb_thread_concurrency = 12 innodb_write_io_threads = 3 innodb_read_io_threads = 3 innodb_io_capacity = 200 #innodb_adaptive_flushing = false # percona innodb_page_size=8k #innodb_extra_rsegments=8 #innodb_use_purge_thread=4 #innodb_stats_update_need_lock=0 #innodb_fast_checksum=1 #log_slow_verbosity=full #userstat_running=1 #enable_query_response_time_stats=1 # percona For SSD #innodb_adaptive_checkpoint=3 #innodb_flush_neighbor_pages=0 [mysqldump] quick quote-names max_allowed_packet = 16M default-character-set = utf8 [mysql] default-character-set = utf8
Percona5.5.txt