ITPub博客

首页 > 数据库 > > 第二章 安装和升级

第二章 安装和升级

作者:飘絮絮絮丶 时间:2020-05-14 13:37:03 0 删除 编辑

Mysql的版本号。例如 mysql-5.6.1-m1。

1.第一个数字5,是主要的版本,描述了文件格式。所有MYSQL 5版本有相同的文件 format

2.第二个号6是版本等级。综合来看,主要版本和发布级别构成发布系列号

3.第三个数字1 是系列版本的版本号。每增加一个新版本都会增加。 通常你需要你选择的系列的最新版本。


对于每个次要更新,版本字符串中的最后一个数字将递增。 当存在主要的新功能或与以前的版本不兼容时,版本字符串中的第二个数字将递增。 当文件格式改变时,第一个数字增加。


发行版名称还可以包含指示发行版的稳定性级别的后缀。 通过一组后缀释放一系列进度,以指示稳定级别如何提高。 可能的后缀是:

1.如果没有后缀,则表示该版本是“一般可用性(GA)”或“生产版本”。 GA版本是稳定的,已经成功地通过了所有早期的发布阶段,被认为是可靠的,没有严重的错误,并适用于生产系统。 只有重要的错误修正适用于该版本。


2.mN(例如,m1,m2,m3,...)表示里程碑编号。 MySQL开发使用里程碑模式,其中每个里程碑都会通过少数几个版本进行处理,并将重点放在一小部分经过全面测试的功能上。 在一个里程碑的发布之后,开发进行了另一个小版本的发布,着重于下一个小的功能集,也经过了彻底的测试。 里程碑版本中的功能可能被认为是预生产质量


3.rc表示发布候选版本。 发布候选人被认为是稳定的,已经通过了MySQL的所有内部测试,并修复了所有已知的致命运行时错误。 然而,这个版本还没有被广泛的使用到足够长的时间来确认所有的错误已经被识别出来。 只有微小的修补程序被添加。




选择好安装包后(分布式的二进制文件包),使用通用二进制文件进行安装需要注意下列事项:

1.如果之前使用yum或者at-get安装了系统自然包。请确保之前的包已经被移除,并且任何老版本的数据文件被提出。寒需要检查配置文件和mysq目录 例如 /etc/my.cnf 或/etc/mysql 被删除。



2.MYSQL 依赖 libaio 库。所以首先安装合适的 libaio:

yum install libaio

apt-get install libaio




通用 Unix/Linex 二进制包的 层级:

目录:

bin, scripts -- mysqld 服务,客户端和工具程序

data -- log文件,数据库

docs -- MYSQL 文档

man -- unix 主要页面

include -- Include(头)文件

lib -- 库

share -- 其他支持文件,包括错误消息,示例配置文件,用于数据库安装的SQL





使用 MYSQL binary distribution 安装,命令属性可能如下:


shell> groupadd mysql

shell> useradd -r -g mysql mysql

shell> cd /usr/local

shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz

shell> ln -s full-path-to-mysql-VERSION-OS mysql

shell> cd mysql

shell> mkdir mysql-files

shell> chmod 770 mysql-files

shell> chown -R mysql .

shell> chgrp -R mysql .

shell> bin/mysql_install_db --user=mysql # Before MySQL 5.7.6

shell> bin/mysqld --initialize --user=mysql # MySQL 5.7.6 and up

shell> bin/mysql_ssl_rsa_setup # MySQL 5.7.6 and up

shell> chown -R root .

shell> chown -R mysql data mysql-files

shell> bin/mysqld_safe --user=mysql &

# Next command is optional

shell> cp support-files/mysql.server /etc/init.d/mysql.server




注意:在MySQL 5.7.4 之前,这个过程没有为MYsql 账户分配密码。

secure_file_priv 限制了导出导入的目录为 mysql-files

在5.7.5 之前 mysql_install_db 创建了一个选项文件为my.cnf在安装目录。这个文件从包含分布式包my-default.cnf模板创建。



创建 mysql 用户和组

例如:

groupadd mysql

useradd -r -g mysql mysql

注意:此用户不需要登录权限,所以使用-r选项创建。





在linux 环境中安装mysql






启动服务器


如果安装保护了 mysqld_safe,那么可以如下启动MySQL 服务器:

bin/mysqld_safe --user=mysql &


如果包含systemd支持,还可以如下启动:

systemctl start mysqld


