MySQL 升级方法指南大全

  • A+
所属分类:数据库技术

不兼容的变化:在MySQL 5.1.8开始,TYPE = engine_name 还仍然是 ENGINE = engine_name 的同义语法,但有警告。从5.2开始,将完全删除这种语法,并报告错误。
不兼容的变化:在MySQL 5.0.10中,触发器的命名空间已经改变了。在以前,触发器的名字必须和每个数据表都不一样。现在,只需要在数据库内唯一就行了。隐含的变化就是,DROP TRIGGER 语法使用模式名而非数据表名(模式名是可选参数,如果忽略了,就使用当前的模式)
当从5.0升级到5.0.10及更高时,则必须删除触发器后重新创建它们,否则升级后就无法删除触发器了。建议如下:

导出触发器:
SELECT CONCAT('CREATE TRIGGER ', t.TRIGGER_SCHEMA, '.', t.TRIGGER_NAME,
' ', t.ACTION_TIMING, ' ', t.EVENT_MANIPULATION, ' ON ',
t.EVENT_OBJECT_SCHEMA, '.', t.EVENT_OBJECT_TABLE,
' FOR EACH ROW ', t.ACTION_STATEMENT, '//' )
INTO OUTFILE '/tmp/triggers.sql'
FROM INFORMATION_SCHEMA.TRIGGERS AS t;
将触发器导出到文件 "/tmp/triggers.sql" 中去。

停止服务器,然后删除数据库目录下的所有 "TRG" 文件:
shell>rm -f */*.TRG
启动服务器,倒入触发器:
mysql> delimiter // ;
mysql> source /tmp/triggers.sql //
不兼容的变化:MySQL 5.1.6引进了触发器权限机制。以前,创建触发器需要有 SUPER 权限,现在,这个操作只需要有 TRIGGER 权限。这改善了权限安全状况
一些MySQL 5.1中作为保留关键字在MySQL 5.0中并没有作为保留关键字
新引入了 "INSTALL PLUGIN" 和 "UNINSTALL PLUGIN" 语句用于操作API插件。同样,创建 FULLTEXT 索引时,可以用 "WITH PARSER" 子句关联解析器插件
3、从 MySQL 4.1 升级到 MySQL 5.0

服务器部分:

不兼容的变化:InnoDB 和 MyISAM 表中空格结尾的 TEXT 字段索引顺序改变了。因此需要运行 "CHECK TABLE" 语句修复数据表,如果出现错误,就运行 "OPTIMIZE TABLE" 或 "REPAIR TABLE" 语句修复,甚至重新转储(用mysqldump)
不兼容的变化:从MySQL 5.0.15开始,如何处理 BINARY 字段中填充的值已经改变了。填充的值现在是 0x00 而非空格了,并且在取值的时候不会去除末尾的空格
不兼容的变化:从MySQL 5.0.3开始,DECIMAL 的实现方式已经改变了,5.0对 DECIMAL 的格式限制严格多了
不兼容的变化:在MySQL 5.0.3到5.0.5之间版本的 MyISAM 和 InnoDB 表中创建的 DECIMAL 字段升级到5.0.6之后会发生崩溃
不兼容的变化:从5.0.3开始,除非和主函数之间有辅助的符号链接,否则服务器将不再默认地加载用户自定义函数(UDFs),也可以通过 --allow-suspicious-udfs 选项来启用
不兼容的变化:5.0中禁用了更新日志(update log) ,不过可以用二进制日志(binary log)来代替它
不兼容的变化:5.0中不再支持 ISAM 类型存储引擎(作者:可以通过重新编译源代码支持,不过非常不建议这么做)
不兼容的变化:5.0中不再支持 MyISAM 的 RAID 选项,可以用 mysqldump 导出旧表然后重新导回去实现升级
在5.0.6中,记录存储过程和触发器的二进制日志发生了一些变化,详见手册的 "17.4 Binary Logging of Stored Routines and Triggers"
SQL部分:

不兼容的变化:从5.0.12开始,自然连接和使用 USING 的连接,包括外部连接的衍生形式,都按照SQL:2003标准来处理了;这个变化导致减少了自然连接和使用 USING 的连接产生的结果字段数,并且还将按照更合理的顺序显示这些字段,逗号比较符的优先顺序和 JOIN, LEFT JOIN 中的一样了
不兼容的变化:在以前,等待超时的锁会导致 InnoDB 回滚当前全部事务,从5.0.13开始,就只回滚最近的SQL语句了
不兼容的变化:触发器的变化,跟前面讲到的一样
不兼容的变化:从5.0.15开始,CHAR() 函数返回二进制字符串,而不是按照连接字符集格式的字符串。子句 USING charset_name 可以自定义返回结果的字符集
不兼容的变化:在5.0.13以前,NOW() 和 SYSDATE() 返回的结果一样。但从5.0.13开始,SYSDATE() 返回的是语句执行点的时间,这就可能和 NOW() 返回的结果不一样了,不过可以用 --sysdate-is-now 选项让 SYSDATE() 作为 NOW() 的同名函数
不兼容的变化:在5.0.13以前,GREATEST(x,NULL) 和 LEAST(x,NULL) 如果 x 不是 NULL 值,则返回 x 。从5.0.13开始,只要任何参数是 NULL ,就返回 NULL,跟Oracle一样
不兼容的变化:在4.1.13/5.0.8以前,DATETIME 的加0后就转换成 YYYYMMDDHHMMSS 格式,现在变成 YYYYMMDDHHMMSS.000000 格式了
不兼容的变化:在4.1.12/5.0.6中,语句 LOAD DATA INFILE 和 SELECT ... INTO OUTFILE 中,当 FIELDS TERMINATED BY 和 FIELDS ENCLOSED BY 的值都是空的时候,结果就被改变了。以前,字段都按照它显示的宽度来读写的。现在变成按照足够保存字段值的宽度来读写它。然而,对MySQL 4.0.12/5.0.6来说,那些在它们之前导出来的文件可能无法正确用 LOAD DATA INFILE 语句导入
一些MySQL 5.0中作为保留关键字在MySQL 4.1中并没有作为保留关键字
从5.0.3开始,DECIMAL 用更有效的格式来存储
5.0.3开始,在计算 DECIMAL 值和舍入精确值的时候采用精确数学
4.1中,FLOAT 或 DOUBLE 之间的比较碰巧没问题,但在5.0中可能就不行了
从5.0.3开始,VARCHAR 和 VARBINARY 字段中末尾的空格不再删除
从5.0.3开始,BIT 是一个独立的数据类型了,不再是 TINYINT(1) 的同名词了
MySQL 5.0.2增加了一些SQL模式以使对排除包含非法或者缺失值得记录有着更严格的控制
从5.0.2开始,关键字 SCHEMA 和 SCHEMAS 被认为分别是 DATABASE 和 DATABASES 的同名词
5.0中用户变量对大小写不敏感,而4.1中则不然
增加了一个新的启动选项 innodb_table_locks,它导致 LOCK TABLE 时也可以请求 InnoDB 表锁。这个选项默认打开,不过可能在 AUTOCOMMIT=1 和 LOCK TABLES 应用中会导致死锁
C API部分: