我想删除自已朋友圈创建的位置删除,或修改。

微博里创建的地址怎么删除_百度知道
微博里创建的地址怎么删除
我有更好的答案
步骤如下:博上想要显示自己的地址需要借助新浪微博手机客户端才能实现,因为电脑无法实现定位,而智能手机能够轻松实现这一点。登录微博客户端,点击首页左上角的发布按钮。发微博界面可以看到左上角有个“插入位置”的按钮。合适的位置或者直接搜索自己想要的位置,勾选该位置。地址可以点击右上角的删除位置删除。
先点击新浪微博的账号设置,2、下面有个性域名,这个就是你创建的地址.baidu。3、可以进行修改://b。操作如下1://b.com/zhidao/pic/item/f11f3a292df5e0fe34a85edf72fd.jpg" target="_blank" title="点击查看大图" class="ikqb_img_alink"><img class="ikqb_img" src="http.jpg" esrc="http.hiphotos.baidu.com/zhidao/wh%3D600%2C800/sign=1c793ce557da81cb4eb38bcb6256fc2e/f11f3a292df5e0fe34a85edf72fd:<a href="http://b.hiphotos.hiphotos.baidu.com/zhidao/wh%3D450%2C600/sign=07eab347daa1fe13719cc/f11f3a292df5e0fe34a85edf72fd
点击地址,然后点击右上角,删除位置
1、先点击地址2、然后点击右上角,删除位置
其他2条回答
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。怎么修改或者删除我朋友圈自己创建的地址?_百度知道
怎么修改或者删除我朋友圈自己创建的地址?
我有更好的答案
p>微信发表说说的页面 下面有所在位置 进这里点开就可以看到你的地理位置://e.hiphotos.baidu.com/zhidao/pic/item/e7becc838ec1a506b61.baidu
采纳率:60%
为您推荐:
其他类似问题
&#xe675;换一换
回答问题,赢新手礼包&#xe6b9;
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。扫二维码下载作业帮
3亿+用户的选择
下载作业帮安装包
扫二维码下载作业帮
3亿+用户的选择
请大家帮忙回答一下下面问题有关工具栏的情况,正确的是
A. 工具栏只在所定义的模板中有效
B. 在Word中,我们可以自行定义、创建、修改、复制和删除工具栏C.工具栏总是显示在屏幕上方
D.任何按钮都可以从一个工具栏复制到另一个工具栏
作业帮用户
扫二维码下载作业帮
3亿+用户的选择
自行定义可以,创建、修改、复制和删除不行C
工具栏可以移动位置D
为您推荐:
扫描下载二维码博客访问: 1078741
博文数量: 687
博客积分: 13857
博客等级: 上将
技术积分: 11903
注册时间:
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: WINDOWS
Table of Contents
List of Tables
Chapter&1.&MySQL数据库的数据
Table of Contents
MySQL数据库是由数据组成的,为了能方便管理和使用这些数据,我们把这些数据进行分类,形成各种数据类型,有数据值的类型,有表中数据列的类型,有数据表的类型。理解MySQL的这些数据类型能使我们更好地使用MySQL数据库。下面对各种数据类型进行简单的介绍。
1.1.&数据值类型(data type)
对MySQL中数据值的分类,有数值型、字符型、日期型和空值等,这和一般的编程语言的分类差不多。
1.1.1.&数值
MySQL中的数值分整型和浮点型两种。MySQL支持科学记数法。整型可以是十进制,也可是十六进制数。
1.1.2.&字符串
MySQL支持以单或双引号包围的字符序列。如“MySQL tutorial”、‘Mysql Database’。
MySQL能识别字符串中的转义序列,转义序列用反斜杠()表示。下面是一个转义序列列表。
Table&1.1.&转义序列
NUL(ASCII的0值)
如果字符串本身包含有单双引号,则用以下三种方法中的一种来表示:
字符串的引号和字符串两端的引号双同,则双写该引号。如:'mysql''s test'。
用与字符串的引号不同的引号把字符串引起来,如:"mysql's test"。
用反斜杠转义引号,如:"mysql' test",'mysql' test'。这样就不用理会字符串两端的是单引号还是双引号了。
字符串可由一个十六进制数表示,如0x61表示字符"a"。由MySQL 4.0开始,字符串值也可用ANSI SQL表示法X'val'来表示。如X'61'表示字符"a"。
从MySQL 4.1开始,可以为字符串值专门指定一个字符集。
1.1.3.&日期和时间
MySQL默认按“年-月-日”的顺序显示日期。
1.2.&列类型(column type)
MySQL数据库的表是一个二维表,由一个或多个数据列构成。每个数据列都有它的特定类型,该类型决定了MySQL如何看待该列数据,我们可以把整
型数值存放到字符类型的列中,MySQL则会把它看成字符串来处理。MySQL中的列类型有三种:数值类、字符串类和日期/时间类。从大类来看列类型和数
值类型一样,都是只有三种。但每种列类型都还可细分。下面对各种列类型进行详细介绍。
1.2.1.&数值类的数据列类型
数值型的列类型包括整型和浮点型两大类。
Table&1.2.&数值类数据列类型
数据列类型
非常小的正整数,带符号:-128~127,不带符号:0~255
小整数,带符号:-,不带符号:0~65535
中等大小的整数,带符号:-8607,不带符号:0~
标准整数,带符号:-~,不带符号:0~
大整数,带符号:-5807,不带符号:0~
单精度浮点数,最小非零值:+-1.E-38,最大非零值:+-3.E+38
双精度浮点数,最小非零值:+-2.,最大非零值:+-1.
以字符串形式表示的浮点数,它的取值范围可变,由M和D的值决定。
1.2.1.1.&整型数据列类型
MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL
会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是
999,而是INT整型所允许的最大值。
1.2.1.2.&浮点型数据列类型
MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。
MySQL 4.0.2版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。
浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的,默
认,当MySQL版本大于3.23.6时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在
MySQL3.23.6后可选,默认D值为0,M值为10。
1.2.1.3.&如何选择数值类数据列类型?
为了节省存储空间和提高数据库处理效率,我们应根据应用数据的取值范围来选择一个最适合的数据列类型。如果把一个超出数据列取值范围的数存入该列,
则MySQL就会截短该值,如:我们把99999存入SMALLINT(3)数据列里,因为SMALLINT(3)的取值范围是
-,所以就会被截短成32767存储。显示宽度3不会影响数值的存储。只影响显示。
对于浮点数据列,存入的数值会被该列定义的小数位进行四舍五入。如把一个1.234存入FLOAT(6.1)数据列中,结果是1.2。
DECIMAL与FLOAT和DOUBLE的区别是:DECIMAL类型的值是以字符串的形式被储存起来的,它的小数位数是固定的。它的优点是,不
会象FLOAT和DOUBLE类型数据列那样进行四舍五入而产生误差,所以很适合用于财务计算;而它的缺点是:由于它的存储格式不同,CPU不能对它进行
直接运算,从而影响运算效率。DECIMAL(M,D)总共要占用M+2个字节。
1.2.1.4.&数值类数据列的属性
ZEROFILL属性适用于所有数值类数据列类型,作用是,如果数值的宽度小于定义的显示宽度,则在数值前填充0。
UNSIGNED属性不允许数据列出现负数。
AUTO_INCREMENT属性可生成独一无二的数字序列。只对整数类的数据列有效。
NULL和NOT NULL属性设置数据列是否可为空。
DEFAULT属性可为数据列指定默认值。
1.2.2.&字符串类数据列类型
字符串可以用来表示任何一种值,所以它是最基本的类型之一。我们可以用字符串类型来存储图象或声音之类的二进制数据,也可存储用gzip压缩的数据。下表介绍了各种字符串类型:
Table&1.3.&字符串类数据列类型
占用存储空间
VARCHAR[(M)]
TINYBLOD,TINYTEXT
BLOB,TEXT
2^16-1字节
MEDIUMBLOB,MEDIUMTEXT
2^24-1字节
LONGBLOB,LONGTEXT
2^32-1字节
ENUM('value1','value2',...)
65535个成员
SET('value1','value2',...)
1,2,3,4或8字节
L+1、L+2是表示数据列是可变长度的,它占用的空间会根据数据行的增减面则改变。数据行的总长度取决于存放在这些数据列里的数据值的长度。
L+1或L+2里多出来的字节是用来保存数据值的长度的。在对长度可变的数据进行处理时,MySQL要把数据内容和数据长度都保存起来。
如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。
ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。
字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:
二进制字符串被视为一个连续的字节序列,与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。
非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。
在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服务器的字符集作为默认字符集。
非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式:
二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。
非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。
二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳
20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字
节字符集,它能容纳的字符个数肯定少于20个。
1.2.2.1.&CHAR和VARCHAR
CHAR和VARCHAR是最常用的两种字符串类型,它们之间的区别是:
CHAR是固定长度的,每个值占用相同的字节,不够的位数MySQL会在它的右边用空格字符补足。
VARCHAR是一种可变长度的类型,每个值占用其刚好的字节数再加上一个用来记录其长度的字节即L+1字节。
CHAR(0)和VARCHAR(0)都是合法的。VARCHAR(0)是从MySQL4.0.2版开始的。它们的作用是作为占位符或用来表示各种on/off开关值。
如何选择CHAR和VARCHAR,这里给出两个原则:
如果数据都有相同的长度,选用VARCHAR会多占用空间,因为有一位用来存储其长度。如果数据长短不一,选用VARCHAR能节省存储空间。而CHAR不论字符长短都需占用相同的空间,即使是空值也不例外。
如果长度出入不大,而且是使用MyISAM或ISAM类型的表,则用CHAR会比VARCHAR好,因为MyISAM和ISAM类型的表对处理固定长度的行的效率高。
在一个数据表里,只要有一个数据列的长
度是可变的,则所有数据列的长度将是可变的。MySQL会进行自动地转换。一个例外,CHAR长度小于4的不会进行自动转换,因为MySQL会认为这样做
没必要,节省不了多少空间。反而MySQL会把大量长度小的VARCHAR转换成CHAR,以减少空间占用量。
1.2.2.2.&BLOB和TEXT
BLOB是二进制字符串,TEXT是非二进制字符串。两者都可存放大容量的信息。
有关BLOB和TEXT索引的建立:
BDB表类型和MySQL3.23.2以上版本的MyISAM表类型允许在BLOB和TEXT数据列上建立索引。
ISAM、HEAP和InnoDB表不支持大对象列的索引。
使用BLOB和TEXT应注意的问题:
由于这两个列类型所存储的数据量大,所以删除和修改操作容易在数据表里产生大量的碎片,需定期运行OPTIMIZE TABLE以减少碎片和提高性能。
如果使用的值非常巨大,就需对服务器进行相应的优化调整,增加max_allowed_packet参数的值。对那些可会用到变些巨大数据的客户程序,也需加大它们的数据包大小。
1.2.2.3.&ENUM和SET
ENUM和SET都是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列表中进行选择。ENUM和SET的主要区别是:
ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。例如:ENUM("N","Y")表示,该数据列的取值要么是"Y",要么就是"N"。
SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。
ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。
ENUM的合法取值列表中的字符串被按声明定义的顺序被编号,从1开始。
SET的编号不是按顺序进行编号的,SET中每一个合法取值都对应着SET值里的一个位。第一个合法取值对应0位,第二个合法取值对应1
位,以此类推,如果数值形式的SET值等于0,则说明它是一个空字符串,如果某个合法的取值出现在SET数据列里,与之对应的位就会被置位;如果某个合法
的取值没有出现在SET数据列里,与之对应的位就会被清零。正因为SET值与位有这样的对应关系,所以SET数据列的多个合法取值才能同时出现并构成
1.2.2.4.&字符串类型数据列的字符集属性
在MySQL 4.1以前的版本,字符串数据列的字符集由服务器的字符决定,MySQL 4.1版以后的版本可对每个字符串数据列指定不同的字符串。如果按默认方式设置,可按数据列、数据表、数据库、服务器的顺序关联字符串的字符集,直到找一个明确定义的字符集。
1.2.3.&日期,时间型数据列类型
MySQL的日期时间类型有:DATE,DATETIME,TIME,TIMESTAMP和YEAR,下表是这些类型的取值范围和存储空间要求:
Table&1.4.&日期,时间类型列
零值表示法
3字节(MySQL3.23版以前是4字节 )
-838:59:59~838:59:59
00:00:00~ 23:59:59
00~2037年的某个时刻
YEAR(4): YEAR(2):
MySQL总是把日期和日期里的年份放在最前面,按年月日的顺序显示。
1.2.3.1.&DATE、TIME、DATATIME数据列类型
DATE、TIME和DATATIME类型分别存放日期值、时间值、日期和时间值的组合。它们的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。
DATATIME里的时间值和TIME值是有区别的,DATATIME里的时间值代表的是几点几分,TIME值代表的是所花费的时间。当向TIME数据列插值时,需用时间的完整写法,如12分30秒要写成“00:12:30”。
1.2.3.2.&TIMESTAMP数据列类型
TIMESTAMP数据列的格式是CCYYMMDDhhmmss,取值范围从00开始,即号,最大到2037年。它的特点是能把数据行的创建或修改时间记录下来:
如果把一个NULL值插入TIMESTAMP列,这个数据列就将自动取值为当前的日期和时间。
在创建和修改数据行时,如果没有明确对TIMESTAMP数据列进行赋值,则它就会自动取值为当前的日期和时间。如果行中有多个TIMESTAMP列,只有第一个会自动取值。
如果对TIMESTAMP设置一个确定的日期和时间值,则会使TIMESTAMP的自动取值功能失效。
TIMESTAMP默认的列宽是14,可指定列宽,以改变显示效果。但不论你指定的列宽如何,MySQL都是以4字节来存储TIMESTAMP值,也总是以14位精度来计算。
如果需要把创建时间和最近一次修改时间同时记录下来,可以用两个时间戳来记录,一个记录创建时间,一个记录修改时间。不过需记住两件事,一是要把记
录修改时间的TIMESTAMP数据列放在最前面,这样才会自动取值;二是创建一条新记录时,要用now()函数来初始化创建时间TIMESTAMP数据
列,这样,该TIMESTAMP数据列就不会再变化。
1.2.3.3.&YEAR
YEAR是一种单字节的数据列类型,YEAR(4)的取值范围是,YEAR(2)的取值范围是,但只显示最后
两位数。MySQL能自动把两位数字年份转换成四位数字的年份,如97和14分被转换成。转换规则是这样的:
年份值00~69将被转换成;
年份值70~99将被转换成。
00被转换成0000,而不是2000。因为数值00也就是0,而0值是YEAR的一个合法取值。
1.3.&唯一编号
在数据库应用,我们经常要用到唯一编号,以标识记录。在MySQL中可通过数据列的AUTO_INCREMENT属性来自动生成。MySQL支持多种数据表,每种数据表的自增属性都有差异,这里将介绍各种数据表里的数据列自增属性。
如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,MySQL将自动生成下一个序列编号。编号从1开始,并1为基数递增。
把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况,情况一,如果插入的值与已有的编
号重复,则会出现出错信息,因为AUTO_INCREMENT数据列的值必须是唯一的;情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并
使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
如果自增序列的最大值被删除了,则在插入新记录时,该值被重用。
如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。
如果用replace命令基于AUTO_INCREMENT数据列里的值来修改数据表里的现有记录,即
AUTO_INCREMENT数据列出现在了replace命令的where子句里,相应的AUTO_INCREMENT值将不会发生变化。但如果
replace命令是通过其它的PRIMARY KEY OR
UNIQUE索引来修改现有记录的(即AUTO_INCREMENT数据列没有出现在replace命令的where子句中),相应的
AUTO_INCREMENT值--如果设置其为NULL(如没有对它赋值)的话--就会发生变化。
last_insert_id()函数可获得自增列自动生成的最后一个编号。但该函数只与服务器的本次会话过程中生成的值有关。如果在与服务器的本次会话中尚未生成AUTO_INCREMENT值,则该函数返回0。
其它数据表的自动编号机制都以ISAM表中的机制为基础。
MyISAM数据表
删除最大编号的记录后,该编号不可重用。
可在建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
可用alter table table_name AUTO_INCREMENT=n命令来重设自增的起始值。
可使用复合索引在同一个数据表里创建多个相互独立的自增序列,具体做法是这样的:为数据表创建一个由多个数据列组成的
PRIMARY KEY OR
UNIQUE索引,并把AUTO_INCREMENT数据列包括在这个索引里作为它的最后一个数据列。这样,这个复合索引里,前面的那些数据列每构成一种
独一无二的组合,最末尾的AUTO_INCREMENT数据列就会生成一个与该组合相对应的序列编号。
HEAP数据表
HEAP数据表从MySQL4.1开始才允许使用自增列。
自增值可通过CREATE TABLE语句的 AUTO_INCREMENT=n选项来设置。
可通过ALTER TABLE语句的AUTO_INCREMENT=n选项来修改自增始初值。
编号不可重用。
HEAP数据表不支持在一个数据表中使用复合索引来生成多个互不干扰的序列编号。
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。
可重用编号。
支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
InnDB数据表
不可通过CREATE TABLE OR ALTER TABLE的AUTO_INCREMENT=n选项来改变自增初始值。
不可重用编号。
不支持在一个数据表里使用复合索引来生成多个互不干扰的序列编号。
在使用AUTO_INCREMENT时,应注意以下几点:
AUTO_INCREMENT是数据列的一种属性,只适用于整数类型数据列。
设置AUTO_INCREMENT属性的数据列应该是一个正数序列,所以应该把该数据列声明为UNSIGNED,这样序列的编号个可增加一倍。
AUTO_INCREMENT数据列必须有唯一索引,以避免序号重复。
AUTO_INCREMENT数据列必须具备NOT NULL属性。
AUTO_INCREMENT数据列序号的最大值受该列的数据类型约束,如TINYINT数据列的最大编号是127,如加上UNSIGNED,则最大为255。一旦达到上限,AUTO_INCREMENT就会失效。
当进行全表删除时,AUTO_INCREMENT会从1重新开始编号。全表删除的意思是发出以下两条语句时:
delete from table_
truncate table table_name
这是因为进行全表操作时,MySQL实际是做了这样的优化操作:先把数据表里的所有数据和索引删除,然后重建数据表。如果想删除所有的数据行又想保留序列编号信息,可这样用一个带where的delete命令以抑制MySQL的优化:
delete from table_name where 1;
这将迫使MySQL为每个删除的数据行都做一次条件表达式的求值操作。
强制MySQL不复用已经使用过的序列值的方法是:另外创建一个专门用来生成AUTO_INCREMENT序列的数据表,并做到永远不去删
除该表的记录。当需要在主数据表里插入一条记录时,先在那个专门生成序号的表中插入一个NULL值以产生一个编号,然后,在往主数据表里插入数据时,利用
LAST_INSERT_ID()函数取得这个编号,并把它赋值给主表的存放序列的数据列。如:
insert into id set id = NULL;
insert into main set main_id = LAST_INSERT_ID();
可用alter命令给一个数据表增加一个具有AUTO_INCREMENT属性的数据列。MySQL会自动生成所有的编号。
要重新排列现有的序列编号,最简单的方法是先删除该列,再重建该,MySQL会重新生连续的编号序列。
在不用AUTO_INCREMENT的情况下生成序列,可利用带参数的LAST_INSERT_ID()函数。如果用一个带参数的
LAST_INSERT_ID(expr)去插入或修改一个数据列,紧接着又调用不带参数的LAST_INSERT_ID()函数,则第二次函数调用返回
的就是expr的值。下面演示该方法的具体操作:
先创建一个只有一个数据行的数据表:
create table seq_table (id int unsigned not null);
insert into seq_table values (0);
接着用以下操作检索出序列号:
update seq_table set seq = LAST_INSERT_ID( seq + 1 );
select LAST_INSERT_ID();
通过修改seq+1中的常数值,可生成不同步长的序列,如seq+10可生成步长为10的序列。
该方法可用于计数器,在数据表中插入多行以记录不同的计数值。再配合LAST_INSERT_ID()函数的返回值生成不同内容的计数值。这种方法的优点是不用事务或LOCK,UNLOCK表就可生成唯一的序列编号。不会影响其它客户程序的正常表操作。
1.4.&字符集支持
MySQL4.1以前版本服务器只能使用单一字符集,从MySQL4.1版本开始,不仅服务器能够使用多种字符集,而且在服务器、数据库、数据表、数据列以及字符串常数多个级别上设置不同的字符集。
1.4.1.&MySQL4.1以前版本
MySQL4.1以前版本的字符集由服务器默认指定,默认值是编译系统时指定的字符集,该字符集也可通过在启动服务器时指定--default-
character-set来修改。这种修改会对数据表的索引造成影响,因为索引的顺序是和字符集有关的,修改字符集会使这个已排序的顺序产生错误。要解
决该问题,我们要用修改后的字符集的排序顺序重建表的索引。重建索引有以下几种方法:
用mysqldump导出数据,再清除表里的内容,最后用导出文件重新导入。数据表的索引将在导入数时重建。该方法适用于所有数据表类型。
删除索引,然后重建。用alter table命令或drop index和create index命令来完成。该方法也适用于所有数据表类型。但该方法需要我们了解重建索引的精确定义。
MyISAM数据表的索引可以用myisamchk程序的--recover和--quick选项加上一个用来设定新字符集的--set-
character-set选项进行重建。还可以用mysqlcheck程序的--repair和--quick选项或者一个带QUICK选项的
REPLACE TABLE语句来重建索引,这种方式较方便。
1.4.2.&MySQL4.1以后版本
MySQL4.1以后的版本对字符集的支持好了很多,具有以下新增功能:
支持服务器同时使用多种字符集。
允许在服务器,数据库,数据表,数据列等多级别上设置不同的字符集。
服务器的默认字符集在编译时选定,但可在启动服务器时用--default-character-set选项来更改。
用ALTER DATABASE db_name DEFAULT CHARACTER SET charset来设置数据库字符集。 如果只有default参数,则使用服务器的字符集。
用CREATE TABLE table_name(...) CHARACTER SET = charset设置数据表字符集。如果charset为default,则使用数据表所在数据库的字符集作为数据表的字符集。
在数据列中,可用CHARACTER SET charset属性来设置数据列的字符集。charset不能是default,如果没有该属性,则默认使用数据表的字符集。允许设置字符集的数据列有char,varchar(不带binary属性)及TEXT类型。
用_charset str转换字符串常数的字符集。如:_utf8 'mysql',_latinl
'oracle'。该方法只适用于括在引号内的字符串,其它十六进制常数 、字符串表达式等可用CONVERT()函数进行转换,如:SELECT
CONVERT( str USING charset)。
通过MySQL提供的函数可进行字符集转换和查询。
新增的COLLATE操作符使我们可按某一种字符集的排序顺序来处理另一种字符集的数据。如:SELECT a from t ORDER BY a COLLATE utf-8;
用SHOW CHARACTER SET命令可显示服务器支持的字符集列表。
当服务器转换到另一种字符集时,会自动对索引进行重新排序。
通过UTF-8和UCS2字符集提供了Unicode支持。
MySQL现在还不支持:1,在同一个字符串里混用不同字符集的字符;2,在同一个数据列里混用不同的字符集。
1.4.3.&各级字符集的查询方法
SHOW CHARACTER SET;可查出可供使用的所有字符集。
SHOW VARIABLES LIKE 'character_set';可查出服务器的默认字符集。
可查出数据库级的字符集。
SHOW CREATE DATABASE db_name;
两条命令可查出数据表的字符集。
SHOW CREATE TABLE table_name;
SHOW TABLE STATUS LIKE 'table_name'
以下几命令可查出数据列的字符集:
DESCRIBE table_
SHOW COLUMNS FROM table_
SHOW CREATE TABLE table_
用CHARSET()函数可确定特定字符串,字符串表达式或数据列值相关联的字符串的字符集。如:SELECT CHARSET(str)。
1.4.4.&Unicode支持
MySQL提供两种字符集来支持Unicode。一个是UTF-8,一种可变长的编码格式,需用1至4个字节来表示一个字符;另一个是UCS2,该字符集中的每个字符需要用两个字节来表示。
1.5.&如何选择数据列类型?
选择正确的数据列类型能大大提高数据库的性能和使数据库具有高扩展性。在选择数据列类型时,请从以下几个方面考虑:
存放到数据列中的数据类型。
数据值的取值范围。
考虑性能和处理效率。
数值操作比字符操作快。
小类型的处理速度比大类型快。
不同数据表中固定长度类型和可变长度类型的处理效率是不同的。
可变长度类型在经过删除和修改操作后容易产生碎片,降低系统性能,需定期运行OPTIMIZE TABLE命令以优化数据表。
固定长度类型由于有固定的长度,所以容易确定每条记录的起始点,可加快数据表的修复速度。
在MyISAM和ISAM表中使用固定长度类型数据列有助改善数据库性能。
在InnoDB表中,固定长度和可变长度数据列类型都以相同方式存储,所以固定长度数据列类型并没有性能优势,反而由于可度长度数据列类型由于占用存储空间较少,所以处理速度会快些。
可索引类型能加快数据的查询速度。
明确指定数据列的NOT NULL属性可使MySQL在检索过程中不用去判断数据列是否是NULL,所以可加快处理速度。
数据如何进行比较,是否区分大小写。
是否要在数据列上建立索引。
1.6.&表达式操作符
Table&1.5.&算术操作符
Table&1.6.&逻辑操作符
a AND b 或 a && b
逻辑与,若两个操作数同时为真,则为真
a OR b 或 a || b
逻辑或,只要有一个操作数为真,则为真
逻辑异或,若有且仅有一个操作数为真,则为真
NOT a 或 !a
逻辑非,若操作数为假,则为真
Table&1.7.&位操作符
按位与,若操作数同位同为1,则该位为1
按位或,若操作数同位有一位为1,则该位为1
按拉异或,若操作数同一位分别为1和0,则该位为1
把a中的各个位左移b个位置
把a中的各个位右移b个位置
Table&1.8.&比较操作符
若两个操作数相等,则为真
若两个操作数相等,则为真,可用于NULL值比较
a != b 或 a
若两个操用数不等,则为真
若a小于b,则为真
若a小于或等于b,则为真
若a大于b,则为真
若a大于或等于b,则为真
a IN (b1,b2,...)
若a等于b1,b2,...中的某一个,则为真
a BETWEEN b AND c
若a在b和c之间(包括b和c),则为真
NOT BETWEEN
a NOT BETWEEN b AND c
若a不在b和c之间(包括b和c),则为真
SQL模式匹配,若a匹配b,则为真
a NOT LIKE b
SQL模式匹配,若a不匹配b,则为真
a REGEXP b
正则表达式匹配,若a匹配b,则为真
NOT REGEXP
a NOT REGEXP b
正则表达式匹配,若a不匹配b,则为真
若a为NULL,则为真
IS NOT NULL
a IS NOT NULL
若a不为NULL,则为真
LIKE模式匹配中的“%”匹配任意个字符,“_”匹配一个字符。匹配不区分大小写字符。
Table&1.9.&操作符优先级(由高至低排列)
BINARY,COLLATE
-(一元求负操作符)、~(一元取反操作符)
<、<=、=、、!=、、>=、>、IN、IS、LIKE、REGEXP、RLIKE
BETWEEN、CASE、WHEN、THEN、ELSE
1.7.&类型转换
在MySQL的表达式中,如果某个数据值的类型与上下文所要求的类型不相符,MySQL则会根据将要进行的操作自动地对数据值进行类型转换。如:
会转换成1 + 2 = 3
会转换成1 + 0 = 1 由于abc不能转换成任何的值,所以默认为0
MySQL会根据表达式上下文的要求,把字符串和数值自动转换为日期和时间值
对于超范围或非法的值,MySQL也会进行转换,但转换出来的结果是错误的。出现该情况时,MySQL会提示警告信息,我们可捕获该信息以进行相应的处理。
Chapter&2.&查询优化
Table of Contents
数据库是数据的集合,与数学的集合论有密不可分的关系。
为提高查询速度,我们可以:
对数据表添加索引,以加快搜索速度;
通过编程技巧最大限度地利用索引;
优化查询语句,以使服务器最快响应多客户的请求。
研究硬件处理过程,减少物理约束。
索引技术是关系数据查询中最重要的技术。如果要加提升数据库的性能,索引优化是首先应该考虑的。因为它能使我们的数据库得到最大性能方面的提升。
索引的优点:
没有索引的表是没有排序的数据集合,如果要查询数据需进行全表扫描。有索引的表是一个在索引列上排序了数据表,可通过索引快速定位记录。在
MyISAM和ISAM数据表中,数据行保存在数据文件中,索引保存在索引文件中。BDB与InnoDB数据表把数据与索引放在同一个文件中。
在多表关联查询中,索引的作用就更大。如果没有索引,在最坏的情况下,全表扫描的次数可能是各表数据行的组合个数,可能是一个天文数字。这样的查询是破坏性的,可能会造成数据库瘫痪。
对于使用了MIN()或是MAX()函数的查询,如果相关的数据列上有索引,MySQL能直接找到该最大、最小值的行,根本不用一个一个地去检查数据行。
索引加快ORDER BY 和 GROUP BY子句的操作。
当在数值型数据列上查询数据,而该列有索引,索引能使MySQL根本不用去读取数据行,直接从索引取值。
索引的缺点:
索引需占用磁盘空间。
索引会减慢在索引数据列上的插入、删除和修改操作。
索引列的选择
索引应该创建在搜索、排序、分组等操作所涉及的数据列上。也就是说,在where子句,关联检索中的from子句、order by或group by子句中出现过的数据列最适合用来创建索引。
尽量使用唯一索引,它能使索引发挥最好的效能。
尽量用比较短的值进行索引。当对字符串进行索引时,应该指定一个前缀长度,比如对字符串的前10位或20位的字符进行排序,而不用把整个字
符串几十个字符用来索引排序。这样能减少磁盘I/O,提高处理速度。最重要的一点是,键值越短,索引缓冲区里容纳的键值也就越多,而MySQL同时保存在
内存里的索引越多,索引缓冲区的命中率也就越高。当然,只对数据列第一个字符进行索引是没什么意义的。
充分利用最左前缀。所谓最左前缀也就是在复合索引中最边的索引列。如复合索引(a,b,c) ,其中a就是最左前缀。它是使用率最高的索引,需认真选择。
不要建太多索引,索引是会消耗系统资源的,要适可而止。
索引主要用于<、=、>、BETWEEN等的比较操作中,所以索引应该建立在与这样操作相关的数据列上。
利用慢查询日志来找出性能差的查询,通过mysqldumpslow可查看该日志。针对性能差的查询可利用索引来加快查询速度。
2.2.&查询优化程序
当我们发一条查询命令时,MySQL分对它进行分析,以优化查询。把explain语名放到查询前面可显示查询的执行路线,对优化查询提供有用的信息。以下几个原则可帮助系统挑选和使用索引:
尽量对同类型的数据列进行比较。如:VARCHAR(5)和VARCHAR(5)是同类型的,CHAR(5)和VARCHAR(5)是不同类型的。
尽量让索引的数据列在比较表达式中单独出现,不要把它包含在函数或复杂表达式。否则索引会不起作用。
尽量不要在LIKE模式的开头使用通配符。如:%string%。
对于MyISAM和BDB数据表,用ANALYZE
TABLE语句让服务器对索引键值的分布进行分析,为优化程序提供更有价值的信息。另一个方法是用myisamchk
--analyze(适用于MyISAM表)或isamchk --analyze(适用于ISAM表)命令。
用EXPLAIN语句来分析查询语句的执行效率。检查查询所使用的索引是不是能够迅速地排除不符合条件的数据行,如果不是,可以试着用STRAIGHT_JOIN强制各有关数据表按指定顺序进行关联。
尝试查询的不同写法,比较运行情况。
不要滥用MySQL的类型自动转换功能。自动转换会减慢查询的速度并会使有关的索引失效。
2.3.&数据列类型与查询效率
选用适当的数据列类型有助于提高查询命令的执行速度,下面是几点关于如何选择合适数据列类型的建议:
尽量选用尺寸较小的数据列。这样能节约磁盘空间和加快查询速度。如果较短的数据列上建有索引,则索引的处理速度会进一步提高。
针对数据列类型,尽量选择最适用的数据表类型。如固定长度数据列在MyISAM或ISAM数据表中的速度是最快的,所以在这样数据表中尽量
使用char类型而不是varchar类型来保存字符串数据。对于InnoDB数据表类型,由于varchar类型可有效减少占用空间,从而减少磁盘
I/O,所以使用varchar类型是有利的。对于BDB类型数据表,使用定长和不定长列类型的区别就不大,可任选一种。
尽量把数据列声明为NOT NULL,以节约存储空间和加快处理速度。
对于取值范围有限的数据列,考虑使用ENUM数据列类型。ENUM数据列类型在MySQL中的处理速度是很快。
使用PROCEDURE ANALYSE()语句来分析数据表,它会对数据列的声明提出建议,我们可根据建议进行修改。
select * from table_name PROCEDURE ANALYSE();
select * from table_name PROCEDURE ANALYSE(16,256);
#(16,256)含义是:如果某列的不同取值在16个以上或长度超过256字节,就不提出使用ENUM的建议。
用OPTIMIZE
TABLE语句对容易出现碎片的数据表进行整理。包含可变长数据列的数据表都会产生碎片,从而占用多余的磁盘空间和影响查询速度。所以要定期运行
TABLE语句以防止数据表查询性能降低。但该语句只对MyISAM数据表有效。对各种数据表通用的碎片整理方法是这样的:先用工具程序
mysqldump导出数据表,再删除数据表后重建,如:
$ mysqldump --opt db_name table_name > dump.sql
$ mysql db_name < dump.sql
把非结构化和变化大的数据放在BLOB数据列里,定期用OPTIMIZE TABLE命令优化。
人为地给数据表增加一个数据列,以充当索引。做法是这样的,先根据数据表里的其它数据列计算出一个散列值,并保存在一个数据列里,然后通过
搜索散列值来检索数据行。注意,该技巧只适用于精确匹配型查询。散列值在大于,小于等的操作中不起作用。散列值可以MD5()(适用于3.23及以上版
本),SHA1()(适用于4.0.1及以上版本),CRC32()(适用于4.1及以上版本)等函数生成。使用散列值支检索BLOB和TEXT值的做法
比直接检索BLOB和TEXT本身的做法快。
尽量避免对大尺寸的BLOB值进行检索。如果要检索都应该通过它的上面提到散列值先进行筛选。而不应该盲目地在网络中传送大量BLOB值。
如果把BLOB值剥离到另外一个数据表里去,可实现数据表中其它数据列转变成固定长度数据列的话。就即可减少数据表碎片,又可使在原始表中的select *查询不会把大尺寸的BLOB值不必要地通过网络传送。
2.4.&有效地加载数据
有时我们需大量地把数据加载到数据表,采用批量加载的方式比一个一个记录加载效率高,因为MySQL不用每加载一条记录就刷新一次索引。下面介绍几个有助于加快数据加载的操作:
使用LOAD DATA语句要比INSERT语句的加载速度快。
LOAD DATA比LOAD DATA LOCAL语句的效率高。前者可由服务器直接从本地磁盘读取加载数据,后者需由客户程序去读取文件并通过网络传送到服务器。
如果一定要用INSERT语句,应尽量在一条语句中插入多个数据行。
如果必须使用多条INSERT语句,则应尽量把它们集中在一起放到一个事务中进行处理,而不是在自动提交模式下执行它们:如:
INSERT INTO table_name values (...);
INSERT INTO table_name values (...);
INSERT INTO table_name values (...);
对于不支持事务的表,应对表进行写锁定,然后在表锁定期间对表进行INSERT操作,如:
LOCK TABLES table_name WRITE;
INSERT INTO table_name ...;
INSERT INTO table_name ...;
INSERT INTO table_name ...;
UNLOCK TABLES;
利用客户/服务器通信协议中的压缩功能以减少网络传输的数据量。但该压缩会消耗大量的系统资源,所以小心使用。
尽量让MySQL插入默认值。不要在INSERT中写太多值,以减少网络传输量和服务器端的语法分析时间。
对于MyISAM和ISAM数据表,如果需加载大量数据,应先建立一个没索引的表,加载数据后再创建索引。该方法不适用于InnoDB或BDB数据表。
禁用和重新激活索引的方法有两种:
使用ALTER TABLE语句的DISABLE KEYS和ENABLE KEYS命令,如:
ALTER TABLE table_name DISABLE KEYS;
ALTER TABLE table_name ENABLE KEYS;
使用myisamchk或isamchk工具。如:
$ myisamchk --keys-used=0 table_name
$ myisamchk --recover --quick --key-used=n table_name
n是用来表明需要激活索引的位掩码,第0位对应第一个索引,如果有三个索引,n值就是7(二进制111)。索引编号可以下命令确定:
$ myisamchk --description table_name
2.5.&调度和锁定
在很多客户一起查询数据表时,如果使客户能最快地查询到数据就是调度和锁定做的工作了。在MySQL中,我们把select操作叫做读,把对数据表修改增加的操作(INSERT,UPDATE,REPLACE...)叫做写。MySQL的基本调度策略可以归纳为以下两条:
写入请求将按它们到达服务器的顺序进行处理;
写操作的优先级要高于读操作。
MyISAM和ISAM数据表的调度策略是在数据表锁的帮助下实现的,在客户程序要访问数据表之前,需获得相应的锁,在完成对数据表的操作后,再释
放该锁。锁的管理通常由服务器管理,也可人为地用LOCK TABLES和UNLOCK
TABLES命令来申请和释放锁。写操作时,需要申请一个独占性的锁,也就是说在写操作其间,该表只能由写操作的客户使用。读操作时,客户必须申请一个允
许其他客户对数据表进行写操作的锁,以确保客户在读的过程中数据表不会发生改变。但读操作锁不是独占的,可有多个读操作同时作用于同一个数据表。
通过一些修饰符可影响调度策略,如LOW_PRIORITY(用于DELETE,INSERT,LOAD
DATA,REPLACE,UPDATE语句)、HIGH_PRIORITY(用于SELECT语句)、DELAYED(用于INSERT和
REPLACE语句)。它们的作用是这样的:
LOW_PRIORITY会使写操作的优先级降低到读操作以下,也就是说读操作会阻塞该级别的写操作,SELECT的HIGH_PRIORITY有类似的作用。
INSERT语句中的DELAYED修饰会使插入操作被放入一个“延迟插入”队列。并返回状态信息给客户,使客户程序可在新数据行还没插入
到数据表之前继续执行后面的操作。如果一直有客户读该数据表,新数据行会一直待在队列中,直到数据表没有读操作时,服务器才会把队列中的数据行真正插入到
数据表中。该语句可用在以下场合,在一个有冗长查询的数据表中插入数据,而你又不想被阻塞,你就可发出INSERT
DELAYED语句,把插入操作放入服务器“延迟插入”队列,你无需等待就马上可进行接下来的操作。
当一个数据表里从未进行过删除操作或刚刚对它进行过碎片整理的情况下,用INSERT语句插入的数据行只会被添加到数据表的末尾,而不会插
入到数据表的中间位置。这样,对于MyISAM表,MySQL允许在有其它客户正在读操作的时间进行写操作。我们称之这并发插入。要使用该技巧,需注意以
下两个问题:
不要在INSERT语句中使用LOW_PRIORITY修饰符。
读操作应用LOCK TABLES ... READ LOCAL而不是用LOCK TABLES ... READ语句来进行数据表读锁定。LOCAL关键字只对数据表中已存在行进行锁定,不会阻塞把新行添加到数据表末尾。
BDB数据表使用页面级操作锁,InnoDB数据表使用数据行级操作锁。所以这两种表的并发性比MyISAM和ISAM数据表这种表级锁的并发性会好很多。其中InnoDB的并发性最好。综上所述,我们可得出以下结论:
MyISAM和ISAM数据表的检索速度最快,但如果在检索和修改操作较多的场合,会出锁竞争的问题,造成等待时间延长。
BDB和InnoDB数据表能在有大量修改操作的环境下提供很好的并发性,从而提供更好的性能。
MyISAM和ISAM数据表由于进行表级锁定,所以不会出现死锁现象,BDB和InnoDB数据表则存在死锁的可能性。
2.6.&服务器优化
优化原则:
内存里的数据要比磁盘上的数据访问起来快;
站数据尽可能长时间地留在内存里能减少磁盘读写活动的工作量;
让索引信息留在内存里要比让数据记录的内容留在内存里更重要。
针对以上几个原则,我们应该调整服务器:
增加服务器的缓存区容量,以便数据在内存在停留的时间长一点,以减少磁盘I/0。下面介绍几个重要的缓冲区:
数据表缓冲区存放着与打开的数据表相的信息,它的大小可由服务器参数“table_cache”设置。Opened_tables
参数记录服务器进行过多少次数据表打开操作,如果该值变化很大,就可能是数据表缓冲区已满,需把一些不常用的表移出缓冲区,以腾出空打开新的数据表。可用
以下命令查看Opened_tables的值:
SHOW STATUS LIKE 'Opened_tables';
在MyISAM和ISAM数据表中,索引被缓存在“key buffer”里,它的大小由服务器参数“key_buffer_size”来控制。系统默认的大小是8M,如果内存充足的话可适当扩大该值,以使更多索引块缓存在该区里,以加快索引的速度。
InnoDB和BDB数据表也各有一个缓冲区,分别叫innodb_buffer_pool_size和bdb_cache_size。InnoDB还有一个日志缓冲区叫innodb_log_buffer_size。
自4.0.1开始,MySQL多了一个缓冲区,叫查询缓冲区,主要用来存放重复执行的查询文本和结果,当再次遇到相同的查询,服务
器会直接从缓冲区中返回结果。该功能是内建的功能,如不想支持该功能,可在编译服务器时用configure脚本的--without-query-
cache选项去掉该功能。
查询缓冲区由三个服务器参数控制,分别是:
1、query_cache_size
控制缓冲区的大小,如果该值为0,则禁用查询缓冲功能。设置方法是在选项文件中设置:
set-variable = query_cache_size = 16M
这样就设置了一个16M的查询缓冲区
2、query_cache_limit
缓冲结果集的最大容量(以字节为单位),如果查询的结果集大于该值,则不缓冲该值。
3、query_cache_type
缓冲区的操作模式。
0表示不进行缓冲;
1表示除SELECT SQL_NO_CACHE开头的查询外,其余的都缓冲;
2表示只对以SELECT SQL_ON_CACHE开头的查询进行缓冲。
默认情况下,按服务器的设置进行缓冲,但客户端也可通过命令改变服务器设置。客户端可直接用SELECT
SQL_NO_CACHE和SELECT
SQL_CACHE命令来要求服务器缓冲或不缓冲查询结果。如果不想每条查询都写参数,我们也可在客户端用SET
SQL_QUERY_CACHE_TYPE =来改变服务器的查询缓冲行为。val可取值0,1,2或OFF,ON,或DEMAND。
禁用用不着的数据表处理程序。如服务器是从源码创建,就可彻底禁用ISAM,InnoDB和BDB数据表。
权限表里的权限关系应尽可能简单,当然了,是要在保证安全的前提下。
在从源码创建服务器时,尽量使用静态库而不是共享库来完成其配置工作。静态库的执行速度更快,但如果要加载用户定义函数(UDF)的话,就不能使用静态库,因为UDF机制必须依赖动态库才能实现。
2.7.&硬件优化
为了提高数据运行速度,升级硬件是最直接的解决方案。针对数据库应用的特点,在升级硬件时应考虑以下内容:
对于数据库服务器,内存是最重要的一个影响性能因素。通过加大内存,数据库服务器可把更多的数据保存在缓冲区,可大大减少磁盘I/O,从而提升数据库的整体性能。
配置高速磁盘系统,以减少读盘的等待时间,提高响应速度。
合理分布磁盘I/O,应把磁盘I/O分散在多个设备上,以减少资源竞争,提高并行操作能力。
配置多处理器,MySQL是多线程的数据库,多处理器可同时执行多个线程。
Chapter&3.&数据库管理
Table of Contents
数据库是一个复杂而又关键的系统,为确保系统安全、高效运行,需熟悉数据库内部的运作机制,掌握各种维护工具,并做好日常的管理工作。下面列举几项主要工作职责:
服务器的关闭和启动;
管理用户帐号;
管理日志文件;
数据库备份恢复;
数据库优化;
确保数据库数据安全;
数据库软件升级。
3.1.&数据目录
数据目录是用来存放数据表和相关信息的地方,是数据库的核心。在MySQL中的数据目录根据不同平台的有一些差异:
在UNIX/Linux系统上,如果用源码编译安装,数据目录的位置默认是在/usr/local/mysql/var中;
在UNIX/Linux系统上,如果用二进制发行版安装,数据目录的位置默认是在/usr/local/mysql/data中;
在WINDOWS系统上,数据目录的位置默认是在c:/mysql/data中;
在服务器启动时,可用--datadir=dir_name来指定数据目录,也可把它写到配置文件中。
我们还可用命令向服务器查询数据目录的位置,数据目录的变量名是datadir,如:
% mysqladmin variables
如果在一台机器上同时运行多个服务器,则可根据端口的不时来查询每个服务器的数据目录,如:
% mysqladmin --host=127.0.0.1 --port=port_number variables
如果--host是localhost,系统则会用一个UNIX套接字去连接数据库服务器,这时要使用--socket选项,所以查询语句变成:
% mysqladmin --host=localhost --socket=/path/to/socket variables
mysql> SHOW VARIABLES LIKE 'datadir';
在windows NT平台上可以使用“.”作为一条命名管道连接的主机名,用--socket选项给出命名管道的名字,如:
c: mysqladmin --host=. --socket=pipe_name variables
配置文件的中[mysqld]段中的datadir=/path/to/datadir设置也可查询到数据目录。
在mysqld程序的帮助信息里也有程序编译时默认的数据目录信息,可用以下命令显示:
% mysqld --help
数据目录是存放数据文件的地方,每个数据库对应目录的不同文件。InnoDB数据表由于用表空间来管理数据库,所以就没这种对应关系。但也是保存在数据目录中的,在数据目录除保存数据库文件外,还可能会保存以下几类文件:
服务器的配置文件,my.cnf;
服务器的进程ID(PID)文件;
服务器的日志文件和状态文件,这些文件对管理数据库有重要的价值;
DES密钥文件或服务器的SSL证书与密钥文件。
数据目录中的所有数据库全部由服务器(mysqld)来管理,客户端不直接操作数据。服务器是客户使用数据的唯一通道。
在MySQL中,每个数据库其实就是在数据目录下一个子目录,show databases命令相当于列出数据目录中的目录清单。create
db_name命令会在数据目录下新建一个db_name的目录,以存放数据库的数据文件。所以我们也可下面的shell命令方式来建立一个空数据库:
% cd datadir
% mkdir db_name
% chmod u=rwx,go-rwx db_name
同理,删除数据库drop database db_name也就是删除数据目录中一个名为db_name的目录及目录中的数据表文件。我们也可用shell这进行操作:
% cd datadir
% rm -rf db_name
比较shell方式与drop database方式,drop database db_name命令不能删除db_name目录中创建的其它非数据表文件;由于InnoDB是表空间来管理数据表,所以不能用rm或del命令删除InnoDB的数据表。
3.2.&MySQL数据表在系统中表现形式
MySQL数据表类型有:ISAM、MyISAM、MERGE、BDB、InnoDB和HEAP。每种数据表在文件系统中都有不同的表示方式,有一个共同点就是每种数据表至少有一个存放数据表结构定义的.frm文件。下面介绍每种数据表文件:
ISAM数据表是最原始的数据表,有三个文件,分别是:
.frm,存放数据表的结构定义;
.ISD,数据文件,存放数据表中的各个数据行的内空;
.ISM,索引文件,存放数据表的所有索引信息。
MyISAM数据表是ISAM数据表的继承者,也有三个文件,分别是:
.frm,结构定义文件;
.MYD,数据文件;
.MYI,索引文件。
MERGE数据表是一个逻辑结构,代表一组结构完全相同的MyISAM数据表构成的集合。它在文件系统中有二个文件,分别是:
.frm,结构定义文件;
.MRG,构成MERGE表的MyISAM数据表清单,每个MyISAM数据表名占一行。也就是说可通过改变该表的内容来改变MERGE数据表的结构。修改前请先刷新缓存(flush tables),但不建议这样修改MERGE数据表。
BDB数据表用两个文件来表示,分别是:
.frm,结构定义文件;
.db,数据表数据和索引文件
InnoDB由于采用表空间的概念来管理数据表,所以它只有一个与数据表对应.frm文件,同一目录下的其它文件表示为表空间,存储数据表的数据和索引。
HEAP数据表是一个存在于内存中的表,所以它的数据和索引都存在于内存中,文件系统中只有一个.frm文件,以定义结构。
了解MySQL数据表在文件系统中表现形式后,我们可知道,创建、修改或删除数据表,其实就是对这些文件进行操作。例如一些数据表(除InnoDB和HEAP数据表外),我们可直接在文件系统中删除相应的文件来删除数据表。
% cd datadir
% rm -f mydb/mydb.*
以上命令可删除mydb数据库中的mydb数据表。
3.3.&数据表最大尺寸限制
在MySQL中影响数据表尺寸的因素有很多,下面分别进行介绍:
MySQL数据表类型的不同对数据表尺寸的限制:
ISAM数据表中单个.ISD和.ISM文件的最大尺寸为4G;
MyISAM数据表中单个.MYD和.MYI文件的默认最大尺寸也是4G,但可在创建数据表时用AVG_ROW_LENGTH和MAX_ROWS选项把这个最值扩大到800万TB。
MERGE数据表的最大尺寸是它的各组成MyISAM数据表的最大尺寸之和。
BDB数据表的尺寸受限于BDB处理程序所允许的.db文件的最大尺寸。这个最大尺寸随着数据表页面尺寸(编译时确定)而变化,但即使是最小的页面尺寸(512字节),.db文件的最大尺寸也可达2TB。
InnoDB数据表的表空间的最大尺寸是40亿个页面,默认的页面尺寸是16K,该值可在8K到64K之间,在编译时确定。InnoDB数据表的最大尺寸也就是表空间的最大尺寸。
操作系统对文件的尺寸限制,一般文件系统都对单个文件不得超过2G的限制。该约束会对数据库文件造成限制。InnoDB数据表可通过利用未格式化硬盘作为表空间来绕过该限制。
对于数据和索引分开两个文件存放的数据表,其中任何一个文件达到操作系统文件的最大限制,数据库表也就达到最大尺寸。
包含AUTO_INCREMENT数据列的表受到该数据列类型最大上限值的限制。
由于InnoDB数据表用表空间来管理,一个表空间可同时空纳多个数据表,所以数据表的最大尺寸受系统文件和同一表空间中数据表空间的约束。
3.4.&状态文件和日志文件
在MySQL数据目录中还包含着许多状态文件和日志文件,这些文件的文件名都是以主机名加上相关后缀来命名的。下面是这些文件的一个说明列表:
Table&3.1.&状态文件和日志文件
进程ID文件
hostname.pid
MySQL服务器进程的ID
常规查询日志
hostname.log
连接/断开连接事件和查询信息
慢查询日志
hostname-slow.log
记录查询时间很长的命令信息
hostname.nnn
创建或修改数据表结构和内容的查询命令信息
二进制变更日志
hostname-bin.nnn
创建或修改数据表结构和内容的查询命令的二进制表示法
二进制变更日志的索引文件
hostname-bin.index
使用中的“二进制变更日志”列表
hostname.err
记录“启动/关闭”事件和异常情况
变更日志和二进制变更日志主要用于MySQL数据库服务器的崩溃恢复中,由于变更日志记录了数据库的所有变更操作,所以可以进行事件重放。具体操作
请参考相关数据库备份恢复章节。对于变更日志,我们可用--log-long-format选项来让它以扩展方式记录有关事件。扩展方式可记录谁发出查询
和什么时候发出查询的信息。可使我们更好地掌握客户端的操作情况。日志记录着查询命令的所有操作,里面可能会有一些敏感信息。所以我们要确保日志文件的安
3.5.&调整MySQL数据目录位置
MySQL数据库的数据目录位置,包括目录里的各种文件的位置)可根据实际情况进行调整。调整的方法有两种,一种是使用符号链接;一种用服务器启动选项。下面一个列表说明了数据目录及目录中文件各自适宜采用的方法:
Table&3.2.&MySQL数据目录及目录中文件位置的调整方法
整个数据目录
启动选项和符号链接
数据库目录
InnoDB数据表空间
下面是各种调整方法的具体操作过程:
在调整MySQL的数据目录时,要先停止服务器,再把数据目录移动到新的位置。接着,我们可选择在原来目录下创建一个符号链接指向新的位
置,或者用启动选择--datadir指向新的数据目录。推荐用创建符号链接的方法,因为如果那个数据目录中有my.cnf文件,相应的服务器还能找到
数据库只能存在于MySQL数据目录中,所以只能使用符号链接的方法调整它的位置。在Linux系统的操作步骤如:
关闭服务器;
把数据库目录拷贝到新的位置;
删除原来的数据库目录;
在原来的MySQL数据目录中创建一个同名符号链接指向新的位置;
重新启动服务器。
在windows下的操作方法不些不同,操作方法如下:
关闭服务器;
把数据库目录移动新的位置;
删除原来的数据库目录;
在原来数据目录下建一个同名的.sym文件,在文件中输入数据库新目录的全路径,如c:mysql
ewdirmydb。这个文件就相当于Linux下的符号链接;
重启服务器。
为了支持符号链接功能,必须用--use-symbolic-links选项启动服务器;或在选项文件的[mysqld]节中添加use-symbolic-links选项。
MySQL必须是3.23.16以上版本且是max服务器(mysqld-max或mysqld-max-nt)。
要移动数据表,必须满足以下所有条件才行:
MySQL的版本必须是4.0或以上的版本;
操作系统必须有一个可用的realpath()调用;
移动的数据表必须是MyISAM类型的数据表。
在满足以上所有条件后,我们就可把.MYD数据文件和MYI索引文件移到新位置,再在原来位置创建两个同名符号链接指定新的位置。注意,.frm定义文件仍需留在原来的数据库目录中。
如以上条件不能全部满足,最好不要移动数据表文件。否则一旦你运行ALTER TABLE、OPTIMIZE TABLE、REPAIR
TABLE语句对移动过的数据表进行优化或修改,这样数据表就会回到原来的位置,使移动操作失效。因为这些命令的执行过程是这样的:它会先在数据目录中创
建一个临时数据表并对这个临时数据表进行优化或修改,然后删除原来的数据表(这里是你为了移动数据表而创建的一个符号链接),再把临时数据表更名为原来的
数据表名称。这样一来,你移走的数据表就和这个数据库完全没有关系了。基于以下的不稳定因素,如无特殊必要,不建议移动数据表。
InnoDB表空间是通过在选项文件中使用innodb_data_home_dir和innodb_data_file_path选项列出InnoDB表空间组成文件清单的方法来配置的,所以我们可通过修改这些选项来重新安置InnoDB表空间的组成文件。步骤如下:
关闭服务器;
移动组成表空间的文件;
修改选项文件,指出组成表空间的文件的新位置;
重启服务器。
状态文件和日志文件的位置可通过选项文件或启动服务器时指定。
Chapter&4.&MySQL数据库日常管理
Table of Contents
为了确保数据库平稳可靠运行,我们需进行维护和管理,这是每一位数据库管理员的职责。下面分几个专题分别介绍。
4.1.&数据库安全管理
MySQL数据库通过用户和密码来控制用户对数据库的访问,当我们新安装了一个数据库服务器时,MySQL的权限表设置是很不安全,它默认允许任何人不需要密码就可访问数据库。所以我们安装好服务器后第一件需要做的就是设置用户密码。
在MySQL中的mysql数据库的user数据表中存有用户的帐号信息,在初始状态下已存在root和一些匿名用户,且所有用户都没有设置密码。该数据表的这些用户信息是通过一个mysql_install_db脚本安装的。该表的主要列有:
User,连接数据库的用户名。
Host,允许连接到数据库服务器的主机名,“%”通配符代表所有主机。
Password,连接密码,已加密。
其它权限列,以“Y”或“N”标识是否有效。
在这种状态下的数据库是极不安全的,我们可用以下命令轻易地访问数据库:
% mysql -h localhost -u root
#通过本地主机,root用户访问,不需要密码验证
% mysql -h localhost
#通过本地主机,匿名用户访问,不需要密码验证
设置MySQL用户帐号密码的方法有三种:
使用mysqladmin程序:
% mysqladmin -h localhost -u root password "password"
#设置在本地以root身分登录的密码
% mysqladmin -h remote -u root password "password"
#设置远程主机以root身分登录的密码
在初始设置时,这两条语句都要运行,以确保数据库本地访问和网络访问的安全。
通过set password这条SQL语句设置:
mysql> set password for 'root'@'localhost' = password('password');
mysql> set password for 'root'@'remote' = password('password');
直接修改user权限表:
mysql> update user set password=password('password') where user='root';
#重载权限表,使修改马上生效
MySQL使用驻留在内存中的权限表拷贝来进行访问控制,当使用mysqladmin和set
password设置密码,MySQL会监察到权限表已被修改,它自动重载该表。而用update的方式,MySQL就监察不到变化,需手动用flush
privileges命令刷新内存中的权限表,以使它马上生效。
为root用户设置密码后,如果需以root身份连接数据库,就需验证密码。我们可用以下语句连接数据库:
% mysql -u root -p
Enter password:
#输入root的密码
在user表中,user列为空的为匿名用户。它也是没有密码的,我们需为它们设置一个密码,或干脆把它们删除。在windows系统上的本地匿名用户帐号和root用户有着同样的权限,这是一个很大的安全漏洞。应该把它删除或把权限削弱。
4.2.&服务器的启动和关闭
在Linux和windows平台下MySQL服务器的启动方式有很大不同,这里将分开介绍:
Linux平台:
Linux平台下,每一个进程都需由一个用户来运行,MySQL最好不要以root用户来运行。我们可创建一个mysql用户和mysql组,MySQL服务器程序目录和数据目录由这个用户和组所拥有,其它用户没有任何权限。以mysql用户来运行MySQL服务器。
% mysqld --user=mysql
#即使以root用户执行该命令,MySQL数据库还是会与mysql用户ID关联。
为了使服务器在系统启动时自动以mysql用户运行,需配置my.cnf配置文件 ,把user=mysql包含在[mysqld]段中。
关闭服务器可用% mysql.server stop或% mysqladmin -u root -p shutdown
windows平台:
手动方式:直接运行c:mysqld命令。
作为服务方式:运行c:mysqld-nt
--install命令,把mysqld-nt安装为windows的服务,此后,每当windows启动时,它就会自动运行。mysqld-nt是一个
支持命名管道的MySQL服务器。运行c:mysqld-nt --remove可把服务删除。手动启动关闭服务的方法是运行c:
et start mysql和c:
et stop mysql命令。
4.3.&连接故障恢复
当由于误删mysql套接字时(/tmp/mysql.sock),我们就不能通过套接字连接服务器。这时我们可通过tcp/ip来连接服务器,要建立一个tcp/ip连接,需用127.0.0.1代替locahost作为-h参数的值来连接服务器。如:
% mysqladmin -h 127.0.0.1 -u root -p shutdown
#关闭服务器再重启会重建套接字
当我们因为忘记root用户密码而不能连接服务器时,重设置密码的步骤如:
用 % kill -TERM
PID关闭服务器,用-TERM信息可使服务器在关闭前把内存中的数据写入磁盘。如果服务器没有响应,我们可用% kill -9
PID来强制删除进程,但不建议这样做。这时内存中的数据不会写入磁盘,造成数据不完整。如果你是用mysql_safe脚本启动MySQL服务器的,这
个脚本会监控服务器的运行情况并在它被终止时重启服务器,所以如需关闭服务器,要先终止该进程,然后再真正终止mysqld进程。
接着用--skip_grant-tables启动服务器。这时MySQL服务器将不使用权限表对连接操作进行验证。你就可在不提供
root密码的情况下连接上服务器,并获得root的权限。这样你就可用上面介绍的修改密码的方法重设root用户的密码。注意:连接上服务器后,要马上
privileges命令,使权限表读入内存并生效,以阻止其他的连接。该语句还重新激活grant语句,在MySQL服务器不使用权限表时,grant
语句被禁用。
修改完root用户密码后,我们就可关闭服务器并重启使所有配置正常运作。
4.4.&MySQL用户帐号管理
MySQL用户帐号管理主要用grant(授权)和revoke(撤权)两个SQL指令来管理。这两个指令实质是通过操作user(连接权限和全局
权限)、db(数据库级权限)、tables_priv(数据表级权限)、columns_priv(数据列级权限)四个权限表来分配权限的。host权
限表不受这两个指令影响。下面将会详细介绍用户权限管理的内容。
GRANT语法说明:
GRANT privileges (columns)
#privileges表示授予的权限,columns表示作用的列(可选)
#设置权限级别,全局级、数据库级、数据表级和数据列级
TO account
#权限授予的用户,用"user_name"@"host_name"这种用户名、主机名格式
IDENTIFIED BY 'password'
#设置用户帐号密码
REQUIRE encryption requirements
#设置经由SSL连接帐号
WITH grant or resourc
#设置帐号的管理和资源(连接服务器次数或查询次数等)选项
mysql>grant all on db.* to 'test'@'localhost' identified by 'test';
上例运行后的效果是,test用户只能通过‘test’密码从本机访问db数据库
mysql>grant all on db.* to 'test'@'%' identified by 'test';
上例运行后的效果是,test用户可通过‘test’密码从任意计算机上访问db数据库。‘%’代表任意字符,‘_’代表一个任意字符。主机名部份还可以是IP地址。
如果没有给定主机部份,则默认为任意主机,也就是'test'和'test'@'%'是等价的。
Table&4.1.&访问权限表
CREATE TEMPORARY TABLES
创建临时数据表
执行存储过程(暂不支持)
操作系统文件
GRANT OPTION
可把本帐号的权限授予其它用户
LOCK TABLES
锁定指定数据表
查看运行着的线程信息
重新加载权限表或刷新日志及缓冲区
REPLICATION CLIENT
可查询主/从服务器主机名
REPLICATION SLAVE
运行一个镜像从服务器
SHOW DATABASES
可运行SHOW DATABASES指令
关闭数据库服务器
可用kill终止线程以及进行超级用户操作
可修改表和索引的结构
创建数据库和数据表
删除数据表中的数据行
删除数据表和数据行
建立或删除索引
插入数据行
REFERENCES
(暂时不支持)
查询数据行
更新数据行
所有权限,但不包括GRANT。
无权限权限
Table&4.2.&权限作用范围(由ON子句设置)
权限限定符
全局级权限,作用于所有数据库
全局级权限,若未指定默认数据库,其作用范围是所有数据库,否则,其作用范围是当前数据库
ON db_name.*
数据库级权限,作用于指定数据库里的所有数据表
ON db_name.tbl_name
数据表级权限,作用于数据表里的所有数据列
ON tbl_name
数据表级权限,作用于默认数据库中指定的数据表里的所有数据列
USAGE权限的用法:修改与权限无关的帐户项,如:
mysql>GRANT USAGE ON *.* TO account IDENTIFIED BY 'new_password';
mysql>GRANT USAGE ON *.* TO account REQUIRE SSL;
#启用SSL连接
mysql>GRANT USAGE ON *.* TO account WITH MAX_CONNECTIONS_PER_HOUR 10; #设置资源
拥有WITH GRANT OPTION权限的用户可把自已所拥用的权限转授给其他用户,如:
mysql>GRANT ALL ON db.* TO 'test'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
这样test用户就有权把该权限授予其他用户。
限制资源使用,如:
mysql>GRANT ALL ON db.* TO account IDENTIFIED BY 'password' WITH MAX_CONNECTIONS_PER_HOUR 10 MAX_QUERIES_PER_HOUR 200 MAX_UPDATES_PER_HOUR 50;
允许account用户每小时最多连接20次服务器,每小时最多发出200条查询命令(其中更新命令最多为50条)
默认都是零值,即没有限制。FLUSH USER_RESOURCES和FLUSH PRIVILEGES可对资源限制计数器清零。
REVOKE语法说明:
mysql>REVOKE privileges (columns) ON what FROM
mysql>REVOKE SELECT ON db.* FROM 'test'@'localhost';
删除test帐号从本机查询db数据库的权限
REVOKE可删除权限,但不能删除帐号,即使帐号已没有任何权限。所以user数据表里还会有该帐号的记录,要彻底删除帐号,需用DELETE命令删除user数据表的记录,如:
% mysql -u root -p
mysql>use mysql
mysql>DELETE FROM user where User='test' and Host='localhost';
REVOKE不能删除REQUIRE和资源占用的配置。他们是要用GRANT来删除的,如:
GRANT USAGE ON *.* TO account REQUIRE NONE;
#删除account帐号的SSL连接选项
GRANT USAGE ON *.* TO account WITH MAX_CONNECTIONS_PER_HOUR 0 MAX_QUERIES_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;
#删除account帐号的资源限制
4.5.&日志文件管理
有关MySQL的日志文件前面章节已简要讨论过了,主要有四种日志文件,分别是常规查询日志、慢查询日志、变更查询日志和二进制变更日志。这些日志文件的创建需在启动服务器时用选项指定。
Table&4.3.&日志启动选项
--log[=file_name]
常规日志文件
--log-bin[=file_name]
二进制变更日志文件
--log-bin-index=file_name
二进制变更日志文件索引文件
--log-update[=file_name]
变更日志文件
--log-slow-queries[=file_name]
慢查询日志文件
--log-isam[=file_name]
ISAM/MyISAM日志文件
--log-long-format
设置慢查询日志和变更日志的格式
BDB和InnoDB数据表的日志文件会自动创建不用指定选项。但可用以下选项指时日志文件的存放路径。
Table&4.4.&BDB和InnoDB数据表日志选项
--bdb-logdir=dir_name
存放BDB日志文件的位置
--innodb-log_arch_dir=dir_name
存放InnoDB日志文件的归档目录
--innodb_log_group_home_dir=dir_name
存放InnoDB日志文件的位置
MySQL日志文件选项可在mysqld和mysqld_safe脚本中使用,也可在选项文件my.cnf的[mysqld]中使用。推荐在选项文件中使用,因为每次启动服务器的日志选项基本上都是一致的。
日志的刷新可用mysqladmin flush-logs命令或flush logs语句实现。另外,对MySQL服务器发送一条SIGHUP信号也会刷新日志。错误日志和DBD/InnoDB日志不能用以上方法刷新。
错误日志记录MySQL数据库系统的论断和出错信息,由mysqld_safe脚本创建,文件名默认为hostname.err,也可通过
--err-log或选项文件的err-log语句指定另外的名字。如果直接用mysqld程序启动服务器,错误信息会直接输出到输出设备,也就是屏幕。
但我们可用重定向方法把错误信息输出到其它地方,如把错误信息输出到/var/log/mysql.err文件中,可以执行以下语句:
% mysqld > /var/log/mysql.err 2>&1 &
在windows平台下,MySQL服务器默认把诊断信息写到数据目录的mysql.err文件中,并且不允许另外指定错误日志文件名。如在启动
MySQL服务器时给出了--console选项,则MySQL会把诊断信息输出到控制台窗口而不创建错误日志。但如MySQL是作为一个服务运行,则
--console选项不起作用。
4.5.1.&日志失效处理
在服务器正常运行中,会产生大量的日志文件。我们要对这些日志文件进行失效管理,以节省磁盘空间和方便查询。进行日志失效处理的方式主要有以下几种:
日志轮转。该方法适用于常规查询日志和慢查询日志这些文件名固定的日志文件,在日志轮转时,应进行日志刷新操作(mysqladmin flush-logs命令或flush logs语句),以确保缓存在内存中的日志信息写入磁盘;
日志轮转的操作过程是这样的:第一次轮转时,把log更名为log.1,然后服务器再创建一个新的log文件,在第二轮转时,再把
log.1更名为log.2,把log更名为log.1,然后服务器再创建一个新的log文件。如此循环,创建一系列的日志文件。当到达日志轮转失效位置
时,下次轮转就不再对它进行更名,直接把最后一个日志文件覆盖掉。例如:如果每天进行一次日志轮转并想保留最后7天的日志文件,就需要保留
log.1--log.7共七个日志文件,等下次轮转时,用log.6覆盖原来的log.7成新的log.7,原来的log.7就自然失效。下面是一个失
效处理的shell脚本,以供参考:
# shell script ---
rotate_log.sh
if [ $# -ne 1 ]; then
echo "Usage: $0 logname" 1>&2
logfile=$1
mv $logfile.6 $logfile.7
mv $logfile.5 $logfile.6
mv $logfile.4 $logfile.5
mv $logfile.3 $logfile.4
mv $logfile.2 $logfile.3
mv $logfile.1 $logfile.2
mv $logfile $logfile.1
mysqladmin -u flush -pflushpass flush-logs
#执行mysqladmin flush-logs会打开一个日志文件----重新生成一个新的日志文件
该脚本以日志文件名为参数,执行方法如下:
% rotate_log.sh /usr/local/mysql/data/log
注意,脚本中的mysqladmin命令是带有-u和-p参数的,因为我们进行日志刷新时需连接服务器。为确保安全,我们建立一个flush用户,密码为flushpass。该用户只有日志刷新的权限(reload权限)。创建该用户的语句如下:
GRANT RELOAD ON *.* TO 'flush'@'localhost' IDENTIFIED BY 'fulshpass';
设置好后,我们就可利用系统的自动处理机制定期运行该脚本以生成轮转日志。在Linux系统上的MySQL发行版中带有一个用来安装
mysql-log-rotate日志轮转脚本的logrotate工具,如用RPM安装,则在/usr/share/mysql目录,如用二进制方式安
装,则在MySQL安装目录的support-files目录,如用源码安装,则在安装目录的share/mysql目录中。
在windows平台下,不能在线更名,需停掉服务器,再进行。下面是一个进行日志更名的批处理文件:
REM script name : rotate_log.bat
if not "%1" == "" goto ROTATE
@echo Usage: rotate_log logname
set logfile=%1
erase %logfile%.7
rename %logfile%.6 %logfile%.7
rename %logfile%.5 %logfile%.6
rename %logfile%.4 %logfile%.5
rename %logfile%.3 %logfile%.4
rename %logfile%.2 %logfile%.3
rename %logfile%.1 %logfile%.2
rename %logfile% %logfile%.1
该脚本的执行方法如下:
otate_log c:mysqldatalog
以时间为依据对日志进行失效处理。该方法将定期删除超过给定时间的日志文件,适用于变更日志和二进制日志等文件名用数字编号标识的日志文件。下面是一个用Perl写成的处理脚本:
#!/usr/bin/perl -w
# script name: expire_log.pl
# Usage: expire_log.pl logfile ...
use strict
die "Usage: $0 logfile ...
" if @ARGV == 0;
my $max_allowed_age = 7;
#max allowed age in days
foreach my $file (@ARGV)
#chack each argument
unlink ($file) if -e $file && -M $file >= $max_allowed_
该脚本需提供一个将被轮转的日志文件名作为参数,如:
% expire_log.pl /usr/local/mysql/data/log.[0-9]*
在给脚本参数时请小心,如给出*为参数,则会删除目录中所有更新时间大于7天的文件。
镜像机制。把日志文件镜像到所有的从服务器上。要使用镜像机制,你必须知道主服务器有多少个从服务器,哪些正在运行,并需依次连接每一个从
服务器并发出show slave
status语句以确定它正处理主服务器的哪个二进制日志文件(语句输出列表的Master_Log_File项),只有所有的从服务器都不会用到的日志
文件才能删除。删除方法是在主服务器上发出以下语句:
mysql> PURGE MASTER LOGS TO 'last_log.xx';
上面语句中的last_log.xx是所有从服务器已处理的最小编号日志文件。
4.6.&MySQL服务器的一些优化配置
服务器的监听端口设置
TCP/IP端口3306是MySQL服务器默认的网络监听端口,如用--skip-networking选项启动服务器,则不监
听TCP/IP端口。可用--port端口另行指定一个监听端口。如服务器主机有多个IP,还可用--bind-address选项对服务器在监听客户连
接时使用的IP地址进行设定。
在UNIX系统上,MySQL可在一个UNIX域套接字文件上监听有无本地客户在试图以localhost为主机名进行连接。默认的套接字文件是/tmp/mysql.sock,可用--socket选项指定另外一个套接字文件。
在基于NT的Windows平台上,有-nt的MySQL服务器都支持命名管道。默认的命名管道是MySql,可用--socket选项另行指定。
启用或禁用LOAD DATA语句的LOCAL能力
可在MySQL服务器编译时,用configure脚本的--enable-local-infile或--disable-local-infile选项把LOAD DATA语句的LOCAL能力设置为启用或禁用;
在MySQL服务器启动是,可以用--local-infile或--disable-local-infile选项来启用或禁用服务器的LOCAL能力(在MySQL 4.0.2之前的版本里,要用--local-infile=0来禁用它)。
如果在服务器端禁用了LOCAL的能力,则客户端就不能使用该功能;如服务器启用了LOCAL的能力,客户端默认也是禁止使用的,但可用mysql程序的--local-infile选项启用它。
国际化和本地化,国际化是指软件能够在世界多个国家地区使用,而本地化则是指可从国际化软件中选择一套适合本地区的语言和习惯的设置来使用。在MySQL中的国际化和本地化设置有以下几方面内容:
时区,如果时区设置不对,则服务器显示的时间将会和当地时间有冲突。设置方法可通过mysqld_safe脚本的--timezone选项来设置,但最好还是在选项文件里设置,如:
[mysqld_safe]
timezone=US/Central
配置显示信息的语言,MySQL能用多种语言来显示诊断信息与出错信息,默认是英语。查看share/mysql目录下有几个以语
言名称作为目录名的目录就可知道有哪些语言可供选择。可用--language启动选项来指定语言,如--language=/usr/local
/mysql/share/mysql/french。
配置服务器的字符集,MySQL支持多种字符集,可在share/mysql/charsets目录下查询支持的字符集,也可用
show variables like
'character_sets'来显示支持的字符集清单。MySQL把latin1作为默认的字符集。可在编译时用--with-charset指定另
外一个字符集为默认字符集。如要增加另外的字符集支持,可用--with-extra-charasets选项进行添加。如:
% ./configure --with-extra-charsets=latin1,gb2312,big5
--with-extra-charsets有两个特殊的选项,一个是all,代表所有可用字符集;一个是complex,代表所有的复杂字符集(包括多字节字符集和有特殊排序规则的字符集)。
服务器启动时,使用默认字符集,如需指定另外的字符集,需用--default-character-set选项指明。
在MySQL 4.1以前,如果在创建好数据表后改变服务器的默认字符集,就需对索引重新排序才能保证索引键值能够正确反映出数据表记录在新字符集下的排列顺序。重新排序的操作命令如下:
% myisamchk --recover --quick --set-character-set=gb2312
#在执行该语句需关闭服务器,适用于MyISAM数据表
% mysqlcheck --repair --quick
#不需关闭服务器,适用于各种数据表
mysql> REPLACE TABLE ... QUICK;
在客户端,可用--default-character-set选项指定客户程序使用的字符集。--character-sets-dir选项可指出字符集文件的安装目录。
升级数据表到4.1,支持多字符集数据表。步骤如下:
用mysqldump程序备份数据库:
% mysqldump -p -u root --all-databases --opt > dumpfile.sql
--all-databases选项的作用是转储所有数据库;
--opt选项的作用是对转储文件进行优化。
关闭服务器,升级MySQL服务器软件到4.1版。
用备份文件重新加载数据表:
% mysql -p -u root < dumpfile.sql
这样,字符集信息就被分配到每一个数据列中,此后,即使服务器改变了默认的字符集,各数据列的字符集也不会改变。当以后修改某个数据列的字符集时,服务器会自动重索引,以反映最新变化。
配置InnoDB表空间。InnoDB表空间在逻辑上是一个连接的存储区域,但实际上是由一个或多个磁盘文件组成。这些文件可以是普通的文件,也可以是一个未格式化的原始硬盘分区。InnoDB表空间通过一系列的配置选项来设置,其中最重要的有以下两个:
为确保服务器每次启动时都能调用同样的选项,InnoDB的选项最好存放到选文件中。下面是一个例子:
innodb_data_home_dir =
innodb_data_file_path=/usr/loca/mysql/data/idbdata1:10M:autoextend:max:100M
InnoDB表空间文件默认存放到了MySQL的数据目录中,名字叫idbdata1;
文件长度为10M;
可自动扩展,以8M为步长扩展,如有多个数据文件,只允许最后一个文件可自动扩展;
规定了最大的可扩展尺寸为100M。
innodb_data_home_dir,设置InnoDB表空间各组成文件的父目录,如果没有指出,则默认是MySQL的数据目录。
innodb_data_file_path,描述InnoDB主目录中各有关文件,包括文件名,文件长度和一些选项。各文件以分号分隔,各组成文件长度至少为10M。
把选项写入选项文件后,启动服务器就可自动创建和初始化InnoDB表空间。
利用原始磁盘分区作为InnoDB表空间可创建一个非常大的表空间,不受操作系统单文件最大容量的限制。并且能有效减少磁盘碎片的产生。要使用原始磁盘分区,需作如下配置:
首先,要进行初始化,在选项文件的[mysqld]中配置:
innodb_data_home_dir=
innodb_data_file_path=/dev/hda1:10Gnewraw
#初始化/dev/hda1这个10G容量的分区
启动服务器,服务器会对这个10G的分区进行初始化。
接着,关闭服务器,修改配置文件,把newraw改为raw,如:
innodb_data_home_dir=
innodb_data_file_path=/dev/hda1:10Graw
重新启动服务器,MySQL就会以读/写方式使用该表空间了。在windows平台上配置InnoDB表空间时,windows路径名中的反斜杠可以写成单个的斜线字符(/)。也可写成两个反斜杠(\)。如:
innodb_data_home_dir=
innodb_data_file_path=c:/mysql/data/ibdata1:10M;d:/ibdata2:20M
默认情况下,InnoDB的日志文件会存储在MySQL的数据目录,文件名以ib开头。一旦完成InnoDB表空间的初始化,就不能改变组成文件的大小,但可通过添加数据文件或设置自动扩展来增加表空间容量。如需通过增加文件的方法扩大表空间的容量,可按以下步骤进行:
关闭正在运行的MySQL服务器
如果InnoDB表空间的最后一个组成文件是可自扩展的,就要先把它改变成一个固定长度文件才能把另一个文件添加到它后面。方法是先计算出该文件的近似大小,重新设置,如:
innodb_data_file_path=ibdata1:100M:autoextend
innodb_data_file_path=ibdata1:150M
把新的组成文件添加到文件清单的末尾,该文件可以是普通文件,也可以是一个原始硬盘分区。
重启服务器。
还有一种方法重新配置InnoDB表空间,就是先备份,再重新配置,最后重新加载备份。具体步骤如下:
使用mysqldump备份整个InnoDB数据库;
关闭服务器,删除所有InnoDB表空间、InnoDB日志文件 及InnoDB数据表的.frm文件;
重新配置InnoDB表空间;
配置完成后,用备份文件重载数据,生成新的InnoDB数据表。
4.7.&优化服务器
MySQL服务器为我们提供了丰富的参数,以调整服务器满足不同环境的要求。下面分别讨论一下这些参数:
服务器参数变量的设置。MySQL服务器参数可在服务器启动时设置,在MySQL4.0.3及以后的版本中,有些参数也允许在线设置。在
MySQL4.0.2及以后的版本里,可以把一个变量名视为一个选项名来设置。如数据表缓冲区的尺寸由服务器参数talbe_cache来设置。如果需把
它设置为128,则可以在命令行里增加
--table_cache=128
也可在选项文件中设置:
table_cache=128
在命令行选项中'_'可写'-',变成:
--table-cache=128
#这种写法更像一个标准选项
还有一种是使用--set-variable或-O选项,如:
--set-variable=table_cache=128
-O table_cache=128
在选项文件中可写成:
set-variable=table_cache=128
服务器参数分为全局级和会话级两个级别。全局级参数将影响整个服务器,会话级参数则只影响某给定客户连接上的工作。如果某个变量同时存在于
两个级别,则服务器在客户建立连接时用全局变量的值去初始化相应的会话级参数,一旦客户连接建立起来后,对全局参数所作的修改不会影响到相应的会话级参数
当前值。设置全局参数和会话级参数的语句:
mysql> SET GLOBAL variable =
mysql> SET @@GLOBAL.variable =
mysql> SET SESSION variable =
mysql> SET @@SESSION.variable =
默认不带级别限定符的SET语句修改的参数属会话级,如:
mysql> SET variable =
mysql> SET @@variable =
可用一条SET语句设置多个参数,参数间用逗号分隔,如:
SET SESSION variable = value1,value2,value3;
SESSION和LOCAL是同义语,可用LOCAL代替SESSION,如:@@LOCAL
具备SUPER权限才能设置全局参数,新设置值的效力将持续到该参数被再次修改或服务器退出。设置会话级参数不用特殊的权限,新设置值的效力将持续到该值被再次修改或连接断开。显示参数的语句如下:
SHOW GLOBAL VARIABLES;
SHOW GLOBAL VARIABLES LIKE 'TEST';
SHOW SESSION VARIABLES;
SHOW SESSION VARIABLES LIKE 'TEST';
如不带限定符,则返回会话级参数,如会话级参数不存在则返回全局级参数。
也可用命令行方式显示服务器参数变量,如:
% mysqladmin variables
下面介绍一些MySQL服务器通用的参数变量:
back_log,当多个客户同时连接服务器时,客户处理过程需进入一个队列排队等待服务器处理。该值定义服务器等待处理队列长度的最大值,如果站点访问量大,需加大该值。
delayed_queue_size,在实际插入数据表前,来自insert
delayed语句的数据行会进入一个队列等待服务器处理。该值定义该队列能容纳的数据行的最大个数。当队列满时,会阻塞后续的语句。加大该值能提高
insert delayed语句的执行速度。
flush_time,自动存盘间隔。如果系统经常死机或重启,把这个变量设置}

我要回帖

更多关于 朋友圈创建的位置删除 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信