一般情况下,MySQL 使用非root用户启动,如果是用root 运行mysqld_safe,那么就像之前那样使用--user选项。否则可以在命令行中忽略--user选项。


如果命令立即失败,并打印出mysqld ended,检查错误日志(默认是在数据目录的,host_name.err文件中)


在 Windows 系统中是 C:\Program Files\MySQL\MySQL Server 5.7\data ,在Linux是 /usr/local/mysql/data,在source distribution中是 /usr/local/var



默认data 目录是当服务器被编译时的hardcode。要确定默认设置的路径,调用mysqld使用--verbose和--help选项。如果数据目录是系统上的位置,那么可以使用mysqld或mysqld_safe,加上--datadir选项指定位置。否则服务器将不正常工作。还有一种方式是,使用--basedir指定MYSQL 安装目录,mysqld会在这个目录下搜寻数据目录。


例如:

./mysqld --basedir=/usr/local --verbose --help


也可以指定--datadir ,但是--verbose --help 必须是末尾选项



一旦你确定了路径设置,使用不带--verbose 和--help 启动server



如果 mysqld 当前正在运行,你可以使用下列命令来找出路径设置:


mysqladmin variables

或

mysqladmin -h host_name variables


host_name 是 MYSQL 服务器主机名



确保mysql用户有访问data目录的权限,否则在启动mysqld的时候会出现Errcode 13 权限拒绝的错误。

例如,如果data目录是 /usr/local/mysql/var 用户是mysql,使用下列命令:

chown -R mysql /usr/local/mysql/var

chgrp -R mysql /usr/local/mysql/var




简单的测试:

检查服务是否启动

shell> bin/mysqladmin version

shell> bin/mysqladmin variables




bin/mysqladmin -u root -p version

如果有密码的话,需要使用-p选项,输入密码


关闭服务

bin/mysqladmin -u root shutdown



再次使用mysqld_safe 或者直接调用mysqld 启动

bin/mysqld_safe --user=mysql &


显示当前存在的数据库

bin/mysqlshow


如果指定了数据库,那么还可以显示数据库中的表,例如名称的mysql数据库中:

bin/mysqlshow mysql



执行sql查询信息:

bin/mysql -e "SELECT User, Host, plugin FROM mysql.user" mysql


到目前为止,服务器已经运行并能够访问。需要给一些初始化账户分配密码。




在下列情况下,密码可能已经被分配了:

1.在Windows中,会出现分配密码的选项。




2.如果使用mysqld --initialize是都初始化数据目录,那么只有账户'root'@'localhost'


在5.7版本只会创建'root'@'localhost'用户,但是在之前的版本,会有下列多个账户


--一些有root账户。这是超级用户,可以做任何事情。如果root用户为空密码,那么任何人可以连接到mysql并赋予权限。


在Windows中,根创建帐户,允许从本地主机连接,连接可以通过指定主机名localhost,IP地址127.0.0.1,或者IPv6地址::1。如果用户在安装过程中从远程机器选项中选择启用root访问权限,Windows安装程序将创建另一个允许从任何主机连接的根帐户。


在unix中,每个root账户允许从本地主机连接,连接可以通过指定主机名localhost,IP地址127.0.0.1,或者IPv6地址::1或者受信任的主机名或IP地址登录



'root'@'localhost'也有一行在 mysql.proxies_priv表中,可以为''@''赋予 PROXY权限,也就是所有用户所有主机。




检查账户是否存在

如果root用户的密码没有被分配,那么你可以使用下列方式登录:

mysql -u root



一旦登录之后,就可以确定在mysql.user中空密码的账户:

在5.7.6之后:

SELECT User, Host, HEX(authentication_string) FROM mysql.user;

--使用HEX()函数的原因是 存储在authentication_string字段的值可能包含二进制数据而不显示



在5.7.6之前


SELECT User, Host, Password FROM mysql.user;


SELECT语句结果可以根据MySQL版本和安装方法而有所不同。

下面的示例输出包括几个根用户和匿名用户帐户,它们都没有密码:





--为每个root用户分配密码,或者删除这些用户



另外,一些安装方法会创建一个测试数据库,并将行添加到mysql.db表中,允许所有帐户访问该数据库和其他名称以test_开头的数据库。 即使对于没有特殊权限的帐户(例如默认匿名帐户)也是如此。这对于测试非常方便,但在生产服务器上不适用。 希望数据库访问权限的管理员仅限于具有为此目的而显式授予的权限的帐户应删除这些mysql.db表行。


