升级MySQL
一条规则: 不能跳过中间的几个版本。 从5.1到5.5 升级前的准备: 1、备份全部的数据 2、通过手册熟知 其中哪些是不兼容的或者说是哪些功能在新版本中已经实现。 3、执行mysql_upgrade 升级系统表。 该程序不会升级 help table 4、对于rpm包安装的DB,客户端和server端都要升级。 5、对于UDF,可能 出现的问题就是自己编写的和系统自带的冲突,这个时候只要删除即可。 6、对于稳定版的MYSQL,可以尝试直接移动format 文件和数据文件。 7、可以先对原先的MYSQL重名名目录名。新的MYSQL有问题的话,再重新命名回来。 8、对于my.cnf的修改, mysqld –print-defaults 可以使用这个进行检查。 9、对于 commands out sync 或者 unexpected core dumps 这个是由于旧的头文件和链接库。mysql.h file and libmysqlclient.a 检查这两个文件是否是 新版本的MYSQL 10、进行测试的时候,只需要就数据库的mysql 数据库的全部数据,和其他数据库的表结构。 然后在测试的DB 上进行升级。 对于新版本的数据库,相关程序接口,连接驱动程序 也应该进行相应的升级, 有可能出现 java 存储过程的问题。 对于复制过程的升级步骤; 升级过程是 先对所有的slave进行升级,最后升级master 降级过程:对于 sbr rbr有要求,要求 必须先应用完毕。 具体实施注意事项 1、备份的时候 用mysqldump 是最安全的。(因为是直接的SQL语句) 2、前期版本的bug或者其他问题在升级前是需要注意的。 配置文件的变化; innodb_file_io_threads 变为: innodb_read_io_threads and innodb_write_io_threads 3、对于存储过程中含有repaire table 并且带有use_frm的选项的时候,应将其先删除,因为该选项会重建索引,由于frm版本不一致会失败。 4、对于5.5中,flush tables 的一个变种: flush tables ta1_name [, tb1_name] ... with read lock 对命令行中指出的表进行flush 和锁表操作。 该语句执行的时候,会申请一个互斥锁,这个时候它会等待事务结束。然后会从table cache中flush tables,再重新打开表,再次申请锁并将锁的粒度有互斥降级为共享锁。这个时候其他线程就可以读取该表中数据。 对于--skip-grant-tables 这个参数的理解: 服务器在启动的时候,根本不会使用权限系统,这个时候任何人可以连接,不受限制的访问所有数据库。当然 使用 flush-priveliges 或者reload 我们又可以进行权限的检查。 5、对于5.5中,truncate table 对于 含有foreign key 的情况会报错。 6、在升级过程中,保留错误日志是很重要的,如果有错误信息正在写入error log ,这个时候执行 flush logs 操作,这个时候 error-log 会变为 error-log.old 可能造成部分信息的丢失, 最好是在启动mysql之前,将error log 移动到一个新的地方。 7、SQL语句的变化, delete 语句中的使用别名: Incorrect: DELETE FROM t1 AS a2 USING t1 AS a1 INNER JOIN t2 AS a2; DELETE t1 AS a2 FROM t1 AS a1 INNER JOIN t2 AS a2; Correct: DELETE FROM t1 USING t1 AS a1 INNER JOIN t2 AS a2; DELETE t1 FROM t1 AS a1 INNER JOIN t2 AS a2;