1.日志回滚
查看系统中logrotate命令的配置文档
[root@station109 test]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/usr/sbin/logrotate
/usr/share/doc/logrotate-3.7.8
/usr/share/doc/logrotate-3.7.8/CHANGES
/usr/share/doc/logrotate-3.7.8/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate.status
配置文档是/etc/logrotate.conf
logrotate配置:
logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做“回滚转储”。
我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过 cron 程序来执行。
logrotate 程序还可以用于压缩日志文件,以及发送日志到指定的E-mail 。
logrotate 的配置文件是 /etc/logrotate.conf 主要参数如下表:
[root@station109 test]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly 指定回滚周期为每周
# keep 4 weeks worth of backlogs
rotate 4 指定日志文件删除之前回滚转储的次数,0 指没有备份,5 指保留5 个备份
# create new (empty) log files after rotating old ones
create 在回滚了一个旧的日志文件之后,创建一个新的日志文件
# use date as a suffix of the rotated file
dateext 指定回滚文件的日志格式
# uncomment this if you want your log files compressed
#compress 通过gzip压缩回滚后的日志
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here 如要回滚日志文件,参考下面的格式
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
logrotate所有配置参数:
参数 功能
compress 通过gzip 压缩转储以后的日志
nocompress 不需要压缩时,用这个参数
copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate 备份日志文件但是不截断
create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
nocreate 不建立新的日志文件
delaycompress 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress 覆盖 delaycompress 选项,转储同时压缩。
errors address 专储时的错误信息发送到指定的Email 地址
ifempty 即使是空文件也转储,这个是 logrotate 的缺省选项。
notifempty 如果是空文件的话,不转储
mail address 把转储的日志文件发送到指定的E-mail 地址
nomail 转储时不发送日志文件
olddir directory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir 转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
daily 指定转储周期为每天
weekly 指定转储周期为每周
monthly 指定转储周期为每月
rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
tabootext [+] list 让logrotate 不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig, .rpmsave, v, 和 ~
size size 当日志文件到达指定的大小时才转储,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
今天课上的例子:把mysql的日志进行回滚
(1)在/etc/logrotate.d/的目录下新建一个mysql(自命名)文件
[root@station109 ~]# ls /etc/logrotate.d/
cups httpd named samba syslog vsftpd
cyrus-imapd iptraf ppp sssd trace-cmd wpa_supplicant
dracut mysql psacct subscription-manager up2date yum
[root@station109 ~]# vi /etc/logrotate.d/mysql
/var/log/mysqld/mysql7-access.log{
daily
rotate 31
dateext
create 0664 mysql mysql
postrotate
/usr/bin/logger "------mysql rotate log------"
endscript
}
(2)查看每天执行回滚的配置文件
[root@station109 ~]# ls /etc/cron.daily/logrotate
/etc/cron.daily/logrotate
[root@station109 ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
(3)进到mysql日志记录的目录:/var/log/mysql
[root@station109 ~]# ls /var/log/mysqld/
mysql7-access.log mysql7-error.log mysql_multi.log
(4)测试回滚
启动mysql服务
[root@station109 mysqld]# /etc/rc.d/init.d/mysql7 start
Starting MySQL. [确定]
进入mysql,使数据产生变化
[root@station109 mysqld]# mysql -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.1.56-ndb-7.1.15a-debug-log Source distribution
Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
修改一下系统时间,方便看出日志回滚效果
[root@station109 mysqld]# date 11032011
2011年 11月 03日 星期四 20:11:00 CST
测试,用/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
[root@station109 mysqld]# ll
总用量 68
-rw-rw-r-- 1 mysql mysql 0 11月 3 20:11 mysql7-access.log
-rw-rw---- 1 mysql mysql 35647 11月 2 18:32 mysql7-access.log-20111103
-rw-rw---- 1 mysql root 25729 11月 2 18:32 mysql7-error.log
-rw-r--r-- 1 mysql mysql 2721 10月 27 11:14 mysql_multi.log
关掉服务重启之后,再进行数据增加,可看到文件还是记录在mysql7-access.log中
[root@station109 mysqld]# ll
总用量 72
-rw-rw-r-- 1 mysql mysql 1308 11月 3 20:14 mysql7-access.log
-rw-rw---- 1 mysql mysql 35647 11月 2 18:32 mysql7-access.log-20111103
-rw-rw---- 1 mysql root 26722 11月 3 20:13 mysql7-error.log
-rw-r--r-- 1 mysql mysql 2721 10月 27 11:14 mysql_multi.log
课后作业:对apache进行自定义日志,对access-log进行日志回滚,周期为十五天
(1)[root@station109 ~]# vi /usr/local/apache2/conf/httpd.conf
NameVirtualHost *:80
<virtualhost *:80>
Servername station109.kaixin.com
DocumentRoot /home/www
customlog /var/log/httpd/apache-access.log combined
errorlog /var/log/httpd/apache-error.log
<Directory /home/www>
Options indexes
AllowOverride None
Order allow,deny
allow from all
</Directory>
</virtualhost>
由此可知apache的访问日志: /var/log/httpd/apache-access.log
(2)[root@station109 ~]# vi /etc/logrotate.d/apache
/var/log/httpd/apache-access.log{
daily
rotate 15
dateext
create 0664 daemon daemon
postrotate
/usr/bin/logger "------apache rotate log------"
endscript
}
(3)测试 和mysql的日志回滚一样
2.mysql优化
mysql引擎:
mysql> show engines;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ndbinfo | YES | MySQL Cluster system information storage engine | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
mysql引擎的区别和功能:
MyISAM:是mysql默认的存储引擎,每个MyISAM在磁盘上会生成3个文件。.frm文件存储表定义,.MYD(Mydata)
存储数据文件,.MYI(MYINDEX)存储所有文件
若是明确的想要创建一个MyISAM的表
creat table XXX(id,int ....)engine=MyISAM;
特征:@1.所有数据值先存储低字节。这使得数据机和操作系统分离。二进制轻便性的唯一要求是机器使用补码
(如最近20年的机器有的一样)和IEEE浮点格式(在主流机器中也完全是主导的)。唯一不支持二进制兼容性的
机器是嵌入式系统。这些系统有时使用特殊的处理器.先存储数据低字节并不严重地影响速度;数据行中的字节一
般是未联合的,从一个方向读未联合的字节并不比从反向读更占用更多的资源。服务器上的获取列值的代码与其它
代码相比并不显得时间紧。
@2.大文件(达63位文件长度)在支持大文件的文件系统和操作系统上被支持。
@3.当把删除和更新及插入混合的时候,动态尺寸的行更少碎片。这要通过合并相邻被删除的块,以及若下
一个块被删除,就扩展到下一块来自动完成。
@4.每个MyISAM表最大索引数是64。 这可以通过重新编译来改变。每个索引最大的列数是16个。
@5.最大的键长度是1000字节。这也可以通过编译来改变。对于键长度超过250字节的情况,一个超过1024
字节的的键块被用上。
@6.BLOB和TEXT列可以被索引。
@7.NULL值被允许在索引的列中。这个占每个键的0-1个字节。
@8.所有数字键值以高字节为先被存储以允许一个更高地索引压缩。
@9.当记录以排好序的顺序插入(就像你使用一个AUTO_INCREMENT列之时),索引树被劈开以便高节点仅
包含一个键。这改善了索引树的空间利用率。
@10.每表一个AUTO_INCREMEN列的内部处理。MyISAM为INSERT和UPDATE操作自动更新这一列。这使
得 AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列
被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。AUTO_INCREMENT值可用ALTER
TABLE或myisamch来重置。
@11.如果数据文件中间的表没有自由块了,在其它线程从表读的同时,你可以INSERT新行到表中。(这被认
识为并发操作)。自由块的出现是作为删除行的结果,或者是用比当前内容多的数据对动态长度行更新的结果。当所
有自由块被用完(填满),未来的插入又变成并发。
@12.你可以把数据文件和索引文件放在不同目录,用DATA DIRECTORY和INDEX DIRECTORY选项CREATE TABLE以获得更高的速度
@13.每个字符列可以又不同的字符集
@14.在MyISAM索引文件里又一个标志,它表明表是否被正确关闭。如果用--myisam-recover选项启动mysqld,MyISAM表在打开得时候被自动检查,如果被表被不恰当地关闭,就修复表。
@15.如果你用--update-state选项运行myisamchk,它标注表为已检查。myisamchk --fast只检查那些没有这个标志的表
@16.myisamchk --analyze为部分键存储统计信息,也为整个键存储统计信息。
@17.myisampack可以打包BLOB和VARCHAR列。
MyISAM也支持下列特征:
· 支持true VARCHAR类型;VARCHAR列以存储在2个字节中的长度来开始。
· 有VARCHAR的表可以有固定或动态记录长度。
· VARCHAR和CHAR列可以多达64KB。
· 一个被搞乱的已计算索引对可对UNIQUE来使用。这允许你在表内任何列的合并上有UNIQUE。(尽管如此,你不能在一个UNIQUE已计算索引上搜索)。
InnoDB引擎:InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。
这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB
类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。InnoDB是为处理巨大数据量时的最大性能设计。它的CPU效率可能是任何其它基于磁盘的关系数据库引擎所不能匹敌的。
InnoDB存储引擎被完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。 InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始
磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上。InnoDB默认地被包含在MySQL二进制
分发中。Windows Essentials installer使InnoDB成为Windows上MySQL的默认表。InnoDB被用来在众多需要高性能的大型数据库站点上产生。著名的Internet新闻站点Slashdot.org运行在
InnoDB上。Mytrix, Inc.在InnoDB上存储超过1TB的数据,还有一些其它站点在InnoDB上处理平均每秒800次插入/更新的负荷。
MERGE存储引擎:MERGE存储引擎,也被认识为MRG_MyISAM引擎,是一个相同的可以被当作一个来用的MyISAM表的集合。“相同”意味着所有表同样的列和索引信息。你不能合并列被以不同
顺序列于其中的表,没有恰好同样列的表,或有不同顺序索引的表。而且,任何或者所有的表可以用myisampack来压缩。表选项的差异,比如AVG_ROW_LENGTH, MAX_ROWS或PACK_KEYS都不重要。
当你创建一个MERGE表之时,MySQL在磁盘上创建两个文件。文件名以表的名字开始,并且有一个扩展名来指明文件类型。一个.frm文件存储表定义,一个.MRG文件包含被当作一个来用的表的名字。
这些表作为MERGE表自身,不必要在同一个数据库中。
你可以对表的集合用SELECT, DELETE, UPDATE和INSERT。你必须对你映射到一个MERGE表的这些表有SELECT, UPDATE和DELETE 的权限。
如果你DROP MERGE表,你仅在移除MERGE规格。底层表没有受影响。
当你创建一个MERGE表之时,你必须指定一个UNION=(list-of-tables)子句,它说明你要把哪些表当作一个来用。如果你想要对MERGE表的插入发生在UNION列表中的第一个或最后一个表上,你可以选
择地指定一个INSERT_METHOD选项。使用FIRST或LAST值使得插入被相应地做在第一或最后一个表上。如果你没有指定INSERT_METHOD选项,或你用一个NO值指定该选项。往 MERGE表插入记录的
试图导致错误。
MEMORY (HEAP)存储引擎:MEMORY存储引擎用存在内存中的内容来创建表。这些在以前被认识为HEAP表。MEMORY是一个首选的术语,虽然为向下兼容,HEAP依旧被支持。
每个MEMORY表和一个磁盘文件关联起来。文件名由表的名字开始,并且由一个.frm的扩展名来指明它存储的表定义。
要明确指出你想要一个MEMORY表,可使用ENGINE选项来指定:
CREATE TABLE t (i INT) ENGINE = MEMORY;
如它们名字所指明的,MEMORY表被存储在内存中,且默认使用哈希索引。这使得它们非常快,并且对创建临时表非常有用。可是,当服务器关闭之时,所有存储在MEMORY表里的数据被丢失。因为表的定义被存在磁盘上的.frm文件中,所以表自身继续存在,在服务器重启动时它们是空的。
这个例子显示你如何可以创建,使用并删除一个MEMORY表:
mysql> CREATE TABLE test ENGINE=MEMORY
-> SELECT ip,SUM(downloads) AS down
-> FROM log_table GROUP BY ip;
mysql> SELECT COUNT(ip),AVG(down) FROM test;
mysql> DROP TABLE test;
MEMORY表有下列特征:
· 给MEMORY表的空间被以小块来分配。表对插入使用100%动态哈希来。不需要溢出区或额外键空间。自由列表无额外的空间需求。已删除的行被放在一个以链接的列表里,并且在你往表里插入新数据之时被重新使用。MEMORY表也没有通常与在哈希表中删除加插入相关的问题。
· MEMORY表可以有多达每个表32个索引,每个索引16列,以及500字节的最大键长度。
· MEMORY存储引擎执行HASH和BTREE索引。你可以通过添加一个如下所示的USING子句为给定的索引指定一个或另一个:
· CREATE TABLE lookup
· (id INT, INDEX USING HASH (id))
· ENGINE = MEMORY;
· CREATE TABLE lookup
· (id INT, INDEX USING BTREE (id))
· ENGINE = MEMORY;
· 你可以在一个MEMORY表中有非唯一键。(对哈希索引的实现,这是一个不常用的功能)。
· 你页可以对MEMORY表使用INSERT DELAYED。请参阅13.2.4.2节,“INSERT DELAYED语法”
· 如果你在一个有高度键重复的(许多索引条目包含同一个值)MEMORY表上有一个哈希索引,对影响键值的表的更新及所有删除都是明显地慢的。这个变慢的程度比例于重复的程度(或者反比于索引cardinality)。你可以使用一个B树索引来避免这个问题。
· MEMORY表使用一个固定的记录长度格式。
· MEMORY不支持BLOB或TEXT列。
· MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引。
· MEMORY表在所有客户端之间共享(就像其它任何非TEMPORARY表)。
· MEMORY表内容被存在内存中,内存是MEMORY表和服务器在查询处理之时的空闲中创建的内部表共享。可是,两个类型的表不同在于MEMORY表不会遇到存储转换,而内部表是:
. 如果一个内部表变得太大,服务器自动把它转换为一个磁盘表。尺寸限制由tmp_table_size系统变量的值来确定。
. MEMORY表决不会转换成磁盘表。要确保你不会偶尔做点傻事,你可以设置max_heap_table_size系统变量给MEMORY表加以最大尺寸。对于单个的表,你也可以在CREATE TABLE语句中指定一个MAX_ROWS表选项。
· 服务器需要足够内存来维持所有在同一时间使用的MEMORY表。
· 当你不再需要MEMORY表的内容之时,要释放被MEMORY表使用的内存,你应该执行DELETE FROM或TRUNCATE TABLE,或者整个地删除表(使用DROP TABLE)。
· 当MySQL服务器启动时,如果你想开拓MEMORY表,你可以使用--init-file选项。例如,你可以把INSERT INTO ... SELECT 或LOAD DATA INFILE这样的语句放入这个文件中以便从持久稳固的的数据源装载表。请参阅5.3.1节,“mysqld 命令行选项” and 13.2.5节,“LOAD DATA INFILE 语法”。
· 如果你正使用复制,当主服务器被关闭且重启动之时,主服务器的MEMORY表变空。可是从服务器意识不到这些表已经变空,所以如果你从它们选择数据,它就返回过时的内容。自从服务器启动后,当一个MEMORY表在主服务器上第一次被使用之时,一个DELETE FROM语句被自动写进主服务器的二进制日志,因此再次让从服务器与主服务器同步。注意,即使使用这个策略,在主服务器的重启和它第一次使用该表之间的间隔中,从服务器仍旧在表中有过时数据。可是,如果你使用--init-file选项于主服务器启动之时在其上推行MEMORY表。它确保这个时间间隔为零。
· 在MEMORY表中,一行需要的内存使用下列表达式来计算:
· SUM_OVER_ALL_BTREE_KEYS(max_length_of_key + sizeof(char*) * 4)
· + SUM_OVER_ALL_HASH_KEYS(sizeof(char*) * 2)
· + ALIGN(length_of_row+1, sizeof(char*))
ALIGN()代表round-up因子,它使得行的长度为char指针大小的确切倍数。sizeof(char*)在32位机器上是4,在64位机器上是8。
BDB (BerkeleyDB)存储引擎:Sleepycat Software给MySQL提供Berkeley DB事务性存储引擎。这个存储引擎典型被简称为BDB。对BDB存储引擎的支持包括在MySQL源码分发版里,在MySQL-Max二进制分发版里被激活。
BDB表可能有一个更大的崩溃幸存机会,并且也具有对事务COMMIT和ROLLBACK操作的能力。MySQL源码分发版和被补丁过可以与MySQL一起工作的BDB分发版一起提供。你不能使用一个未补丁过的BDB版本与MySQL一起工作。
我们在MySQL AB上与Sleepycat紧密合作工作以保持MySQL/BDB接口的质量在高水平。(即使Berkeley DB其本身是非常能经受考验和非常可靠的。MySQL接口仍然被认为是第三等质量的。我们将继续改善和优化它)。
当它达到对所有涉及BDB表的问题的支持之时,我们答应负责帮助我们的用户定位问题并创建可重复产生的测试案例。任何这样的测试案例被转交给Sleepycat,它反过来帮助我们找到并解决问题。因为这是一个二阶段的操作,任何关于
BDB表的问题我们可能要花比对其它存储引擎稍微更长一点的时间来解决它。可是,我们期望这个过程没有显著的困难,因为Berkeley DB 代码本身被用在MySQL之外许多的应用中。
EXAMPLE存储引擎:EXAMPLE存储引擎是一个不做任何事情的存根引擎。它的目的是作为MySQL源代码中的一个例子,用来演示如何开始编写一个新存储引擎。 同样,它的主要兴趣是对开发者。
要对EXAMPLE引擎检查源码,请查看MySQL源码分发版的sql/examples目录。
要允许这个存储引擎,使用在建立MySQL之时使用--with-example-storage-engine选项来configure。
当你创建一个EXAMPLE之时,服务器创建在数据库目录创建一个表定义文件。文件由表名字开始,并由一个.frm的扩展名。没有其它文件被创建。没有数据被存储进表或者从中取回。
FEDERATED存储引擎:FEDERATED存储引擎访问在远程数据库的表中的数据,而不是本地的表。
FEDERATED存储引擎仅在-MAX版的MySQL上可用。
要允许这个存储引擎,当你构建MySQL时请使用--with-federated-storage-engine来configure。
当你创建一个FEDERATED表的时候,服务器在数据库目录创建一个表定义文件。文件由表的名字开始,并有一个.frm扩展名。无其它表被创建,因为实际的数据在一个远程数据库上。这不同于为本地表工作的存储引擎的方式。
对于本地的数据录表,数据文件是本地的。例如,如果你创建一个名为user的MyISAM表,MyISAM处理器创建一个名为users.MYD的数据文件。对本地表读,插入,删除和更新在本地数据文件里的数据的处理器和记录被以对处理器的特定格式存储。为了读记录,处理器必须把数据分解进列。为了写记录,列值必须被转换到被处理器使用的行格式并且被写进本地的数据文件。
使用MySQL FEDERATED存储引擎,没有对表的本地数据文件(比如,没有.MYD文件)。取而代之地,一个远程数据库存储那些正常地应该在表中的数据。这使得 MySQL客户端API来读,删除,更新和插入数据的使用成为必要。数据取回被通过SELECT * FROM tbl_name SQL语句来初始化。要读这个结果,通过使用mysql_fetch_row() C API函数,行被一次取一个,
然后从SELECT结果包中的列转换成FEDERATED处理器期望的格式。
基本流程如下:
1. SQL调用被本地发布
2. MySQL处理器API (数据以处理器格式)
3. MySQL客户端API (数据被转换成SQL调用)
4. 远程数据库-> MySQL客户端API
5. 转换结果包(如果有的话)到处理器格式
6. 处理器 API -> 结果行或受行影响的对本地的计数
ARCHIVE存储引擎:ARCHIVE存储引擎被用来以非常小的覆盖区存储大量无索引数据。
要允许这个存储引擎,在建立MySQL之时使用--with-archive-storage-engine选项来configure。如果这个存储引擎可带这个语句使用,你可以看见:
mysql> SHOW VARIABLES LIKE 'have_archive';
当年创建一个ARCHIVE表,服务器在数据库目录创建一个表定义文件。文件由表的名字开始,并由一个.frm的扩展名。存储引擎创建其它文件,所有都有由表名字开头的名字。数据和元数据文件有扩展名.ARZ和.ARM。一个.ARN文件可能在优化操作中出现。
ARCHIVE引擎仅支持INSERT和SELEC(无删除,替换或更新)。它支持ORDER BY操作,BLOB 域,以及基本地所有数据类型,除了几何数据类型。ARCHIVE引擎使用行级锁定。
存储: 当记录被插入时,它们被压缩。ARCHIVE引擎使用zlib无损数据压缩。OPTIMIZE TABLE的使用可以分析表,并把它打包为更小的格式( 使用OPTIMIZE TABLE的原因,往下看)。引擎页支持CHECK TABLE。有数种被使用的插入类型:
· 直接插入INSERT之时把一行推仅压缩缓冲,并且缓冲在它需要的时候刷新。到缓冲的插入被锁定保护。一个SELECT强制一个刷新发生,除非进来的唯一插入是INSERT DELAYED(那些刷新如同需要一样)。
· 块插入旨在它完成后可见,除非其它插入在同一时间发生,在这种情况下,块插入可以被部分看见。一个SELECT不会导致一个块插入的刷新,除非SELECT在被装载时发生一个正常插入。
取回: 在取回时,记录根据需要被解压缩,没有行缓存。一个SELECT操作执行完全表格扫描:当一个SELECT发生之时,它找出当前有多少行可用,并读行的数量。SELECT 被当作持续读来执行。注意,许多SELECT语句在插入过程中会损坏压缩,除非块插入或者延迟的插入被使用。要修复任何已发生压缩问题,你可以总是做 OPTIMIZE TABLE(也支持REPAIR TABLE)。
被SHOW TABLE STATUS报告的行数总是正确的。
CSV存储引擎:CSV存储引擎使用逗号分隔值格式的文本文件存储数据。
要允许使用这个存储引擎,当你建立MySQL之时,使用--with-csv-storage-engine选项来configure。
当你创建一个CSV表之时,服务器在数据库目录创建一个表定义文件。文件由表的名字开始,并且由一个.frm的扩展名。存储引擎也创建一个数据文件。它的名字由表的名字开始,并且有一个.CSV的扩展名。数据文件是无格式文本文件。当你把数据存储进表时,存储引擎用CSV格式把它存进数据文件。
BLACKHOLE存储引擎:BLACKHOLE存储引擎就像“黑洞”一样,它接收数据但丢弃它而不是存储它。取回总是返回空集:
当你创建一个BLACKHOLE表的时候,服务器在数据库目录创建一个表定义文件。文件用表的名字开头,并且有一个.frm扩展名。没有其它文件关联到这个表格。
BLACKHOLE存储引擎支持所有种类的索引。
要允许这个存储引擎,在你建立MySQL之时使用--with-blackhole-storage-engine选项来configure。BLACKHOLE存储引擎在MySQ供应的服务器二进制版里可以找到;通过查看SHOW ENGINES或SHOW VARIABLES LIKE 'have%'的输出,你可以确定你的版本是否支持这个引擎。
到BLACKHOLE表的插入不存储任何数据,但如果二进制日志被允许,SQL语句被写入日志(并被复制到从服务器)。这可以有用帮助地作为重复器或过滤器机制。例如,假设你的应用需要从服务器侧的过滤规则,但传输所有二进制日志数据到从服务器首先导致过多交通的结果。在这种情况下,在主服务器主机上建立一个伪从服务器进程,它的存储引擎是BLACKHOLE,描述如下:
Replication using BLACKHOLE for filtering
主服务器写它的二进制日志。伪mysqld进程作为从服务器,应用期望的replicate-do和replicate-ignore规则的合并,并且写一个新的,被过滤的属于它自己的二进制日志 。(请参阅6.8节,“复制启动选项”)。这个已过滤日志被提供给从服务器。
既然伪进程不确实地存储任何数据,只有很小的由在复制主服务器主机上额外的mysqld进程招致的处理开支。这个类型的建立可以用额外复制从服务器来重复。
其它可能对BLACKHOLE存储引擎的使用包括:
· 转储文件语法的验证。
· 来自二进制日志记录的开销测量,通过比较允许二进制日志功能的BLACKHOLE的性能与禁止二进制日志功能的BLACKHOLE的性能。
· 因为BLACKHOLE本质上是一个“no-op” 存储引擎,它可能被用来查找与存储引擎自身不相关的性能瓶颈。
3.mysql集群版
mysql-server:只有5.0或5.1的才能编译ndb引擎,5.5无法编译ndb引擎
软件包:mysql-cluster-gpl-7.1.15a.tar.gz
<-可编译ndb引擎,在编译之前必须带java环境
安装jdk:编译java环境,jdk-6u18-ea-bin-b02-linux-i586-09_sep_2009.bin
(1)[root@station109 src]# file jdk-6u18-ea-bin-b02-linux-i586-09_sep_2009.bin
jdk-6u18-ea-bin-b02-linux-i586-09_sep_2009.bin: POSIX shell script text executable
由此可知,jdk-6u18-ea-bin-b02-linux-i586-09_sep_2009.bin是一个shell脚本
(2)[root@station109 src]# ./jdk-6u18-ea-bin-b02-linux-i586-09_sep_2009.bin
(3)编完jdk-6u18-ea-bin-b02-linux-i586-09_sep_2009.bin,会在/usr/src目录下产生一个jdk1.6.0_18目录
mv jdk1.6.0_18/* /usr/java
(4)修改系统环境变量:vi/etc/profile
JAVA_HOME=/usr/java
export .........后面加上JAVA_HOME
(5)让系统环境生效
source /etc/profile
(6)在系统环境生效的那个终端进行编译
./configure --prefix=/usr/local/mysql --enable-local-infile --disable-ipv6 --with-charset=gbk --with-extra-charsets=gb2312,utf8 --with-debug --with-pthread --with-unix-socket-path=/var/run/mysqld/mysql7.socket --with-tcp-port=3306 --with-mysqld-user=mysql --with-low-memory --with-big-tables --with-plugins=innobase,innodb_plugin,myisam,myisammrg,ndbcluster --with-ndb-docs --with-ndb-test --with-classpath=/usr/java --with-mysqlmanager
(7)make && make install
(8)定义配置文件my.cnf的存放位置:/usr/local/mysql/etc/my.cnf
[mysqld]
port=3306 端口
datadir=/database 数据库
user=mysql 用户
general-log
general-log-file=/var/log/mysqld/mysql7-access.log mysql访问日志
log-error=/var/log/mysqld/mysql7-error.log 错误日志
socket=/var/run/mysqld/mysql7.socket 定义套接字文件
pid-file=/var/run/mysqld/mysql7.pid 定义pid文件
[root@station109 ~]# cp /usr/src/mysql-cluster-gpl-7.1.15a/support-files/mysql.server /etc/rc.d/init.d/mysql7
[root@station109 ~]# vi /etc/rc.d/init.d/mysql7
basedir=/usr/local/mysql
datadir=/database
conf=/usr/local/mysql/etc/my.cnf
(9)初始化数据库
@1./usr/local/mysql/bin/mysql_install_db --datadir=/database --user=mysql
@2.从mysql-server上拷贝
(10)针对目录修改属性
[root@station109 ~]# chown mysql:mysql /database /usr/local/mysql/ /var/log/mysqld /var/run/mysqld/ /etc/init.d/mysql7 -R
(11)测试mysql服务是否正常启动
[root@station109 ~]# /etc/rc.d/init.d/mysql7 restart
Shutting down MySQL... [确定]
Starting MySQL. [确定]
4.如果忘记了root的密码
临时登录方式:/usr/local/mysql/bin/mysqld_safe --datadir=/database --log-error=/var/log/mysqld/mysqld7-error.log --user=mysql --skip-grant-tables
更改密码:update mysql.user set password=password('pass123') where user='root';
安全推出mysql:[root@station109 ~]# /usr/local/mysql/bin/mysqladmin -p'pass123' shutdown
5.mysql集群版在X86_64位上编译若是出现ERROR:没有/lib/ld-linux.so.2
rpm -ivh glibc-2.12-1.25.el6.i686.rpm nss-softokn-freebl-3.12.9-3.el6.i686.rpm
6.引擎管理
mysql> show engines;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| ndbcluster | YES | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ndbinfo | YES | MySQL Cluster system information storage engine | NO | NO | NO |
| InnoDB | YES | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
7 rows in set (0.00 sec)
vi /usr/local/mysql/etc/my.cnf
innodb=off
ndbcluster = off
重启服务之后,/etc/rc.d/init.d/mysql7 restart
mysql> show engines;
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
| ndbcluster | NO | Clustered, fault-tolerant tables | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ndbinfo | YES | MySQL Cluster system information storage engine | NO | NO | NO |
| InnoDB | NO | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance | NO | NO | NO |
+------------+---------+------------------------------------------------------------+--------------+------+------------+
7 rows in set (0.00 sec)
查看区别,定义全局引擎,可在配置文件中修改
7.在5.0以前版本,编译集群版之后
mysql> grant all on session.session to 'tt'@'localhost' identified by '123';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
\-> 出问题 需要升级
/usr/local/mysql/bin/mysql_upgrade
8.myisam:缓存区
mysql> show variables like 'query_cache%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_cache_limit | 1048576 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 0 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+------------------------------+---------+
5 rows in set (0.00 sec)
mysql> show status like 'qcache%';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Qcache_free_blocks | 0 |
| Qcache_free_memory | 0 |
| Qcache_hits | 0 |
| Qcache_inserts | 0 |
| Qcache_lowmem_prunes | 0 |
| Qcache_not_cached | 0 |
| Qcache_queries_in_cache | 0 |
| Qcache_total_blocks | 0 |
+-------------------------+-------+
8 rows in set (0.01 sec)
query_cache_size = 52428800
query_cache_type
\-> 0, 1, 2
--query_cache_type=#
0 = OFF = Don't cache or retrieve results.
1 = ON = Cache all results except SELECT SQL_NO_CACHE ... queries.
2 = DEMAND = Cache only SELECT SQL_CACHE ... queries.
mysql> show variables like 'key%';
+--------------------------+---------+
| Variable_name | Value |
+--------------------------+---------+
| key_buffer_size | 8384512 |
| key_cache_age_threshold | 300 |
| key_cache_block_size | 1024 |
| key_cache_division_limit | 100 |
+--------------------------+---------+
4 rows in set (0.00 sec)
mysql> show status like 'key%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Key_blocks_not_flushed | 0 |
| Key_blocks_unused | 6694 | <- 内存可存储索引空间
| Key_blocks_used | 0 | <- 内存使用了的空间
| Key_read_requests | 0 | <- 内存读请求
| Key_reads | 0 | <- 从内存读行数
| Key_write_requests | 0 | <- 修改内存中的索引
| Key_writes | 0 | <- 内存写入次数
+------------------------+-------+
7 rows in set (0.00 sec)
9.排序空间 <- order by ( desc, asc)
sort_buffer_size <- 排序内存空间
max_length_for_sort_data <- 放内存排序最大 data <- varchar(32766)
max_sort_length <- 针对 BLOB or TEXT <- 32767
myisam_sort_buffer_size <- 针对 alter table, create index 排序
myisam_max_sort_file_size <- fast sort index -> 利用临时文件保存排序信息
myisam_sort_buffer_size <- myisam 创建索引时候使用内存空间
mysql> show status like '%sort%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Sort_merge_passes | 0 |
| Sort_range | 0 |
| Sort_rows | 0 |
| Sort_scan | 0 |
+-------------------+-------+
4 rows in set (0.00 sec)
10.线程
thread_concurrency=4 <- 并发数量
thread_cache_size= <- 线程占cache大小
thread_stack <- 线程大小
mysql> show processlist;
+----+------+-----------+------+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+------+---------+------+-------+------------------+
| 1 | root | localhost | NULL | Query | 0 | NULL | show processlist |
+----+------+-----------+------+---------+------+-------+------------------+
1 row in set (0.03 sec)
mysql> show status like '%thread%';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| Delayed_insert_threads | 0 |
| Slow_launch_threads | 0 |
| Threads_cached | 0 |
| Threads_connected | 1 |
| Threads_created | 1 |
| Threads_running | 1 |
+------------------------+-------+
6 rows in set (0.00 sec)
11. 客户链接最大数量:max_connections
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
set [session] <- default
mysql> set global max_connections=5; 最大连接数为5
Query OK, 0 rows affected (0.41 sec) <- 不需要 restart
[root@station10 /]# mysql -u tt -p123 第六台计算机就连不上了
ERROR 1040 (08004): Too many connections <- max_connections
远程登录mysql:[root@station109 ~]# mysql -h 10.1.1.10 -uterry -p123
12.explain
explain for xxxx <- oracle
explain xxxxxx <- mysql
mysql> select host,user,password from mysql.user;
+-----------------------+------+-------------------------------------------+
| host | user | password |
+-----------------------+------+-------------------------------------------+
| localhost | root | *FB6E1F205D675BC29B052DB14CCEFE7759C5FF7E |
| station109.kaixin.com | root | *FB6E1F205D675BC29B052DB14CCEFE7759C5FF7E |
| 127.0.0.1 | root | *FB6E1F205D675BC29B052DB14CCEFE7759C5FF7E |
| localhost | | |
| station109.kaixin.com | | |
+-----------------------+------+-------------------------------------------+
5 rows in set (0.00 sec)
mysql> explain select host,user,password from mysql.user;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| 1 | SIMPLE | user | ALL | NULL | NULL | NULL | NULL | 5 | |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.40 sec)
13.慢 sql 查询 (我也不懂是啥意思,希望知道的朋友能留言解释一下)
log_slow_queries <- mysql-5.0
warnings <- mysql-5.0
slow-query-log
slow_launch_time = 1
slow_query_log_file = /var/log/mysqld/mysql-slow.log
log-slow-admin-statements <= 管理员操作 OPTIMIZE, ANALYZE, ALTER
log-slow-slave-statements <= ab 复制, 网络导致慢数据
log-warnings=/var/log/mysqld/mysql-warnings.log
long_query_time <- 大于该时间, 日志