以下说明介绍了如何为初始MySQL帐户设置密码,首先为任何root帐户设置密码,然后为匿名帐户设置密码。 说明还包括如何删除匿名帐户,如果您不希望允许匿名访问,并介绍如何删除允许访问测试数据库。


将示例中的newpwd替换为您要使用的密码。 将host_name替换为服务器主机的名称。 您可以从前面显示的SELECT语句的输出中确定此名称。 对于显示的输出,host_name是myhost.example.com。




分配root 用户密码

要为帐户分配密码,请使用mysql客户端以超级用户身份连接到服务器,并发出相应的SQL语句:


在 MySQL 5.7.6 ,使用 ALTER USER:

mysql> ALTER USER user IDENTIFIED BY 'newpwd';


在 5.7.6之前,使用 SET PASSWORD;

mysql> SET PASSWORD FOR user = PASSWORD('newpwd');


以下说明使用ALTER USER。 如果您的MySQL版本早于5.7.6,请替换等效的SET PASSWORD语句。


要为“root”@“localhost”帐户分配密码,请以root身份连接到服务器:

shell> mysql -u root


然后发布 alter user 语句:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newpwd';


针对您的mysql.user表中没有密码的任何其他root帐户发出类似的ALTER USER语句。 (适当地改变主机名称。)


在帐户分配了密码后,只要使用该帐户连接到服务器,就必须提供该密码。 例如,要使用mysqladmin关闭服务器,请使用以下命令:


shell> mysqladmin -u root -p shutdown

Enter password: (enter root password here)



以下指令中的mysql命令包含一个-p选项,它基于您已经使用前面的指示分配了root帐户密码的假设,并且在连接到服务器时必须指定该密码。




给匿名用户分配密码

在MySQL 5.7中,创建匿名帐户的安装方法往往适用于ALTER USER无法用于分配密码的早期版本。 因此,本节中的说明使用SET PASSWORD。



要给“@'localhost'匿名帐户分配一个密码,以root身份连接到服务器:

shell> mysql -u root -p

Enter password: (enter root password here)


然后发出SET PASSWORD语句:

mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');


为您的mysql.user表中没有密码的任何其他匿名帐户发出类似的SET PASSWORD语句。 (适当地改变主机名称。)



移除匿名用户


如果您希望删除任何匿名帐户而不是分配密码,请使用DROP USER。要删除 ''@'localhost'帐户,请以root身份连接到服务器:

shell> mysql -u root -p

Enter password: (enter root password here)


发布 DROP USER 语句

mysql> DROP USER ''@'localhost';



为您要删除的任何其他匿名帐户发出类似的DROP USER语句。 (适当地改变主机名称。)



安全测试数据库:

一些安装方法创建一个测试数据库并设置访问权限。 如果在你的系统上这是真的,mysql.db表将包含允许任何用户访问测试数据库和其他名称以test_开头的数据库的行。 (这些行有一个空的用户列值,用于访问检查目的与任何用户名相匹配。)这意味着即使没有权限的帐户也可以使用这些数据库。 如果要删除任何用户对测试数据库的访问权限,请按如下操作:

shell> mysql -u root -p

Enter password: (enter root password here)

mysql> DELETE FROM mysql.db WHERE Db LIKE 'test%';

mysql> FLUSH PRIVILEGES;


FLUSH语句导致服务器重新读取授权表。 没有它,特权更改仍然不被服务器注意到,直到你重新启动它。


对于前面的更改,只有具有全局数据库特权或为测试数据库显式授予的特权的用户才能使用它。但是,如果您不希望数据库存在,请删除它:

mysql> DROP DATABASE test;




MYSQL 升级

支持的升级方法包括:

1.就地升级:涉及关闭旧的MySQL版本,用新的MySQL二进制文件或软件包替换,在现有的数据目录上重新启动MySQL,并运行mysql_upgrade。


2.逻辑升级:涉及使用mysqldump从旧的MySQL版本导出现有数据,安装新的MySQL版本,将转储文件加载到新的MySQL版本,以及运行mysql_upgrade。





在升级之前,检查下列信息,并执行建议步骤:

1.升级之前,通过创建当前数据库和日志文件的备份来保护您的数据。 备份应该包含mysql数据库,其中包含MySQL系统表



2.查看发行说明,其中提供了有关MySQL 5.7中新增功能的信息,或者与早期版本的MySQL发行版中的功能不同。 其中一些更改可能导致不兼容。

