MySQL 3.23 中文参考手册 |
| 后退 |
4.16 升级/降级MySQL时有什么特别的事情要做? |
前进 |
|
|
| 2004-02-12 MySQL 译者:晏子 http://www.mysql.com/doc.html |
|
| |
只要你有MySQL同一个的基础版本,你总可以在同样的体系结构上的不同版本之间的移动MySQL表格(form)和数据文件。当前的基础版本是3。如果你通过重新编译MySQL改变字符集(也可以改变排序顺序),你必须在所有的表上运行myisamchk -r -q,否则你的索引不能正确被排序。
如果你偏执于或担心新版本,你总能重新命名的旧mysqld为类似于mysqld-'old-version-number'。那么如果你的新mysqld做一些意外的事情,你可以简单地关掉它并重启你的旧mysqld!
当你做一个升级时,当然你也应该备份你的旧数据库。有时有点偏执狂是好的!
在升级后,如果你重新编译客户程遇到问题,像Commands out of sync或意外的核心倾倒,在编译你的程序时,你可能使用了一个旧的头文件或库文件。在这种情况下,你应该检查你的“mysql.h”文件和“libmysqlclient.a”库文件的日期以证实他们来自新的MySQL发行。如果不是,请重新编译你的程序!
如果你有些问题,新的mysqld服务器不想启动或你不能没有口令连接,检查你确实没有来自你的旧安装的一些旧的“my.cnf”文件!你可以用program-name --print-defaults检查。如果这输出任何非程序名字的任何东西,你有一个活跃my.cnf文件将可以影响一些事情!
无论何时你安装一个新版本的MySQL,重新构造并重新安装Msql-Mysql-modules分发是一个好主意,特别是在升级MySQL后,如果你注意到诸如你的所有DBI脚本倾倒核心症状。
4.16.1 从一个3.22版本升级到3.23
MySQL 3.23支持新MyISAM类型和旧ISAM类型的表。你不必须变换你的旧式表给3.23使用。缺省地,所有的新表将用类型MyISAM创建(除非你使用--default-table-type=isam选项启动mysqld)。你可以用ALTER TABLE或Perl脚本mysql_convert_table_format将一个ISAM表转换成一个MyISA表。
3.22和3.21客户将毫无问题地与一个3.23服务器一起工作。
当升级到3.23时,下面列出你必须注意的事情:
INNER和DELAYED现在是保留字。
FLOAT(X)现在是一个真正的浮点类型。
当声明DECIMAL(length,dec)时,长度参数不再包括一个符号或小数点位置。
一个TIME字符串必须是下列现有格式之一:[[[DAYS] [H]H:]MM:]SS[.fraction]或[[[[[H]H]H]H]MM]SS[.fraction]。
现在,LIKE使用'='同样的字符比较规则比较字符串。如果你要求旧的行为,你可以用CXXFLAGS=-DLIKE_CMP_TOUPPER标志编以MySQL。
REGEXP现在对正常(不是二进制的)字符串是忽略大小写的。
在你检查/修复表时,对MyISAM表(.MYI),你应该使用myisamchk,而对ISAM(.ISM)表使用isamchk。
如果你想要你的mysqldumps在MySQL3.22和3.23之间兼容,你应该不使用mysqldump的--opt或--full选项。
检查所有对DATE_FORMAT()的调用,保证在在每个格式字符前有一个“%”。
mysql_fetch_fields_direct现在是函数(它以前是一个宏)并且它返回一个指向MYSQL_FIELD的指针而不是一个MYSQL_FIELD。
mysql_num_fields()可以不再被用在一个MYSQL*对象上(它现在是一个函数,拿MYSQL_RES*作为一个参数)。相反你现在应该使用mysql_field_count()。
在MySQL3.22,SELECT DISTINCT ...的输出几乎总是被排序的。在3.23上,你必须使用GROUP BY或ORDER BY获得排序的输出。
如果没有匹配的行,SUM()现在返回NULL,而不是 0。这是遵照ANSI SQL。
新的限制词:CASE、THEN、WHEN、ELSE和END。
4.16.2 从一个3.21版本升级到3.22
没有影响相容性的东西在3.21和3.22之间已改变。唯一的缺陷是用DATE类类型创建的新表将使用新方法存储日期。你不能从一个mysqld旧版本存取这些新字段。
在安装MySQL3.22 以后,你应该启动新的服务器并且然后运行mysql_fix_privilege_tables脚本。这将增加你使用GRANT命令所需的新权限。如果你忘记了这个,当你试着使用ALTER TABLE, CREATE INDEX或DROP INDEX时,你将得到Access denied。如果你的MySQL根用户要求一个口令,你应该把它作为一个参数给mysql_fix_privilege_tables。
mysql_real_connect()的C API接口改变了。如果你有一个旧的客户程序调用该函数,你必须放一个0作为新db参数(或为了快速连接重新编码发送的db单元的客户)。你在mysql_real_connect()前也必须调用mysql_init()!做这个改变允许新的mysql_options()函数在MYSQL处理程序结构中保存选项。
4.16.3 从一个3.20版本升级到3.21
如果你正在运行一个比3.20.28旧的版本并且想要换到3.21.x,你需要做下列事情:
你能用safe_mysqld --old-protocol启动mysqld3.21服务器从3.20分发的客户使用它。在这种情况下,新客户函数mysql_errno()将不返回任何服务器错误,而仅仅是CR_UNKNOWN_ERROR(但是它为客户错误服务)并且服务器使用旧的passwd() 检查而非新的一个。
如果你在而不是对mysqld使用--old-protocol选项,你将需要做下列改变:
所有的客户代码必须重新编译。如果你正在使用ODBC,你必须得到新的MyODBC 2.x驱动程序。
脚本scripts/add_long_password必须运行以便变换在mysql.user表中的Password字段为CHAR(16)。
所有在mysql.user中的口令必须被重新赋值(为了得到62位而非31位口令)。
表格式没变化,因此你不必须变换任何表。
MySQL3.20.28和以上版本可以处理新的user表格式而不影响客户。如果你有一个比3.20.28早的MySQL版本,如果你变换user表,口令将不再与之工作。因此为了安全,你首先应该升级到至少3.20.28并且然后升级到3.21.x。
新的客户代码可与一个3.20.x 版的mysqld服务器一起工作,因此如果你遇到3.21.x的问题,你可以使用旧的3.20.x服务器而无须重新编译客户。
如果你对mysqld不使用--old-protocol选项,旧的客户将发出错误消息:
ERROR: Protocol mismatch. Server Version = 10 Client Version = 9
新的Perl DBI/DBD接口也支持旧的mysqlperl接口。如果你使用mysqlperl,你必须做的唯一改变是改变到connect()函数的参数。新参数是:host、database、user、password(user和password参数改变了位置)。见20.5.2 DBI接口。
下列变化可能影响到旧的应用程序的查询:
现在HAVING必须在任何ORDER BY子句前被指定。
LOCATE()参数被交换了。
有一些新的保留字。最著名是DATE、TIME和TIMESTAMP。
4.16.4 升级到其他体系结构
如果你正在使用MySQL3.23,你能在不同的支持同样浮点格式的体系结构之间拷贝.frm、.MYI和.MYD。(MySQL考虑了任何字节交换的问题)。
MySQL ISAM数据“ *.ISD”和索引文件“ *.ISM”文件是依赖于系统结构并在某些情况下依赖于OS。如果你想要移动你的应用程序到有与你当前系统不同的体系结构或OS的其他机器上,你不应该试图通过简单地拷贝文件到另外的机器上来移动一个数据库,相反使用mysqldump。
缺省地,mysqldump将创建一个满是SQL语句的文件,然后你可以把文件转移到其他机器上并且把它作为mysql客户的输入。
试一试mysqldump --help看可得到什么选项。如果你正在移动数据到一个更新的MySQL版本,你应该用得到的更新的版本使用mysqldump --opt得到一个快速、紧凑的倒出(dump)。
最容易(尽管不是最快)的在2台机器之间移动一个数据库的方法是在数据库所在的机器上运行下列命令:
shell> mysqladmin -h 'other hostname' create db_name
shell> mysqldump --opt db_name
| mysql -h 'other hostname' db_name
如果你想要在一个慢的网络上从一台远程机器上拷贝一个数据库,你可以使用:
shell> mysqladmin create db_name
shell> mysqldump -h 'other hostname' --opt --compress db_name
| mysql db_name
你也可以在一个文件中存储结果, 然后把文件转移到目标机器并且在那里装载文件到数据库。例如,你能象这样在源机器上倾倒一个数据库到一个文件:
shell> mysqldump --quick db_name | gzip > db_name.contents.gz
(本例创建的文件被压缩) 转移包含数据库内容的文件到目标机器,并且在那里运行这些命令:
shell> mysqladmin create db_name
shell> gunzip < db_name.contents.gz | mysql db_name
你也可以使用mysqldump和mysqlimport完成数据库转移。对大数据库表,这比简单地使用mysqldump更快。在下列命令中,DUMPDIR代表你用来存储来自mysqldump的输出的目录的完整的路径。
首先,为输出文件和倾倒数据库创建目录:
shell> mkdir DUMPDIR
shell> mysqldump --tab=DUMPDIR db_name
然后转移在DUMPDIR目录下的文件到目标机器的一些相应目录并且在那里装载文件到MySQL:
shell> mysqladmin create db_name # create database
shell> cat DUMPDIR/*.sql | mysql db_name # create tables in database
shell> mysqlimport db_name DUMPDIR/*.txt # load data into tables
另外,别忘记拷贝mysql数据库,因为那是授权表(user、db、host)被存储的地方。你可能必须作为MySQL root用户在新机器上运行命令,直到你让mysql数据库到位。
当你在新机器上导入mysql数据库后,执行mysqladmin flush-privileges以便服务器再次装入授权表信息。
|
| |
|
|
| |
|
发表评论
关闭窗口
|
|
|
|