mysql5.5手册读书日记(1)
时间:2021-07-01 10:21:17
帮助过:5人阅读
//mysql语句使用技巧
/*
* 我的数据库是5.5.2
*
* 查询当前用户的登陆的名字
* select user();
*
* 查询当前mysql服务器时间和服务器版本
* select version(),current_time;
*
*
* 修改一个字段的属性
*
*
* 查看mysql数据库的user表,查看授权用户
* use user;
* select host,user,password from user;
*
* 在shell 或者dos下登陆mysql
* 2者都需要吧mysql命令加入服务,或者切换到对应的目录下
* mysql -h 127.0.0.1 -u root -p root
*
* 查询所有数据库
* show databases;
*
* 查询所有表
* show tables;
*
*
* 修改表名字,表字段属性
* ALTER TABLE `shopnc_address` CHANGE `address` `address1` VARCHAR( 2000 ) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘地址‘
* 原表名 新表名 字段属性和长度改变 字符集 为NULL
*
*
*
* 授权
* GRANT ALL PRIVILEGES ON *.* TO ‘zx‘@‘localhost‘ IDENTIFIED BY ‘zx123456‘ WITH GRANT OPTION;
* 所有权限 数据库.表 用户名 host主机 密码
*
* 刷新权限
* FLUSH PRIVILEGES;
*
* 查看用户授权
* show grants for user_name;可能是因为版本原因不能显示
*
*
* --safe-user-create
如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面
的权限:
* GRANT INSERT(user) ON mysql.user TO ‘user_name‘@‘host_name‘;
*
*
*
* 收回权限
* REVOKE ALL PRIVILEGES ON *.* FROM myuser;
* 或者直接去user表删除用户也可以
* delete from user where user = ‘myuser‘;
*
* 查看表结果
* DESCRIBE user;或者 show create table shopnc_orders;
*
*
* 查看一张表的索引
* show index from shopnc_orders;
*
* 查看系统的变量
* show variables;
*
* 查看每个表的信息
* show table status;
*
* 查看mysql的状态信息
* show status;
*
* 查看显示服务器所支持的不同权限
* show privileges;
*
* 查看创建数据库的信息
* show create database shopnc;
*
* 查看mysql支持那些数据库引擎
* show engines;
*
* 查看innodb的状态
* show innodb status;//有些有版本问题,无法显示
*
*
* 给表增加一个字段
* ALTER TABLE `shopnc_address` ADD `ss` VARCHAR( 24 ) NOT NULL AFTER `dlyp_id`
*
*
*
*
* 从本文件导入数据库
*
* windows和linux路径的斜杠是不一样的,请注意如果用Windows中的编辑器(使用\r\n做为行的结束符)创建文件,应使用:
* LOAD DATA LOCAL INFILE ‘/path/pet.txt‘ INTO TABLE pet
* LINES TERMINATED BY ‘\r\n‘;
* 在运行OS X的Apple机上,应使用行结束符‘\r‘。
* 因为不同系统和文件格式的需要不一样,请更具详细文档在使用
*
*
* 匹配模式,
* 匹配p大头的数据
*SELECT * FROM zx WHERE name LIKE ‘p%‘;
*
* 匹配p结尾的数据
* SELECT * FROM zx WHERE name LIKE ‘%p‘;
*
* 匹配含有p的数据
* SELECT * FROM zx WHERE name LIKE ‘%p%‘;
*
*
* 匹配长度为3的数据
* SELECT * FROM zx WHERE name LIKE ‘___‘;
*
* mysql还可以使用正则表达式函数
* 用REGEXP和NOT REGEXP操作符(或RLIKE和NOT RLIKE,它们是同义词)。
*
* SELECT * FROM pet WHERE name REGEXP BINARY ‘^b‘; 匹配以b大头的name
*
* SELECT * FROM pet WHERE name REGEXP ‘fy$‘;匹配以fy结尾的name
*
*
* 选择最大的article数值,别名为article字段名,表别名也是一样
* SELECT MAX(article) AS article FROM shop;
*
*
* concat函数
* 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL
*
* mysql> select concat(‘11‘,‘22‘,‘33‘);
+------------------------+
| concat(‘11‘,‘22‘,‘33‘) |
+------------------------+
| 112233 |
+------------------------+
*
mysql> select concat(‘11‘,‘22‘,NULL);
+------------------------+
| concat(‘11‘,‘22‘,NULL) |
+------------------------+
| NULL |
+------------------------+
*
*
*
mysqld是MySQL服务器
mysqld_safe、mysql.server和mysqld_multi是服务器启动脚本
mysql_install_db初始化数据目录和初始数据库
*
mysql是一个命令行客户程序,用于交互式或以批处理模式执行SQL语句。
o mysqladmin是用于管理功能的客户程序。
o mysqlcheck执行表维护操作。
o mysqldump和mysqlhotcopy负责数据库备份。
o mysqlimport导入数据文件。
o mysqlshow显示信息数据库和表的相关信息。
*
myisamchk执行表维护操作。
o myisampack产生压缩、只读的表。
o mysqlbinlog是处理二进制日志文件的实用工具。
o perror显示错误代码的含义。
*
* 一些命令的使用
shell> mysql test
shell> mysqladmin extended-status variables
shell> mysqlshow --help
shell> mysqldump --user=root personnel
*
*
*
* 对于带选项值的长选项,通过一个‘=’将选项名和值隔离开来。对于带选项值的短选项,选项值可以紧随选项字母后面,或者二者之间可以用一个空格隔开。(-hlocalhost和-h localhost是等效的)。该规则的
例外情况是指定MySQL密码的选项。该选项的形式可以为--password=pass_val或--password。在后一种情况(未给出密码值),程序将提示输入密码。也可以给出密码选项,短形式为-ppass_val或-p。然而,对于
短形式,如果给出了密码值,必须紧跟在选项后面,中间不能插入空格。这样要求的原因是如果选项后面有空格,程序没有办法来告知后面的参量是密码值还是其它某种参量。因此,下面两个命令的含义完全不
同:
· shell> mysql -ptest
· shell> mysql -p test
第一个命令让mysql使用密码test,但没有指定默认数据库。第二个命令让mysql提示输入密码并使用test作为默认数据库。
*
*
*
*
*
部分选项控制可以开关的行为。例如,mysql客户端支持--column-names选项,确定是否在查询结果开头显示一行栏目名。默认情况,该选项被启用。但是可能在某些情况下你想要禁用它,例如将mysql的输出
发送到另一个只希望看到数据而不希望看到开始的标题行的程序中。
要想禁用列名,可以使用下面的形式来指定选项:
--disable-column-names
--skip-column-names
--column-names=0
--disable和--skip前缀与=0后缀的效果相同:它们均关闭选项。
可以用下述方法“启用”选项:
--column-names
--enable-column-names
--column-names=1
*
*
*
*
*
对mysql偶尔有用的另一个选项是-e或--execute选项,可用来将SQL语句传递给服务器。该语句必须用引号引起来(单引号或双引号)。(然而,如果想要在查询中将值引起来,则对于查询应使用双引号,查询中引
用的值应使用单引号)。当使用该选项时,语句被执行,然后mysql立即退出命令外壳。
例如,你可以用下面的命令获得用户账户列表:
shell> mysql -u root -p -e "SELECT User, Host FROM User" mysql
Enter password: ******
+------+-----------+
| User | Host |
+------+-----------+
| | gigan |
| root | gigan |
| | localhost |
| jon | localhost |
| root | localhost |
+------+-----------+
后面的mysql是数据库名字
*
*
* 查看系统变量
* show variables like ‘%log%‘;
* 查看所有系统变量
* show variables
*
查看是否支持分区
mysql> show variables like ‘%partition%‘;
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| have_partitioning | YES |
+-------------------+-------+
* 查看支持的插件
mysql> show plugins;
+-----------------------+----------+--------------------+---------+---------+
| Name | Status | Type | Library | License |
+-----------------------+----------+--------------------+---------+---------+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysql_native_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| mysql_old_password | ACTIVE | AUTHENTICATION | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| FEDERATED | DISABLED | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| INNODB_TRX | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCKS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_LOCK_WAITS | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMP_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| INNODB_CMPMEM_RESET | ACTIVE | INFORMATION SCHEMA | NULL | GPL |
| PERFORMANCE_SCHEMA | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
+-----------------------+----------+--------------------+---------+---------+
*
*
*
*
mysqld
SQL后台程序(即MySQL服务器)。要想使用客户端程序,该程序必须运行,因为客户端通过连接服务器来访问数据库。参见5.3节,“mysqld:MySQL服务
器”。
· mysqld-max
包括更多特性的一个服务器版本。参见5.1.2节,“mysqld-max扩展MySQL服务器”
· mysqld_safe
服务器启动脚本。如果mysqld-max存在,mysqld_safe试图启动它,否则启动mysqld。参见5.1.3节,“mysqld_safe:MySQL服务器启动脚本”。
· mysql.server
服务器启动脚本。该脚本用于使用包含为特定级别的运行启动服务的脚本的运行目录的系统。它调用mysqld_safe来启动MySQL服务器。参
见5.1.4节,“mysql.server:MySQL服务器启动脚本”。
· mysqld_multi
服务器启动脚本,可以启动或停止系统上安装的多个服务器。参见5.1.5节,“mysqld_multi:管理多个MySQL服务器的程序”
· mysql_install_db
该脚本用默认权限创建MySQL授权表。通常只是在系统上首次安装MySQL时执行一次。参见2.9.2节,“Unix下安装后的过程”。
· mysql_fix_ privilege_tables
在升级安装后,如果新版本MySQL中的授权表有更改,则使用该脚本来更改授权表。参见2.10.2节,“升级授权表”。
服务器主机上还运行其它几个程序:
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
· myisamchk
用来描述、检查、优化和维护MyISAM表的实用工具。在5.9.5节,“myisamchk:MyISAM表维护实用工具”中描述了myisamchk。
· make_binary_distribution
该程序可以生成编译过的MySQL的二进制版本。可以通过FTP上传到ftp.mysql.com的/pub/mysql/upload/,供其它MySQL用户使用。
· mysqlbug
MySQL 缺陷报告脚本。它可以用来向MySQL邮件系统发送缺陷报告。(你也可以访问http://bugs.mysql.com/在线创建缺陷报告文件。参见1.7.1.3节,“如何
通报缺陷和问题”)。
要想找出你的服务器支持哪个存储引擎,执行下面的语句:
mysql> SHOW ENGINES;
shell> cd mysql_installation_directory
shell> bin/mysqld_safe &
如果mysqld_safe失败,即使从MySQL安装目录调用仍然失败,你可以指定--ledir和--datadir选项来指示服务器和数据库在你的系统中的安装目录。
一般情况,你不应编辑mysqld_safe脚本。相反,应使用命令行选项或my.cnf选项文件的[mysqld_safe]部分的选项来配置mysqld_safe。一般不需要编
辑mysqld_safe来正确启动服务器。但是,如果你编辑,将来升级MySQL后会覆盖你修改的mysqld_safe版本,因此你应对你修改的版本进行备份以便将
来重装。
mysqld_multi可以管理多个帧听不同Unix套接字文件和TCP/IP端口的连接的mysqld 进程。它可以启动或停止服务器,或报告它们的当前状态。
程序寻找my.cnf中的[mysqldN]组(或--config-file选项指定的文件)。N 可以为任何正整数。在下面的讨论中该数字指选项组号,或GNR。组号区别各选项组,
并用作mysqld_multi的参数来指定想要启动、停止哪个服务器或获取哪个服务器的状态报告。这些组中的选项与将用来启动mysqld的[mysqld]组中的相
同。(例如,参见2.9.2.2节,“自动启动和停止MySQL”)。但是,当使用多个服务器时,需要每个服务器使用自己的选项值,例如Unix套接字文件和TCP/IP端
口号。关于在多服务器环境中,每个服务器对应唯一选项的详细信息,参见5.12节,“在同一台机器上运行多个MySQL服务器”。
要想调用mysqld_multi,使用下面的语法:
shell> mysqld_multi [options] {start|stop|report} [GNR[,GNR] ...]
start、stop和report表示你想要执行的操作。你可以在单个服务器或多个服务器上执行指定的操作,取决于选项名后面的GNR 列。如果没有该
列,mysqld_multi为选项文件中的所有服务器执行该操作。
每个GNR值代表一个选项组号或组号范围。GNR值应为选项文件中组名末尾的号。例如,组[mysqld17]的GNR为17。要想指定组号的范围,用破折号间隔开
第1个和最后1个号。GNR值10-13代表组[mysqld10]到[mysqld13]。可以在命令行中指定多个组或组范围,用逗号间隔开。GNR列不能有空格字符(空格
或tab);空格字符后面的内容将被忽略掉。
该命令使用选项组[mysqld17]启动单个服务器:
shell> mysqld_multi start 17
该命令停止多个服务器,使用选项组[mysql8]和[mysqld10]至[mysqld13]:
shell> mysqld_multi stop 8,10-13
使用该命令列出设置选项文件的示例:
shell> mysqld_multi --example
mysqld_multi支持下面的选项:
· --config-file=name
指定选项文件名。这关系到mysqld_multi从哪里寻找[mysqldN]选项组。没有该选项,从通用my.cnf文件读所有选项。选项不影响mysqld_multi从哪里读
取自己的选项,总是从通用my.cnf文件的[mysqld_multi]组读取。
· --example
显示示例选项文件。
· --help
显示帮助消息并退出。
· --log=name
指定日志文件名。如果该文件存在,后面为日志输出。
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
· --mysqladmin=prog_name
用来停止服务器的mysqladmin二进制。
· --mysqld=prog_name
可用的mysqld二进制。请注意你还可以将该选项的值指定为mysqld_safe。选项被传递给mysqld。确保在PATH环境变量设定值或mysqld_safe中
有mysqld所在目录。
· --no-log
按照标准输出打印日志信息,不要写入日志文件。默认情况下,输出写入日志文件。
· --password=password
调用mysqladmin时使用的MySQL账户的密码。请注意该密码值不是可选项,不象其它MySQL程序。
· --silent
禁用警告。
· --tcp-ip
通过TCP/IP端口而不是Unix套接字文件来连接每个MySQL服务器。(如果找不到套接字文件, 服务器仍然可以运行,但只能通过 TCP/IP端口访问)。默认情
况下,使用Unix套接字文件进行连接。该选项影响stop和report操作。
· --user=user_name
调用mysqladmin时使用的MySQL账户的用户名。
· --verbose
更详细。
· --version
显示版本信息并退出。
关于mysqld_multi的一些注解:
· 确保停止mysqld服务器(用mysqladmin程序)的MySQL账户在各个服务器中的用户名和密码相同。并且应确保账户具有SHUTDOWN权限。如果你想
要管理的服务器的管理账户有许多不同的用户名或密码,你需要在每个服务器上创建一个账户,并具有相同的用户名和密码。例如,你可以执行下面的命令
为每个服务器设置一个普通multi_admin账户:
· shell> mysql -u root -S /tmp/mysql.sock -proot_password
· mysql> GRANT SHUTDOWN ON *.*
· -> TO ‘multi_admin‘@‘localhost‘ IDENTIFIED BY ‘multipass‘;
参见5.7.2节,“权限系统工作原理”。你必须为每个mysqld服务器执行该操作。当连接时适当更改连接参数。请注意账户名的主机部分必须允许你
用multi_admin从你想要运行mysqld_multi的主机进行连接。
· 如果你使用mysqld_safe来启动mysqld(例如,--mysqld=mysqld_safe),--pid-file选项很重要。每个mysqld应有自己的进程ID文件。使
用mysqld_safe而不使用mysqld的好处是mysqld_safe“守护”其mysqld进程,如果用kill –9发送的信号或由于其它原因(例如分段故障)进程终止,则重
启进程。请注意mysqld_safe脚本需要你从某个位置启动它。这说明运行mysqld_multi前你必须进入某个目录。如果启动时有问题,请参
见mysqld_safe脚本。特别是要检查下列行:
· ----------------------------------------------------------------
· MY_PWD=`pwd`
· # Check if we are starting this relative (for the binary release)
· if test -d $MY_PWD/data/mysql -a -f ./share/mysql/english/errmsg.sys -a · -x ./bin/mysqld
· ----------------------------------------------------------------
参见5.1.3节,“mysqld_safe:MySQL服务器启动脚本”。上述行执行的测试应成功,否则你可能遇到了问题。
· 每个mysqld的Unix套接字文件和TCP/IP端口号必须不同。
· 你可能想要为mysqld使用--user选项,但为此你需要用Unix root用户运行mysqld_multi脚本。选项文件中有选项不要紧;如果你不是超级用户,并
且你用自己的Unix账户重启mysqld进程,你只会得到警告。
· 重要:确保mysqld进程启动所用Unix账户可以完全访问数据目录。不要使用Unix root账户,除非你知道你在做什么。
· 非常重要:使用mysqld_multi前,确保理解传递给mysqld服务器的选项的含义以及你为什么想要独立的mysqld进程。应清楚在相同的数据目录下
使用多个mysqld服务器的危险。使用单独的数据目录,除非你知道你在做什么。在线程系统中,在相同的数据目录下启动多个服务器不会得到超性能。参
见5.12节,“在同一台机器上运行多个MySQL服务器”。
下面的示例显示了你如何设置选项文件来使用mysqld_multi。专门省去第1个和第5个[mysqldN]组来说明你的选项文件可以稍有不同。这样给你更大的灵活
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
性。mysqld程序重启或停止的顺序由它们在选项文件中的顺序决定。
# This file should probably be in your home dir (~/.my.cnf)
# or /etc/my.cnf
# Version 2.1 by Jani Tolonen
[mysqld_multi]
mysqld = /usr/local/bin/mysqld_safe
mysqladmin = /usr/local/bin/mysqladmin
user = multi_admin
password = multipass
[mysqld2]
socket = /tmp/mysql.sock2
port = 3307
pid-file = /usr/local/mysql/var2/hostname.pid2
datadir = /usr/local/mysql/var2
language = /usr/local/share/mysql/english
user = john
[mysqld3]
socket = /tmp/mysql.sock3
port = 3308
pid-file = /usr/local/mysql/var3/hostname.pid3
datadir = /usr/local/mysql/var3
language = /usr/local/share/mysql/swedish
user = monty
[mysqld4]
socket = /tmp/mysql.sock4
port = 3309
pid-file = /usr/local/mysql/var4/hostname.pid4
datadir = /usr/local/mysql/var4
language = /usr/local/share/mysql/estonia
user = tonu
[mysqld6]
socket = /tmp/mysql.sock6
port = 3311
pid-file = /usr/local/mysql/var6/hostname.pid6
datadir = /usr/local/mysql/var6
language = /usr/local/share/mysql/japanese
user = jani
START INSTANCE mysqld4;启动一个MySQL实例 配置在my.cnf里面的[mysqld4]段里配置
显示所有载入的实例名:
mysql> show instances;
显示选定的实例的状态和版本信息:
SHOW INSTANCE STATUS mysqld3;
显示实例使用的选项:
mysql> SHOW INSTANCE OPTIONS mysqld3;、
该命令提供实例使用的所有日志文件
SHOW mysqld LOG FILES;
查看所有的日志文件所在位置 很方便
SHOW VARIABLES LIKE ‘%log%‘
以上所有的命令都可以在phpmyadmin上运行,这样看起来就更方便,控制台的显示方式不太友好
Variable_name Value
back_log 50
binlog_cache_size 32768
binlog_direct_non_transactional_updates OFF
binlog_format MIXED
binlog_stmt_cache_size 32768
expire_logs_days 0
general_log OFF
general_log_file c:\wamp\bin\mysql\mysql5.5.20\data\USER-20141003JG...
innodb_flush_log_at_trx_commit 1
innodb_locks_unsafe_for_binlog OFF
innodb_log_buffer_size 8388608
innodb_log_file_size 5242880
innodb_log_files_in_group 2
innodb_log_group_home_dir .innodb_mirrored_log_groups 1
log OFF
log_bin ON
log_bin_trust_function_creators OFF
log_error c:\wamp\logs\mysql.log
log_output FILE
log_queries_not_using_indexes OFF
log_slave_updates OFF
log_slow_queries OFF
log_warnings 1
max_binlog_cache_size 18446744073709547520
max_binlog_size 1073741824
max_binlog_stmt_cache_size 18446744073709547520
max_relay_log_size 0
relay_log
relay_log_index
relay_log_info_file relay-log.info
relay_log_purge ON
relay_log_recovery OFF
relay_log_space_limit 0
slow_query_log OFF
slow_query_log_file c:\wamp\bin\mysql\mysql5.5.20\data\USER-20141003JG...
sql_log_bin ON
sql_log_off OFF
sync_binlog 0
sync_relay_log 0
sync_relay_log_info 0
SHOW mysqld LOG FILES;这个语句也可以查看日志文件地址,可能是版本原因有些情况下不能查看
+-------------+------------------------------------+----------+
| Logfile | Path | Filesize |
+-------------+------------------------------------+----------+
| ERROR LOG | /home/cps/var/mysql/owlet.err | 9186 |
| GENERAL LOG | /home/cps/var/mysql/owlet.log | 471503 |
| SLOW LOG | /home/cps/var/mysql/owlet-slow.log | 4463 |
+-------------+------------------------------------+----------+
*
*
*
*
*
*
* MySQL服务器可以以不同的SQL模式来操作,并且可以为不同客户端应用不同模式。这样每个应用程序可以根据自己的需求来定制服务器的操作模式。
模式定义MySQL应支持哪些SQL语法,以及应执行哪种数据验证检查。这样可以更容易地在不同的环境中使用MySQL,并结合其它数据库服务器使
用MySQL。
你可以用--sql-mode="modes"选项启动mysqld来设置默认SQL模式。如果你想要重设,该值还可以为空(--sql-mode ="")。
你还可以在启动后用SET [SESSION|GLOBAL] sql_mode=‘modes‘语句设置sql_mode变量来更改SQL模式。设置GLOBAL变量时需要拥有SUPER权限,并且会
影响从那时起连接的所有客户端的操作。设置SESSION变量只影响当前的客户端。任何客户端可以随时更改自己的会话sql_mode值。
Modesis是用逗号(‘,’)间隔开的一系列不同的模式。你可以用SELECT @@sql_mode语句查询当前的模式。默认值是空(没有设置任何模式)。
主要重要sql_mode值为:
· ANSI
更改语法和行为,使其更符合标准SQL。
· STRICT_TRANS_TABLES
如果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的第1行,则放弃该语句。本节后面给出了更详细的
描述。
· TRADITIONAL
Make MySQL的行为象“传统”SQL数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”。注释:一旦发现错误立即放
弃INSERT/UPDATE。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更改不会“滚动”,结果是更新“只进行了一部分”。
本手册指“严格模式”,表示至少STRICT _TRANS_TABLES或STRICT _ALL_TABLES被启用的模式。
下面描述了支持的所有模式:
· ALLOW_INVALID_DATES
在严格模式下不要检查全部日期。只检查1到12之间的月份和1到31之间的日。这在Web应用程序中,当你从三个不同的字段获取年、月、日,并且想要确切
保存用户插入的内容(不进行日期验证)时很重要。该模式适用于DATE和DATETIME列。不适合TIMESTAMP列,TIMESTAMP列需要验证日期。
启用严格模式后,服务器需要合法的月和日,不仅仅是分别在1到12和1到31范围内。例如,禁用严格模式时‘2004-04-31‘是合法的,但启用严格模式后是非
法的。要想在严格模式允许遮掩固定日期,还应启用ALLOW_INVALID_DATES。
· ANSI_QUOTES
将‘"’视为识别符引号(‘`’引号字符),不要视为字符串的引号字符。在ANSI模式,你可以仍然使用‘`’来引用识别符。启用ANSI_QUOTES后,你不能用双引号来
引用字符串,因为它被解释为识别符。
· ERROR_FOR_DIVISION_BY_ZERO
在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用
到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。
· HIGH_NOT_PRECEDENCE
NOT操作符的优先顺序是表达式例如NOT a BETWEEN b AND c被解释为NOT (a BETWEEN b AND c)。在一些旧版本MySQL中, 表达式被解释为(NOT a)
BETWEEN b AND c。启用HIGH_NOT_PRECEDENCESQL模式,可以获得以前的更高优先级的结果
*
*
*
*
*
* 设置mysql的启动模式
mysql> SET sql_mode = ‘‘;
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 0
mysql> SET sql_mode = ‘broken_not‘;
mysql> SELECT NOT 1 BETWEEN -5 AND 5;
-> 1
*
*
*
*
*
* mysqld服务器维护两种变量。全局变量影响服务器的全局操作。会话变量影响具体客户端连接相关操作。
服务器启动时,将所有全局变量初始化为默认值。可以在选项文件或命令行中指定的选项来更改这些默认值。服务器启动后,通过连接服务器并执行SET
GLOBAL var_name语句可以更改动态全局变量。要想更改全局变量,必须具有SUPER权限。
服务器还为每个客户端连接维护会话变量。连接时使用相应全局变量的当前值对客户端会话变量进行初始化。客户可以通过SET SESSION var_name语句来
更改动态会话变量。设置会话变量不需要特殊权限,但客户可以只更改自己的会话变量,而不更改其它客户的会话变量。
任何访问全局变量的客户端都可以看见对全局变量的更改。但是,它只影响在更改后连接的从该全局变量初始化相应会话变量的客户端。它不会影响已经连
接上的客户端的会话变量(甚至是执行SET GLOBAL语句的客户端)。
当使用启动选项设置变量时,变量值可以使用后缀K、M或G分别表示千字节、兆字节或gigabytes。例如,下面的命令启动服务器时的键值缓冲区大小为16
megabytes:
mysqld --key_buffer_size=16M
后缀的大小写美关系;16M和16m是同样的。
运行时,使用SET语句来设置系统变量。此时,不能使用后缀,但值可以采取下列表达式:
mysql> SET sort_buffer_size = 10 * 1024 * 1024;
要想显式指定是否设置全局或会话变量,使用GLOBAL或SESSION选项:
mysql> SET GLOBAL sort_buffer_size = 10 * 1024 * 1024;
mysql> SET SESSION sort_buffer_size = 10 * 1024 * 1024;
*
*
*
*
*
*
mysql_fix_privilege_tables:升级MySQL系统表
* 一些MySQL发布对mysql数据库中的系统表的结构进行了更改,添加了新权限或特性。当你更新到新版本MySQL,你应同时更新系统表,以确保它们的结构最
新。首先备份mysql数据库,然后按照下面的程序操作。
在Unix或Unix类系统中,运行mysql_fix_privilege_tables脚本来更新系统表:
shell> mysql_fix_privilege_tables
你必须在服务器运行时执行该脚本。它试图连接本机上用root运行的服务器。如果root账户需要密码,在命令行中按下述方法给出密码:
shell> mysql_fix_privilege_tables--password=root_password
mysql_fix_privilege_tables脚本可以执行将系统表转换为当前格式的任何动作。运行时你可能会看见一些Duplicate column name警告;你可以忽略它
们。
运行完脚本后,停止服务器并重启。
在Windows系统中,MySQL分发包括mysql_fix_privilege_tables.sql SQL脚本,你可以用mysql客户端来运行。例如,如果MySQL安装到C:\Program
Files\MySQL\MySQL Server 5.1,命令应为:
C:\> C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql -u root -p mysql
mysql> SOURCE C:/Program Files/MySQL/MySQL Server 5.1/scripts/mysql_fix_privilege_tables.sql
如果安装到其它目录,相应地更改路径名。
mysql命令将提示输入root密码;按照提示输入密码。
在Unix中,当mysql处理mysql_fix_privilege_tables.sql script脚本中的语句时,你可能会看见一些Duplicate column name警告;你可以忽略它们。
运行完脚本后,停止服务器并重启。
*
*
*
*
*
*
* 尝试访问mysql端口是否可以联通
* telnet server_IP或者server_HOST 3306
*
*
*
* 如果你从源码构建MySQL但没有使用--enable-local-infile选项来进行configure,则客户不能使用LOAD DATA LOCAL,除非显式调用mysql_options
(...MYSQL_OPT_本地_INFILE,0)
你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令。
· 对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用。类似地,对
于mysqlimport,--local or -L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。
· 如果你使用LOAD DATA LOCAL Perl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了便面不理解localinfile
的程序产生问题,则规定使用loose- prefix:
· [client]
· loose-local-infile=1
· 如果LOAD DATA LOCAL INFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:
ERROR 1148: The used command is not allowed with this MySQL version
*
*
* MySQL提供的权限
。
权限 列 上下文
CREATE Create_priv 数据库、表或索引
DROP Drop_priv 数据库或表
GRANT OPTION Grant_priv 数据库、表或保存的程序
REFERENCES References_priv 数据库或表
ALTER Alter_priv 表
DELETE Delete_priv 表
INDEX Index_priv 表
INSERT Insert_priv 表
SELECT Select_priv 表
UPDATE Update_priv 表
CREATE VIEW Create_view_priv 视图
SHOW VIEW Show_view_priv 视图
ALTER ROUTINE Alter_routine_priv 保存的程序
CREATE ROUTINE Create_routine_priv 保存的程序
EXECUTE Execute_priv 保存的程序
FILE File_priv 服务器主机上的文件访问
CREATE TEMPORARY TABLES Create_tmp_table_priv 服务器管理
LOCK TABLES Lock_tables_priv 服务器管理
CREATE USER Create_user_priv 服务器管理
PROCESS Process_priv 服务器管理
RELOAD Reload_priv 服务器管理
REPLICATION CLIENT Repl_client_priv 服务器管理
REPLICATION SLAVE Repl_slave_priv 服务器管理
SHOW DATABASES Show_db_priv 服务器管理
SHUTDOWN Shutdown_priv 服务器管理
SUPER Super_priv 服务器管理
*
*
*
* 其余的权限用于管理性操作,它使用mysqladmin程序或SQL语句实施。下表显示每个管理性权限允许你执行的mysqladmin命令:
权限权限拥有者允许执行的命令
RELOAD flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload
SHUTDOWN shutdown
PROCESS processlist
SUPER kill
reload命令告诉服务器将授权表重新读入内存。flush-privileges是reload的同义词,refresh命令清空所有表并打开并关闭记录文件,其它flush-xxx命令执行类
似refresh的功能,但是范围更有限,并且在某些情况下可能更好用。例如,如果你只是想清空记录文件,flush-logs比refresh是更好的选择。
shutdown命令关掉服务器。只能从mysqladmin发出命令。没有相应的SQL语句。
processlist命令显示在服务器内执行的线程的信息(即其它账户相关的客户端执行的语句)。kill命令杀死服务器线程。你总是能显示或杀死你自己的线程,
但是你需要PROCESS权限来显示或杀死其他用户和SUPER权限启动的线程。参见13.5.5.3节,“KILL语法”。
拥有CREATE TEMPORARY TABLES权限便可以使用CREATE TABLE语句中的关键字TEMPORARY。
拥有LOCK TABLES权限便可以直接使用LOCK TABLES语句来锁定你拥有SELECT权限的表。包括使用写锁定,可以防止他人读锁定的表。
拥有REPLICATION CLIENT权限便可以使用SHOW MASTER STATUS和SHOW SLAVE STATUS。
REPLICATION SLAVE权限应授予从服务器所使用的将当前服务器连接为主服务器的账户。没有这个权限,从服务器不能发出对主服务器上的数据库所发出的
更新请求。
拥有SHOW DATABASES权限便允许账户使用SHOW DATABASE语句来查看数据库名。没有该权限的账户只能看到他们具有部分权限的数据库, 如果数据库
用--skip-show-database选项启动,则根本不能使用这些语句。请注意全局权限指数据库的权限。
总的说来,只授予权限给需要他们的那些用户是好主意,但是你应该在授予FILE和管理权限时试验特定的警告:
FILE权限可以被滥用于将服务器主机上MySQL能读取的任何文件读入到数据库表中。包括任何人可读的文件和服务器数据目录中的文件。可以使
用SELECT访问数据库表,然后将其内容传输到客户端上。
GRANT权限允许用户将他们的权限给其他用户。有不同的权限并有GRANT权限的2个用户可以合并权限。
ALTER权限可以用于通过重新命名表来推翻权限系统。
SHUTDOWN权限通过终止服务器可以被滥用完全拒绝为其他用户服务。
PROCESS权限能被用来察看当前执行的查询的明文文本,包括设定或改变密码的查询。
SUPER权限能用来终止其它用户或更改服务器的操作方式。
授给mysql数据库本身的权限能用来改变密码和其他访问权限信息。密码被加密存储,所以恶意的用户不能简单地读取他们以知道明文密码。然而,具
有user表Password列写访问权限的用户可以更改账户的密码,并可以用该账户连接MySQL服务器。
有一些事情你不能用MySQL权限系统做到:
你不能明显地指定某个给定的用户应该被拒绝访问。即,你不能明显地匹配用户然后拒绝连接。
你不能指定用户有权创建立或删除数据库中的表,但不能创建或删除数据库本身。
*
*
*
*
*
*
如果你连接时指定主机名,但得到错误消息主机名未显示或为IP号,表示当MySQL服务器将IP号解析为客户端来名时遇到错误:
· shell> mysqladmin -u root -pxxxx -h some-hostname ver
· Access denied for user ‘root‘@‘‘ (using password: YES)
这表示DNS问题。要想修复,执行mysqladmin flush-hosts来重设内部 DNS主机名缓存
*
*
*
* 一些常用的解决方案包括:
o 试试找出DNS服务器的错误并修复。
o 在MySQL授权表中指定IP号而不是主机名。
o 在/etc/hosts中放入客户端名。
o 用--skip-name-resolve选项启动mysqld。
o 用--skip-host-cache选项启动mysqld。
o 在Unix中,如果你在同一台机器上运行服务器和客户端,连接到localhost。连接到的localhost的Unix连接使用Unix套接字文件而不是TCP/IP。
o 在Windows中,你在同一台机器上运行服务器和客户端并且服务器支持命名管道连接,连接主机名(周期)。连接使用命名管道而不是TCP/IP。
如果mysql -u root test工作但是mysql -h your_hostname -u root test导致Access denied(your_hostname是本地机的实际主机名),那么在user表中
可能没有你的主机的正确名字。这里的一个普遍的问题是在user表行中的Host值指定一个唯一的主机名,但是你系统的名字解析例程返回一个完全正规
的域名(或相反)。例如,如果你在user表中有一个主机是‘tcx‘的行,但是你的DNS告诉MySQL你的主机名是‘tcx.subnet.se‘,行将不工作。尝试把一个
行加到user表中,它包含你主机的IP号作为Host列的值。(另外,你可以把一个行加到user表中,它有包含一个通配符如‘tcx.%‘的Host值。然而,使用
以“%”结尾的主机名是不安全的并且不推荐!)
如果mysql -u user_name test工作但是mysql -u user_name other_db_name不工作,你没有为给定的用户授予other_db_name数据库的访问权限。
当在服务器上执行mysql -u user_name时,它工作,但是在其它远程客户端上执mysql -h host_name -u user_name时,它却不工作,你没有为给定的
用户授予从远程主机访问服务器的权限。
如果你不能弄明白你为什么得到Access denied,从user表中删除所有Host包含通配符值的行(包含“%”或“_”的条目)。一个很普遍的错误是
用Host=‘%‘和User=‘some_user‘插入一个新行,认为这将允许你指定localhost从同一台机器进行连接。它不工作的原因是默认权限包括一个
有Host=‘localhost‘和User=‘‘的行,因为那个行的Host值‘localhost‘比‘%‘更具体,当从localhost连接时,它用于指向新行!正确的步骤是插
入Host=‘localhost‘和User=‘some_user‘的第2个行,或删除Host=‘localhost‘和User=‘‘行。删除条目后,记住用FLUSH PRIVILEGES语句重载授权表。
· 如果你得到下列错误,可以与db或host表有关:
· Access to database denied
如果从db表中选择了在Host列有空值的条目,保证在host表中有一个或多个相应的条目,指定db表中的条目适用哪些主机。
· 如果你能够连接MySQL服务器,但如果在使用命令SELECT ... INTO OUTFILE或LOAD DATA INFILE语句时,你得到Access denied错误,在user表中的
条目可能没有启用FILE权限。
· 如果你直接更改授权表(例如,使用INSERT、UPDATE或DELETE语句)并且你的更改好像被忽略了,记住你必须执行FLUSH PRIVILEGES语句
或mysqladmin flush-privileges命令让服务器来重读授权表。否则,直到服务器下次重启,你的更改方有效。记住用UPDATE命令更改root密码后,在清
空权限前,你不需要指定新密码,因为服务器还不知道你已经更改了密码!
*
*
*
*
在MySQL 4.1之前,用PASSWORD()函数计算的密码哈希值有16个字节长。应为:
mysql> SELECT PASSWORD(‘mypass‘);
+--------------------+
| PASSWORD(‘mypass‘) |
+--------------------+
| 6f8c114b58f2ce9e |
+--------------------+
*
*
在MySQL 4.1中,已经对PASSWORD()函数进行了修改,可以生成41字节的哈希值:
mysql> SELECT PASSWORD(‘mypass‘);
+-------------------------------------------+
| PASSWORD(‘mypass‘) |
+-------------------------------------------+
| *6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4 |
+-------------------------------------------+
*
*
*
*
限制MySQL服务器资源使用的一个方法是将max_user_connections系统变量设置为非零值。但是,该方法严格限于全局,不允许管理具体账户。并且,它只
限制使用单一账户同时连接的数量,而不是客户端连接后的操作。许多MySQL管理员对两种类型的控制均感兴趣,特别是Internet服务提供者。
在MySQL 5.1中,你可以为具体账户限制下面的服务器资源:
· 账户每小时可以发出的查询数
· 账户每小时可以发出的更新数
· 账户每小时可以连接服务器的次数
客户端可以执行的语句根据查询限制来记数。只有修改数据库或表的语句根据更新限制来记数。
还可以限制每个账户的同时连接服务器的连接数。
本文中的账户为user表中的单个记录。根据User和Host列值唯一识别每个账户。
做为使用该特性的先决条件,mysql数据库的user表必须包含资源相关的列。资源限制保存
在max_questions、max_updates、max_connections和max_user_connections列内。如果user表没有这些列,必须对它进行升级;参见2.10.2节,“升级授权
表”。
要想用GRANT语句设置资源限制,使WITH子句来命名每个要限制的资源和根据每小时记数的限制值。例如,要想只以限制方式创建可以访问customer数据
库的新账户,执行该语句:
mysql> GRANT ALL ON customer.* TO ‘francis‘@‘localhost‘
-> IDENTIFIED BY ‘frank‘
-> WITH MAX_QUERIES_PER_HOUR 20
-> MAX_UPDATES_PER_HOUR 10
-> MAX_CONNECTIONS_PER_HOUR 5
-> MAX_USER_CONNECTIONS 2;
限制类型不需要全部在WITH子句中命名,但已经命名的可以按任何顺序。每个每小时限制值均应为整数,代表每小时的记数。如果GRANT语句没有WITH子
句,则每个限制值设置为默认值零(即没有限制)。对于MAX_USER_CONNECTIONS,限制为整数,表示账户一次可以同时连接的最大连接数。如果限制设置
为默认值零,则根据MAX_USER_CONNECTIONS系统变量确定该账户可以同时连接的数量。
要想设置或更改已有账户的限制,在全局级别使用GRANT USAGE语句(在*.*)。下面的语句可以将francis的查询限制更改为100:
mysql> GRANT USAGE ON *.* TO ‘francis‘@‘localhost‘
-> WITH MAX_QUERIES_PER_HOUR 100;
该语句没有改变账户的已有权限,只修改了指定的限制值。
要想取消已有限制,将该值设置为零。例如,要想取消francis每小时可以连接的次数的限制,使用该语句:
mysql> GRANT USAGE ON *.* TO ‘francis‘@‘localhost‘
-> WITH MAX_CONNECTIONS_PER_HOUR 0;
当账户使用资源时如果有非零限制,则对资源使用进行记数。
服务器运行时,它统计每个账户使用资源的次数。如果账户在最后一个小时的连接次数达到限制,该账户的进一步的连接被拒绝。类似地,如果账户达到查
询或更新次数的限制,进一步的查询或更新被拒绝。在这种情况下,会给出相关错误消息。
根据每个账户进行资源计算,而不是根据每个客户端。例如,如果你的账户的查询限制为50,你不能通过两个客户端同时连接服务器将限制增加到100。两个
连接的查询被计算到一起。
可以为所有账户从全局重设当前的每小时资源使用记数,或单独重设给定的账户:
· 要想将所有账户当前的记数重设为零,可以执行FLUSH USER_RESOURCES语句。还可以通过重载授权表来重设记数(例如,使用FLUSH
PRIVILEGES语句或mysqladmin reload命令)。
· 将具体账户的限制重新授予任何值,可以将它设置为零。要想实现,按照前面所述使用GRANT USAGE,并将限制值指定为该账户当前的限制值。
计数器重设不影响MAX_USER_CONNECTIONS限制。
当服务器启动时所有记数从零开始。
*
*
*
*
*
MySQL可以检查X509证书的属性和基于用户名和密码的通用鉴定方法。要想为MySQL账户指定SSL相关选项,使用GRANT语句的REQUIRE子句。参
见13.5.1.3节,“GRANT和REVOKE语法”。
有多种可能来限制一个账户的连接类型:
· 如果账户没有SSL或X509需求,如果用户名和密码合法,允许未加密的连接。但是,如果客户有正确的证书和密钥文件,在客户选项中可以使用加密
连接。
· REQUIRE SSL选项限制服务器只允许该账户的SSL加密连接。请注意如果有ACL记录允许非SSL连接,该选项会被忽略。
· mysql> GRANT ALL PRIVILEGES ON test.* TO ‘root‘@‘localhost‘
· -> IDENTIFIED BY ‘goodsecret‘ REQUIRE SSL;
· REQUIRE X509表示客户必须有合法证书但确切的证书、分发者和主体不重要。唯一的需求是应可以被某个CA认证机构验证它的签名。
· mysql> GRANT ALL PRIVILEGES ON test.* TO ‘root‘@‘localhost‘
· -> IDENTIFIED BY ‘goodsecret‘ REQUIRE X509;
· REQUIRE ISSUER ‘issuer‘限制连接企图,即客户必须出示CA ‘issuer‘签发的合法X509证书。如果客户出示了一个合法证书,但是是由不同的分发者签
发,服务器拒绝连接。使用X509证书表示要加密,因此不需要SSL选项。
· mysql> GRANT ALL PRIVILEGES ON test.* TO ‘root‘@‘localhost‘
· -> IDENTIFIED BY ‘goodsecret‘
· -> REQUIRE ISSUER ‘/C=FI/ST=Some-State/L=Helsinki/
· O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com‘;
请注意ISSUER值应做为单一字符串输入。
· REQUIRE SUBJECT ‘subject‘ 限制连接企图,即客户必须出示主题为‘subject‘的合法X509证书。如果客户出示了一个合法证书,但是有不同的主题,服
务器拒绝连接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO ‘root‘@‘localhost‘
· -> IDENTIFIED BY ‘goodsecret‘
· -> REQUIRE SUBJECT ‘/C=EE/ST=Some-State/L=Tallinn/
· O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com‘;
请注意SUBJECT值应做为单一字符串输入。
· REQUIRE CIPHER ‘cipher‘用来确保使用足够强的密码和密钥长度。如果使用旧的短加密密钥算法,SSL本身可能很弱。使用该选项,我们可以索取确
切的加密方法来连接。
· mysql> GRANT ALL PRIVILEGES ON test.* TO ‘root‘@‘localhost‘
· -> IDENTIFIED BY ‘goodsecret‘
-> REQUIRE CIPHER ‘EDH-RSA-DES-CBC3-SHA‘;
在REQUIRE子句中,可以结合使用SUBJECT、ISSUER和CIPHER选项:
mysql> GRANT ALL PRIVILEGES ON test.* TO ‘root‘@‘localhost‘
-> IDENTIFIED BY ‘goodsecret‘
-> REQUIRE SUBJECT ‘/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com‘
-> AND ISSUER ‘/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com‘
-> AND CIPHER ‘EDH-RSA-DES-CBC3-SHA‘;
请注意SUBJECT和ISSUER值应做为单一字符串输入。
在MySQL 5.1中,在REQUIRE选项之间可以选用AND关键字。
选项的顺序不重要,但任何选项不能用两次。
*
*
*
*
备份数据库的另一个技术是使用mysqldump程序或mysqlhotcopy脚本。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备
份程序”。
1. 完全备份数据库:
2. shell> mysqldump --tab=/path/to/some/dir --opt db_name
或:
shell> mysqlhotcopy db_name /path/to/some/dir
只要服务器不再进行更新,还可以只复制所有表文件(*.frm、*.MYD和*.MYI文件)。mysqlhotcopy脚本使用该方法。(但请注意如果数据库包含InnoDB表,
这些方法不工作。InnoDB不将表的内容保存到数据库目录中,mysqlhotcopy只适合MyISAM表)。
3. 如果mysqld在运行则停止,然后用--log-bin[=file_name]选项来启动。参见5.11.3节,“二进制日志”。二进制日志文件中提供了执行mysqldump之后
对数据库的更改进行复制所需要的信息。
对于InnoDB表,可以进行在线备份,不需要对表进行锁定;参见8.8节,“mysqldump:数据库备份程序”。
MySQL支持增量备份:需要用--log-bin选项来启动服务器以便启用二进制日志;参见5.11.3节,“二进制日志”。当想要进行增量备份时(包含上一次完全备份或
增量备份之后的所有更改),应使用FLUSH LOGS回滚二进制日志。然后,你需要将从最后的完全或增量备份的某个时刻到最后某个点的所有二进制日志复制
到备份位置。这些二进制日志为增量备份;恢复时,按照下面的解释应用。下次进行完全备份时,还应使用FLUSH LOGS或mysqlhotcopy --flushlogs回滚二进
制日志。参见8.8节,“mysqldump:数据库备份程序”和8.9节,“mysqlhotcopy:数据库备份程序”。
如果MySQL服务器为从复制服务器,则无论选择什么备份方法,当备份从机数据时,还应备份master.info和relay-log.info文件。恢复了从机数据后,需要这
些文件来继续复制。如果从机执行复制LOAD DATA INFILE命令,你应还备份用--slave-load-tmpdir选项指定的目录中的SQL_LOAD-*文件。(如果未指定,该
位置默认为tmpdir变量值)。从机需要这些文件来继续复制中断的LOAD DATA INFILE操作。
如果必须恢复MyISAM表,先使用REPAIR TABLE或myisamchk -r来恢复。99.9%的情况下该方法可以工作。如果myisamchk失败,试试下面的方法。请注
意只有用--log-bin选项启动了MySQL从而启用二进制日志它才工作;参见5.11.3节,“二进制日志”。
1. 恢复原mysqldump备份,或二进制备份。
2. 执行下面的命令重新更新二进制日志:
3. shell> mysqlbinlog hostname-bin.[0-9]* | mysql
在某些情况下,你可能只想要从某个位置重新运行某些二进制日志。(通常你想要从恢复备份的日期重新运行所有二进制日志,查询不正确时例外)。关
于mysqlbinlog工具和如何使用它的详细信息参见8.6节,“mysqlbinlog:用于处理二进制日志文件的实用工具”。
还可以对具体文件进行选择备份:
· 要想复制表,使用SELECT * INTO OUTFILE ‘file_name‘ FROM tbl_name。
· 要想重载表,使用LOAD DATA INFILE ‘file_name‘ REPLACE ...并恢复。要避免复制记录,表必须有PRIMARY KEY或一个UNIQUE索引。当新记录复制
唯一键值的旧记录时,REPLACE关键字可以将旧记录替换为新记录。
如果备份时遇到服务器性能问题,可以有帮助的一个策略是在从服务器而不是主服务器上建立复制并执行备份。参见6.1节,“复制介绍”。
如果使用Veritas文件系统,可以这样备份:
1. 从客户端程序执行FLUSH TABLES WITH READ LOCK。
2. 从另一个shell执行mount vxfs snapshot。
3. 从第一个客户端执行UNLOCK TABLES。
4. 从快照复制文件。
5. 卸载快照。
*
*
*
*
*
*
*
*
*
*
shell> mysqldump --single-transaction --all-databases > backup_sunday_1_PM.sql
这是在线非块备份,不会干扰对表的读写。我们以前假定我们的表为InnoDB表,因此--single-transaction使用一致性地读,并且保证mysqldump所看见的数
据不会更改。(其它客户端对InnoDB表进行的更改不会被mysqldump进程看见)。如果我们还有其它类型的表,我们必须假定在备份过程中它们不会更改。
例如,对于mysql数据库中的MyISAM表,我们必须假定在备份过程中没有对MySQL账户进行管理更改。
--single-transaction
InnoDB 表在备份时,通常启用选项 --single-transaction 来保证备份的一致性,实际上它的工作原理是设定本次会话的隔离级别为:REPEATABLE READ,以确保本次会话(dump)时,不会看到其他会话已经提交了的数据。
*
*
*
在星期一下午1点,我们可以清空日志开始新的二进制日志文件来创建增量备份。例如,执行mysqladmin flush-logs命令创建gbichot2-bin.000008。星期
日下午1点的完全备份和星期一下午1点之间的所有更改为文件gbichot2-bin.000007。该增量备份很重要,因此最好将它复制到安全的地方。(例如,备份到磁
带或DVD上,或复制到另一台机器上)。在星期二下午1点,执行另一个mysqladmin flush-logs命令。星期一下午1点和星期二下午1点之间的所有所有更
改为文件gbichot2-bin.000008(也应复制到某个安全的地方)。
MySQL二进制日志占据硬盘空间。要想释放空间,应随时清空。操作方法是删掉不再使用的二进制日志,例如进行完全备份时:
shell> mysqldump --single-transaction --flush-logs --master-data=2
--all-databases --delete-master-logs > backup_sunday_1_PM.sql
注释:如果你的服务器为复制主服务器,用mysqldump --delete-master-logs删掉MySQL二进制日志很危险,因为从服务器可能还没有完全处理该二进
制日志的内容。
PURGE MASTER LOGS语句的描述中解释了为什么在删掉MySQL二进制日志之前应进行确认
*
*
*
*
*
*
*
为恢复进行备份
现在假设在星期三上午8点出现了灾难性崩溃,需要使用备份文件进行恢复。恢复时,我们首先恢复最后的完全备份(从星期日下午1点开始)。完全备份文件
是一系列SQL语句,因此恢复它很容易:
shell> mysql < backup_sunday_1_PM.sql
在该点,数据恢复到星期日下午1点的状态。要想恢复从那时起的更改,我们必须使用增量备份,也就是,gbichot2-bin.000007和gbichot2-bin.000008二进
制日志文件。根据需要从备份处取过这些文件,然后按下述方式处理:
shell> mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql
我们现在将数据恢复到星期二下午1点的状态,但是从该时刻到崩溃之间的数据仍然有丢失。要想恢复,我们需要MySQL服务器将MySQL二进制日志保存到安
全的位置(RAID disks, SAN, ...),应为与数据文件的保存位置不同的地方,保证这些日志不在毁坏的硬盘上。(也就是,我们可以用--log-bin选项启动服务
器,指定一个其它物理设备上的与数据目录不同的位置。这样,即使包含该目录的设备丢失,日志也不会丢失)。如果我们执行了这些操作,我们手头上会
有gbichot2-bin.000009文件,我们可以用它来恢复大部分最新的数据更改,而不会丢失到崩溃时的数据
*
*
*
* 指定恢复时间
如果MySQL服务器启用了二进制日志,你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如,从你最后一次备份)直到现在或另一个指定的时间点
的数据。关于启用二进制日志的信息,参见5.11.3节,“二进制日志”。对于mysqlbinlog的详细信息,参见8.6节,“mysqlbinlog:用于处理二进制日志文件
的实用工具”。
要想从二进制日志恢复数据,你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini,取决于你的系统)中找到路径。如
果未包含在选项文件中,当服务器启动时,可以在命令行中以选项的形式给出。启用二进制日志的选项为--log-bin。要想确定当前的二进制日志文件的文件
名,输入下面的MySQL语句:
SHOW BINLOG EVENTS \G
你还可以从命令行输入下面的内容:
mysql --user=root -pmy_pwd -e ‘SHOW BINLOG EVENTS \G‘
将密码my_pwd替换为服务器的root密码。
指定恢复时间
对于MySQL 4.1.4,可以在mysqlbinlog语句中通过--start-date和--stop-date选项指定DATETIME格式的起止时间。举例说明,假设在今天上午10:00(今天
是2005年4月20日),执行SQL语句来删除一个大表。要想恢复表和数据,你可以恢复前晚上的备份,并输入:
mysqlbinlog --stop-date="2005-04-20 9:59:59" /var/log/mysql/bin.123456 | mysql -u root -pmypwd
该命令将恢复截止到在--stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句,可能你想要
恢复后面发生的活动。根据这些,你可以用起使日期和时间再次运行mysqlbinlog:
mysqlbinlog --start-date="2005-04-20 10:01:00" /var/log/mysql/bin.123456 | mysql -u root -pmypwd 在该行中,从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志
以确保时间确切。下一节介绍如何实现。
*
*
*
表维护和崩溃恢复
后面几节讨论如何使用myisamchk来检查或维护MyISAM表(对应.MYI和.MYD文件的表)。
你可以使用myisamchk实用程序来获得有关你的数据库表的信息或检查、修复、优化他们。下列小节描述如何调用myisamchk(包括它的选项的描述),
如何建立表的维护计划,以及如何使用myisamchk执行各种功能。
尽管用myisamchk修复表很安全,在修复(或任何可以大量更改表的维护操作)之前先进行备份也是很好的习惯
影响索引的myisamchk操作会使ULLTEXT索引用full-text参数重建,不再与MySQL服务器使用的值兼容。要想避免,请阅读5.9.5.1节,“用于myisamchk的一
般选项”的说明。
在许多情况下,你会发现使用SQL语句实现MyISAM表的维护比执行myisamchk操作要容易地多:
· 要想检查或维护MyISAM表,使用CHECK TABLE或REPAIR TABLE。
· 要想优化MyISAM表,使用OPTIMIZE TABLE。
· 要想分析MyISAM表,使用ANALYZE TABLE。
可以直接这些语句,或使用mysqlcheck客户端程序,可以提供命令行接口。
这些语句比myisamchk有利的地方是服务器可以做任何工作。使用myisamchk,你必须确保服务器在同一时间不使用表。否则,myisamchk和服务器之
间会出现不期望的相互干涉。
*
*
*
*
可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
调用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想让myisamchk做什么。在后面描述它们。还可以通过调用myisamchk --help得到选项列表。
tbl_name是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行myisamchk,你必须指定数据库目录的路径,因为myisamchk不知道你的数
据库位于哪儿。实际上,myisamchk不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件拷贝到别处并且在那里执行恢复操
作。
如果你愿意,可以用myisamchk命令行命名几个表。还可以通过命名索引文件(用“ .MYI”后缀)来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目
录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的MyISAM表:
shell> myisamchk *.MYI
如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至可以通过为MySQL数据目录的路径指定一个通配符来检查所有的数据库中的所有表:
shell> myisamchk /path/to/datadir/*/*.MYI
推荐的快速检查所有MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
如果你想要检查所有MyISAM表并修复任何破坏的表,可以使用下面的命令:
shell> myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.MYI
Chapter 5. Database Administration
file:///D:/download/refman-5.1-zh.html-chapter/refman-5.1-zh.html-chapter/database-administration.html[2010/2/24 5:21:46]
该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的详细信息,参见5.9.5.5节,“myisamchk内存使用”。
当你运行myisamchk时,必须确保其它程序不使用表。否则,当你运行myisamchk时,会显示下面的错误消息:
warning: clients are using or haven‘t closed the table properly
这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(例如mysqld服务器)更新的表。
如果mysqld正在运行,你必须通过FLUSH TABLES强制清空仍然在内存中的任何表修改。当你运行myisamchk时,必须确保其它程序不使用表。避免该问
题的最容易的方法是使用CHECK TABLE而不用myisamchk来检查表
*
*
*
*
*
*
可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。
调用myisamchk的方法:
shell> myisamchk [options] tbl_name ...
options指定你想让myisamchk做什么。在后面描述它们。还可以通过调用myisamchk --help得到选项列表。
tbl_name是你想要检查或修复的数据库表。如果你不在数据库目录的某处运行myisamchk,你必须指定数据库目录的路径,因为myisamchk不知道你的数
据库位于哪儿。实际上,myisamchk不在乎你正在操作的文件是否位于一个数据库目录;你可以将对应于数据库表的文件拷贝到别处并且在那里执行恢复操
作。
如果你愿意,可以用myisamchk命令行命名几个表。还可以通过命名索引文件(用“ .MYI”后缀)来指定一个表。它允许你通过使用模式“*.MYI”指定在一个目
录所有的表。例如,如果你在数据库目录,可以这样在目录下检查所有的MyISAM表:
shell> myisamchk *.MYI
如果你不在数据库目录下,可通过指定到目录的路径检查所有在那里的表:
shell> myisamchk /path/to/database_dir/*.MYI
你甚至可以通过为MySQL数据目录的路径指定一个通配符来检查所有的数据库中的所有表:
shell> myisamchk /path/to/datadir/*/*.MYI
推荐的快速检查所有MyISAM表的方式是:
shell> myisamchk --silent --fast /path/to/datadir/*/*.MYI
如果你想要检查所有MyISAM表并修复任何破坏的表,可以使用下面的命令:
shell> myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /path/to/datadir/*/*.MYI
该命令假定你有大于64MB的自由内存。关于用myisamchk分配内存的详细信息,参见5.9.5.5节,“myisamchk内存使用”。
当你运行myisamchk时,必须确保其它程序不使用表。否则,当你运行myisamchk时,会显示下面的错误消息:
warning: clients are using or haven‘t closed the table properly
这说明你正尝试检查正被另一个还没有关闭文件或已经终止而没有正确地关闭文件的程序(例如mysqld服务器)更新的表。
如果mysqld正在运行,你必须通过FLUSH TABLES强制清空仍然在内存中的任何表修改。当你运行myisamchk时,必须确保其它程序不使用表。避免该问
题的最容易的方法是使用CHECK TABLE而不用myisamchk来检查表
*
*
*
*
*
*
*
*
服务器时区支持
MySQL服务器有几个时区设置:
· 系统时区。服务器启动时便试图确定主机的时区,用它来设置system_t