对于在MySQL 5.7中添加,弃用或删除的MySQL服务器变量和选项列表


3.如果您的MySQL安装包含大量数据,而这些数据在就地升级后可能需要很长时间进行转换,您可能会发现创建“虚拟”数据库实例以评估可能需要的转换以及涉及的工作 执行它们。 制作包含mysql数据库完整副本的MySQL实例副本,以及所有其他没有数据的数据库副本。 在此虚拟实例上运行升级过程,以查看可能需要执行哪些操作,以便在对原始数据库实例执行实际数据转换时,可以更好地评估涉及的工作。



4.建议您在安装或升级到新的MySQL版本时重建并重新安装Perl DBD :: mysql模块。 其他MySQL接口也是如此,例如PHP mysql扩展和Python MySQLdb模块。




执行就地(in-place)升级


注意:

如果升级最初通过安装多个RPM软件包生成的安装,请升级所有软件包,而不是升级一些软件包。 例如,如果您以前安装了服务器和客户端RPM,则不要仅升级服务器RPM。


执行就地升级:

1.前期检查

2.配置MySQL执行一个 慢关闭,例如;

shell> bin/mysql -u root -p password --execute="set global innodb_fast_shutdown=0"

3.关闭老(MySQL 5.6)服务器

4.慢速关闭后,从数据目录中删除InnoDB重做日志文件(ib_logfile *文件),以避免发行版之间可能发生的与重做日志文件格式更改相关的升级问题。

shell> rm ib_logfile*

5.升级MySQL二进制文件或软件包(将5.6版的二进制文件替换为5.7)。

6使用现有的数据目录启动MySQL 5.7服务器。

7.运行mysql_upgrade。例如:

shell> bin/mysql_upgrade -u root -p password


mysql_upgrade检查所有数据库中的所有表与当前版本的MySQL服务器不兼容。 mysql_upgrade也升级系统表,以便您可以利用新的特权或功能。


注意:

当服务器使用--gtidmode = ON运行时,不应该使用mysql_upgrade。 有关更多信息,请参阅GTID模式和mysql_upgrade .mysql_upgrade不会升级帮助表的内容。 有关升级说明,请参见第5.1.10节“服务器端帮助”。




执行 一个 逻辑升级

1.执行先前检查

2.从以前的MySQL版本导出您现有的数据:...


shell> mysqldump --add-drop-table --routines --events --add-drop-table-> --all-databases --force > data-for-upgrade.sql




注意:

如果您的数据库包含存储的程序,请在mysqldump中使用 - 例程和 - 事件选项(如上所示)。 --all-databases选项包括转储中的所有数据库,包括保存系统表的mysql数据库。



3.关闭旧服务

4.安装5.7新MYSQL

5.初始化新数据目录

shell> mysqld --initialize --datadir=/path/to/5.7-datadir


复制临时的'root'@'localhost'密码打印到您的屏幕或写入您的错误

记录日后使用。


6.使用新数据目录启动MySQL 5.7 服务


7.设置 root 密码:


shell> mysql -u root -p

Enter password: **** <- enter temporary root password

mysql> ALTER USER USER() IDENTIFIED BY 'your new password';


8.将之前创建的dump文件导入到新的MYSQL服务器。例如:


shell> bin/mysql -u root -p password --execute="source data-for-upgrade.sql" --force



9.运行 mysql_upgrade,例如:


shell> bin/mysql_upgrade -u root -p password


mysql_upgrade检查所有数据库中的所有表与当前版本的MySQL服务器不兼容。 mysql_upgrade也升级系统表,以便您可以利用新的特权或功能。



注意:

当服务使用--gtid-mode=NO运行时,mysql_upgrade 不应该被使用。

mysql_upgrade不会升级帮助表的内容。



10.配置MySQL来执行一个慢关闭,例如:



shell> bin/mysql -u root -p password --execute="set global innodb_fast_shutdown=0"



11.关闭和重启MySQL 服务来确保一个干净的关闭和启动。


innodb_fast_shutdown = 0。这个表示在MySQL关闭的时候,执行slow shutdown,不但包括日志的刷盘,数据页的刷盘,还包括数据的清理(purge),ibuf的合并,buffer pool dump以及lazy table drop操作(如果表上有未完成的操作,即使执行了drop table且返回成功了,表也不一定立刻被删除)。

innodb_fast_shutdown = 1。这个是默认值,表示在MySQL关闭的时候,仅仅把日志和数据刷盘。

innodb_fast_shutdown = 2。这个表示关闭的时候,仅仅日志刷盘,其他什么都不做,就好像MySQL crash了一样。

这个参数值越大,MySQL关闭的速度越快,但是启动速度越慢,相当于把关闭时候需要做的工作挪到了崩溃恢复上。




故障诊断

1.如果在升级中发生问题,例如新的mysqld服务不能启动,或则你不能无密码登录,验证在之前安装的my

.cnf不存在。

可以使用mysqld --print-defaults 选项来显示任何其他程序名,这就说明有一个活动的my.cnf文件影响服务器和客户端操作


2.如果在升级之后遇到编译客户端程序的问题,例如命令不同步或意外的核心转储,则在编译程序时可能使用了旧的头文件或库文件。 在这种情况下,请检查mysql.h文件和libmysqlclient.a库的日期以验证它们来自新的MySQL分发版。 如果没有,请用新的头文件和库重新编译你的程序。 如果库的主要版本号发生了变化(例如从libmysqlclient.so.15到libmysqlclient.so.16),则针对共享客户端库编译的程序也可能需要重新编译。


3.如果您创建了具有给定名称的用户定义函数(UDF),并将MySQL升级到实现具有相同名称的新内置函数的版本,则UDF变得不可访问。 要解决此问题,请使用DROP FUNCTION删除UDF,然后使用CREATE FUNCTION以不同的非冲突名称重新创建UDF。 如果新版本的MySQL实现了与现有存储函数同名的内置函数,情况也是如此。 有关描述服务器如何解释对不同类型函数的引用的规则,请参见第9.2.4节“函数名称解析和解析”。



SET optimizer_switch = 'derived_merge=off';

--derived_merge 优化器用来控制子查询视图的合并,默认是on。在DELETE或UPDATE 包含子查询查询相同表,并且更新相同表时可能需要改为off



就地降级:

1.检查变更

2.MYSQL 执行慢关闭:

shell> bin/mysql -u root -p password --execute="set global innodb_fast_shutdown=0"


在关闭缓慢的情况下,InnoDB在关闭之前会执行完整的清除和更改缓冲区合并,以确保数据文件在发行之间的文件格式差异的情况下完全准备好。


3.关闭新MySQL 服务器

4.慢速关闭之后,从数据目录中删除InnoDB重做日志文件(ib_logfile *文件),以避免发行版之间可能发生的与重做日志文件格式更改相关的降级问题。


rm ib_logfile*



5.通过用较旧的二进制文件或软件包替换旧版本,降级MySQL二进制文件或软件包。



6.启动旧版本MySQL 服务器


7.运行mysql_upgrade。

bin/mysql_upgrade -u root -p password

mysql_upgrade检查所有数据库中的所有表与当前版本的MySQL服务器不兼容,并在发现问题时尝试修复表。




执行逻辑降级

在同一发行版系列中的发行版之间进行降级并降级到以前的发行版级别时,支持逻辑降级。 只支持通用可用性(GA)状态版本之间的降级。 在继续之前请先阅读。


1.检查变更

2.dump 所有数据库,例如:

shell> bin/mysqldump --add-drop-table --events -u root -p password --all-databases --force > all_5_7_databases_dump.sql

3.关闭新Mysql服务

4.初始化旧MySQL 实例,使用空数据字典。例如,初始化5.6实例,使用 mysql_install_db --user=mysql


注意:从MySQL 5.7.6开始,mysql_install_db被弃用,因为它的功能 已经被集成到mysqld中。


要初始化MySQL 5.7实例,请使用带有--initialize或--initializeinsecure选项的mysqld。


shell> bin/mysqld --initialize --user=mysql


5.启动旧MySQL 服务


6.导入dump 文件到旧服务器,例如:

shell> bin/mysql -u root -p password --execute="source all_5_7_databases_dump.sql" --force


7.运行 mysql_upgrade,例如:

shell> bin/mysql_upgrade -u root -p password


mysql_upgrade检查所有数据库中的所有表与当前版本的MySQL服务器不兼容,并在发现问题时尝试修复表。


8.配置MySQL以执行缓慢关机。 例如:

shell> bin / mysql -u root -p password --execute =“set global innodb_fast_shutdown = 0”



9.关闭并重新启动MySQL服务器以确保干净的关闭和启动。


如果您从一个版本系列降级到另一个版本,表格存储格式可能会有不兼容的情况。 在这种情况下,使用mysqldump在降级之前转储您的表。 降级后,使用mysql或mysqlimport重新加载转储文件重新创建您的表。


降级时向下不兼容的表格式的典型症状是您无法打开表。 在这种情况下,请使用以下步骤:

1.关闭你降级到的旧MySQL服务器

2.重启你之前的新MySQL服务器

3.通过使用mysqldump创建一个转储文件,转储旧服务器无法访问的所有表。

4.关闭新MySQL 服务并重启旧的

5.将dump文件重新加载到较旧的服务器中。 你的表应该是可访问的。



--从5.7降级的话,有一些变更影响(5.7的各方面变化还是比较大的)


使用 CHECK TABLE ... FOR UPGRADE 来对表进行检查,看是否升级需要重建表

在这些情况下,您也可以使用执行CHECK TABLE的mysqlcheck --check-upgrade或mysql_upgrade。 但是,CHECK TABLE的使用只适用于升级之后,而不是降级。 另外,CHECK TABLE不适用于所有存储引擎。




本节将介绍如何在对MySQL进行更改(如数据类型或字符集的处理方式)之后重建表。 例如,排序中的错误可能已被更正,需要重建表来更新使用排序规则的字符列的索引。 (有关示例,请参见第2.11.3节“检查表或索引是否必须重新构建”)。您也可能需要修复或升级表,如CHECK TABLE,mysqlcheck, 或者mysql_upgrade。




重建表的方法包括转储和重新加载,或使用ALTER TABLE或REPAIR TABLE。 REPAIR TABLE仅适用于MyISAM,ARCHIVE和CSV表。



注意:

如果您正在重建表,因为不同版本的MySQL在二进制(就地)升级或降级后无法处理它们,则必须使用dumpand-reload方法。 在升级或降级之前使用原始版本的MySQL转储表。 然后在升级或降级后重新加载表。



如果仅将重建表的转储重装方法用于重建索引,则可以在升级或降级之前或之后执行转储。 重新加载必须在之后。


要通过转储重新创建表,请使用mysqldump创建转储文件并使用mysql重新加载文件:

shell> mysqldump db_name t1 > dump.sql

shell> mysql db_name < dump.sql


要重建单个数据库中的所有表,请指定数据库名称,而不使用任何表名:


shell> mysqldump db_name > dump.sql

shell> mysql db_name < dump.sql



要重建所有数据库中的所有表,请使用--all-databases选项:

shell> mysqldump --all-databases > dump.sql

shell> mysql < dump.sql


要使用ALTER TABLE重建表,请使用“空”替换; 也就是说,一个ALTER TABLE语句“改变”表来使用它已有的存储引擎。 例如,如果t1是InnoDB表,请使用以下语句:



mysql> ALTER TABLE t1 ENGINE = InnoDB;


--如果不知道存储引擎的类型,可以使用SHOW CREATE TABLE 来显示表的定义



如果您需要重建InnoDB表,因为CHECK TABLE操作指示需要进行表升级,请使用mysqldump创建转储文件并使用mysql来重新加载文件,如前所述。

如果CHECK TABLE操作指示存在损坏或导致InnoDB失败,请参阅第14.18.2节“强制InnoDB恢复”以获取有关使用innodb_force_recovery选项重新启动InnoDB的信息。



对于MyISAM,ARCHIVE或CSV表,如果表检查操作指示存在损坏或需要升级,则可以使用REPAIR TABLE。 例如,要修复MyISAM表,请使用以下语句:


mysql> REPAIR TABLE t1;



mysqlcheck --repair提供对REPAIR TABLE语句的命令行访问。 这可以是修复表的更方便的方法,因为可以使用--databases或--alldatabases选项分别修复特定数据库或所有数据库中的所有表:


shell> mysqlcheck --repair --databases db_name

shell> mysqlcheck --repair --all-databases



对于修正了utf8_general_ci和ucs2_general_ci排序问题的Bug#27877修复程序在MySQL 5.1.24中引入的不兼容性,从MySQL 5.1.62,5.5.21和5.6.5开始实施了一个解决方法。 升级到其中一个版本,然后使用以下方法之一转换每个受影响的表。 在每种情况下,解决方法都会将受影响的列更改为使用utf8_general_mysql500_ci和ucs2_general_mysql500_ci排序规则,这些规则会保留utf8_general_ci和ucs2_general_ci的5.1.24之前的原始排序顺序。


1.要在保留表文件的二进制升级后转换受影响的表,请更改表以使用新的排序规则。 假设表t1包含一个或多个有问题的utf8列。 要在表级别转换表,请使用如下语句:

ALTER TABLE t1 CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci;


要在特定于列的基础上应用更改,请使用类似这样的语句(除COLLATE子句外,请确保按照最初指定的方式重复列定义):


ALTER TABLE t1

MODIFY c1 CHAR(N) CHARACTER SET utf8 COLLATE utf8_general_mysql500_ci;


2.要使用转储和重新加载过程升级表,请使用mysqldump转储表,在转储文件中修改CREATE TABLE语句以使用新的排序规则,然后重新加载表。


进行适当的更改后,CHECK TABLE应报告没有错误。






2.11.5 拷贝MySQL 数据库到其他的机器


在需要在不同体系结构之间传输数据库的情况下,可以使用mysqldump创建一个包含SQL语句的文件。 然后,您可以将文件传输到另一台机器,并将其作为输入提供给mysql客户端。



注意:

您可以在支持相同浮点格式的不同体系结构之间复制MyISAM表的.frm,.MYI和.MYD文件。 (MySQL负责任何字节交换问题。)



使用 mysqldump --help 来查看可用的选项


在两台机器之间移动数据库的最简单的方式(尽管不是最快的)是在数据库所在的机器上运行以下命令:


shell> mysqladmin -h 'other_hostname' create db_name

shell> mysqldump db_name | mysql -h 'other_hostname' db_name



如果要通过慢速网络从远程计算机复制数据库,可以使用以下命令:



shell> mysqladmin create db_name

shell> mysqldump -h 'other_hostname' --compress db_name | mysql db_name



您也可以将转储存储在文件中,将文件传输到目标机器,然后将文件加载到数据库中。 例如,您可以将数据库转储到源计算机上的压缩文件:


shell> mysqldump --quick db_name | gzip > db_name.gz


将包含数据库内容的文件传输到目标计算机,并在目标计算机运行以下命令:

shell> mysqladmin create db_name

shell> gunzip < db_name.gz | mysql db_name



你也可以使用mysqldump和mysqlimport来传输数据库。 对于大型表而言,这比简单使用mysqldump要快得多。 在以下命令中,DUMPDIR表示用于存储mysqldump输出的目录的完整路径名。


1.首先为输出文件创建目录并dump数据库


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数据库,因为这是存储授权表的地方。 您可能必须以新的机器上的MySQL根用户身份运行命令,直到您拥有mysql数据库。


--也就是mysql 这个数据库也要迁移(类似oracle的数据字典一样)



在新机器上导入mysql数据库后,执行mysqladmin flush-privileges,以便服务器重新加载授权表信息。



2.12 环境变量


本节列出了MySQL直接或间接使用的所有环境变量。 这些手册中的大部分内容也可以在其他地方找到。

命令行上的选项优先于选项文件和环境变量中指定的值,选项文件中的值优先于环境变量中的值。


在许多情况下,最好使用选项文件而不是环境变量来修改MySQL的行为。


MYSQL_TEST_LOGIN_FILE是登录路径文件(由mysql_config_editor创建的文件)的路径名。 如果未设置,则默认值为Windows上的%APPDATA%\ MySQL \ .mylogin.cnf目录和非Windows系统上的$ HOME / .mylogin.cnf


如果MySQL是在启用该插件的情况下构建的,则MYSQL_TEST_TRACE_DEBUG和MYSQL_TRACE_TRACE_CRASH变量将控制测试协议跟踪客户端插件。


UMASK和UMASK_DIR变量,尽管它们的名称,被用作模式,而不是掩码:

1.如果设置了UMASK,则mysqld使用($ UMASK | 0600)作为文件创建的模式,以便新创建的文件的模式范围为0600至0666(所有值为八进制)。


2.如果设置了UMASK_DIR,mysqld使用($ UMASK_DIR | 0700)作为目录创建的基本模式,然后使用〜(〜$ UMASK&0666)进行与运算,以便新创建的目录具有从0700 到0777(所有值八进制)。 AND操作可能会从目录模式中删除读取和写入权限,但不会影响执行权限。


MySQL假定UMASK或UMASK_DIR的值如果以零开始,则为八进制。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3167647/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42206