﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-OpenCloseD-随笔分类-DATABASE</title><link>http://www.blogjava.net/OpenCloseD/category/15136.html</link><description>!Qrdinary
</description><language>zh-cn</language><lastBuildDate>Thu, 21 Jun 2007 18:14:46 GMT</lastBuildDate><pubDate>Thu, 21 Jun 2007 18:14:46 GMT</pubDate><ttl>60</ttl><item><title>Speeding up InnoDB Insert by Changing Default Settings</title><link>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125451.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Wed, 20 Jun 2007 18:51:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125451.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/125451.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125451.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/125451.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/125451.html</trackback:ping><description><![CDATA[<p>InnoDB default options are very conservative and in several situations increasing the buffers can have a high impact on the performance. E.g. for speeding up inserts on a InnoDB-only setup, the rule of a thumb is to set the innodb_buffer_pool size to 50-80% of your computer's memory and to set innodb_log_file_size to about 25% of the innodb_buffer_pool_size.
<p>If you are running your program on several threads, which all work on<br>the InnoDB table(s) you might want to also set<br>innodb_flush_log_at_trx_commit=0<br>This adds some risk of losing some transactions in the case of a <br>power failure or an unclean mysqld shutdown, but it can improve <br>speed.
<p>Please note that when inserting several rows at once in InnoDB table, it is fastest, if the rows are inserted in Primary Key order. This is because of the clustered index, which InnoDB always uses.
<p>If your system has a mix of several table handlers, then it is harder to provide good general settings for improving the speed, as the option settings heavily depend on your overall system design. In such cases you can contact us at consulting@mysql.com, and purchase online consulting. In Online Consulting our developers will log into your system and they will do extensive analysis of your system's requirements. Based on the research they can set proper settings for your MySQL installation or they can give you advice, how to make the needed changes by yourself in order to gain better performance.</p>
<br><br><br><!--udmcomment--><a href="http://www.mysql.com/news-and-events/newsletter/2003-11/a0000000269.html">http://www.mysql.com/news-and-events/newsletter/2003-11/a0000000269.html</a>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/125451.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2007-06-21 02:51 <a href="http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125451.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>my.ini详解及mysql彻底优化讲述</title><link>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125450.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Wed, 20 Jun 2007 18:35:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125450.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/125450.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125450.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/125450.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/125450.html</trackback:ping><description><![CDATA[<a href="http://bbs.muzone.cn/thread-107946-1-1.html">http://bbs.muzone.cn/thread-107946-1-1.html</a>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/125450.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2007-06-21 02:35 <a href="http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125450.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>恢复mysql数据</title><link>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125449.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Wed, 20 Jun 2007 18:34:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125449.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/125449.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125449.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/125449.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/125449.html</trackback:ping><description><![CDATA[&nbsp;
<div style="FLOAT: right" align=right><a title="评分 0" href="http://bbs.muzone.cn/misc.php?action=viewratings&amp;tid=13131&amp;pid=243963"></a></div>
<span class=bold>MY-SQL常用命令</span><br><br>
<div class=t_msgfont id=message243963>一、连接MYSQL。 <br><br>格式： mysql -h主机地址 -u用户名 －p用户密码 <br><br>1、例1：连接到本机上的MYSQL。 <br><br>首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&gt; <br><br>2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令： <br><br>mysql -h110.110.110.110 -uroot -pabcd123 <br><br>（注:u与root可以不用加空格，其它也一样） <br><br>3、退出MYSQL命令： exit （回车） <br><br>二、修改密码。 <br><br>格式：mysqladmin -u用户名 -p旧密码 password 新密码 <br><br>1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令 <br><br>mysqladmin -uroot -password ab12 <br><br>注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。 <br><br>2、例2：再将root的密码改为djg345。 <br><br>mysqladmin -uroot -pab12 password djg345 <br><br>三、增加新用户。（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符） <br><br>格式：grant select on 数据库.* to 用户名@登录主机 identified by \"密码\" <br><br>例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令： <br><br>grant select,insert,update,delete on *.* to test1@\"%\" Identified by \"abc\"; <br><br>但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。 <br><br>例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。 <br><br>grant select,insert,update,delete on mydb.* to test2@localhost identified by \"abc\"; <br><br>如果你不想test2有密码，可以再打一个命令将密码消掉。 <br><br>grant select,insert,update,delete on mydb.* to test2@localhost identified by \"\"; <br><br>在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意：你必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。 <br><br>一、操作技巧 <br><br>1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。 <br><br>2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。 <br><br>二、显示命令 <br><br>1、显示数据库列表。 <br><br>show databases; <br><br>刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。 <br><br>2、显示库中的数据表： <br><br>use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧 <br><br>show tables; <br><br>3、显示数据表的结构： <br><br>describe 表名; <br><br>4、建库： <br><br>create database 库名; <br><br>5、建表： <br><br>use 库名； <br><br>create table 表名 (字段设定列表)； <br><br>6、删库和删表: <br><br>drop database 库名; <br><br>drop table 表名； <br><br>7、将表中记录清空： <br><br>delete from 表名; <br><br>8、显示表中的记录： <br><br>select * from 表名; <br><br>三、一个建库和建表以及插入数据的实例 <br><br>drop database if exists school; //如果存在SCHOOL则删除 <br><br>create database school; //建立库SCHOOL <br><br>use school; //打开库SCHOOL <br><br>create table teacher //建立表TEACHER <br><br>( <br><br>id int(3) auto_increment not null primary key, <br><br>name char(10) not null, <br><br>address varchar(50) default &#8217;深圳&#8217;, <br><br>year date <br><br>); //建表结束 <br><br>//以下为插入字段 <br><br>insert into teacher values(&#8217;&#8217;,&#8217;glchengang&#8217;,&#8217;深圳一中&#8217;,&#8217;1976-10-10&#8217;); <br><br>insert into teacher values(&#8217;&#8217;,&#8217;jack&#8217;,&#8217;深圳一中&#8217;,&#8217;1975-12-23&#8217;); <br><br>注：在建表中（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key（2）将NAME设为长度为10的字符字段（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别呢，只有等以后的文章再说了。（4）将YEAR设为日期字段。 <br><br>如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:\\下，并在DOS状态进入目录\\mysql\\bin，然后键入以下命令： <br><br>mysql -uroot -p密码 &lt; c:\\school.sql <br><br>如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。 <br><br>四、将文本数据转到数据库中 <br><br>1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\\n来代替. <br><br>例： <br><br>3 rose 深圳二中 1976-10-10 <br><br>4 mike 深圳一中 1975-12-23 <br><br>2、数据传入命令 load data local infile \"文件名\" into table 表名; <br><br>注意：你最好将文件复制到\\mysql\\bin目录下，并且要先用use命令打表所在的库。 <br><br>五、备份数据库：（命令在DOS的\\mysql\\bin目录下执行） <br><br>mysqldump --opt school&gt;school.bbb <br><br>注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。 <br><br>后记：其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看看。我在这里只介绍一些基本的，其实我也就只懂这些了，呵呵。最好的MYSQL教程还是&#8220;晏子&#8220;译的&#8220;MYSQL中文参考手册&#8220;不仅免费每个相关网站都有下载，而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式，在查找函数命令的时候不太方便。</div>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/125449.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2007-06-21 02:34 <a href="http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125449.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql常用命令</title><link>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125448.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Wed, 20 Jun 2007 18:20:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125448.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/125448.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125448.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/125448.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/125448.html</trackback:ping><description><![CDATA[<div style="FLOAT: right" align=right><a title="评分 0" href="http://bbs.muzone.cn/misc.php?action=viewratings&amp;tid=13131&amp;pid=243963"></a></div>
<span class=bold>MY-SQL常用命令</span><br><br>
<div class=t_msgfont id=message243963>一、连接MYSQL。 <br><br>格式： mysql -h主机地址 -u用户名 －p用户密码 <br><br>1、例1：连接到本机上的MYSQL。 <br><br>首先在打开DOS窗口，然后进入目录 mysqlbin，再键入命令mysql -uroot -p，回车后提示你输密码，如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中了，MYSQL的提示符是：mysql&gt; <br><br>2、例2：连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为abcd123。则键入以下命令： <br><br>mysql -h110.110.110.110 -uroot -pabcd123 <br><br>（注:u与root可以不用加空格，其它也一样） <br><br>3、退出MYSQL命令： exit （回车） <br><br>二、修改密码。 <br><br>格式：mysqladmin -u用户名 -p旧密码 password 新密码 <br><br>1、例1：给root加个密码ab12。首先在DOS下进入目录mysqlbin，然后键入以下命令 <br><br>mysqladmin -uroot -password ab12 <br><br>注：因为开始时root没有密码，所以-p旧密码一项就可以省略了。 <br><br>2、例2：再将root的密码改为djg345。 <br><br>mysqladmin -uroot -pab12 password djg345 <br><br>三、增加新用户。（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符） <br><br>格式：grant select on 数据库.* to 用户名@登录主机 identified by \"密码\" <br><br>例1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入MYSQL，然后键入以下命令： <br><br>grant select,insert,update,delete on *.* to test1@\"%\" Identified by \"abc\"; <br><br>但例1增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为了，解决办法见例2。 <br><br>例2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问了。 <br><br>grant select,insert,update,delete on mydb.* to test2@localhost identified by \"abc\"; <br><br>如果你不想test2有密码，可以再打一个命令将密码消掉。 <br><br>grant select,insert,update,delete on mydb.* to test2@localhost identified by \"\"; <br><br>在上篇我们讲了登录、增加用户、密码更改等问题。下篇我们来看看MYSQL中有关数据库方面的操作。注意：你必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。 <br><br>一、操作技巧 <br><br>1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以了。也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。 <br><br>2、你可以使用光标上下键调出以前的命令。但以前我用过的一个MYSQL旧版本不支持。我现在用的是mysql-3.23.27-beta-win。 <br><br>二、显示命令 <br><br>1、显示数据库列表。 <br><br>show databases; <br><br>刚开始时才两个数据库：mysql和test。mysql库很重要它里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。 <br><br>2、显示库中的数据表： <br><br>use mysql； ／／打开库，学过FOXBASE的一定不会陌生吧 <br><br>show tables; <br><br>3、显示数据表的结构： <br><br>describe 表名; <br><br>4、建库： <br><br>create database 库名; <br><br>5、建表： <br><br>use 库名； <br><br>create table 表名 (字段设定列表)； <br><br>6、删库和删表: <br><br>drop database 库名; <br><br>drop table 表名； <br><br>7、将表中记录清空： <br><br>delete from 表名; <br><br>8、显示表中的记录： <br><br>select * from 表名; <br><br>三、一个建库和建表以及插入数据的实例 <br><br>drop database if exists school; //如果存在SCHOOL则删除 <br><br>create database school; //建立库SCHOOL <br><br>use school; //打开库SCHOOL <br><br>create table teacher //建立表TEACHER <br><br>( <br><br>id int(3) auto_increment not null primary key, <br><br>name char(10) not null, <br><br>address varchar(50) default &#8217;深圳&#8217;, <br><br>year date <br><br>); //建表结束 <br><br>//以下为插入字段 <br><br>insert into teacher values(&#8217;&#8217;,&#8217;glchengang&#8217;,&#8217;深圳一中&#8217;,&#8217;1976-10-10&#8217;); <br><br>insert into teacher values(&#8217;&#8217;,&#8217;jack&#8217;,&#8217;深圳一中&#8217;,&#8217;1975-12-23&#8217;); <br><br>注：在建表中（1）将ID设为长度为3的数字字段:int(3)并让它每个记录自动加一:auto_increment并不能为空:not null而且让他成为主字段primary key（2）将NAME设为长度为10的字符字段（3）将ADDRESS设为长度50的字符字段，而且缺省值为深圳。varchar和char有什么区别呢，只有等以后的文章再说了。（4）将YEAR设为日期字段。 <br><br>如果你在mysql提示符键入上面的命令也可以，但不方便调试。你可以将以上命令原样写入一个文本文件中假设为school.sql，然后复制到c:\\下，并在DOS状态进入目录\\mysql\\bin，然后键入以下命令： <br><br>mysql -uroot -p密码 &lt; c:\\school.sql <br><br>如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。 <br><br>四、将文本数据转到数据库中 <br><br>1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\\n来代替. <br><br>例： <br><br>3 rose 深圳二中 1976-10-10 <br><br>4 mike 深圳一中 1975-12-23 <br><br>2、数据传入命令 load data local infile \"文件名\" into table 表名; <br><br>注意：你最好将文件复制到\\mysql\\bin目录下，并且要先用use命令打表所在的库。 <br><br>五、备份数据库：（命令在DOS的\\mysql\\bin目录下执行） <br><br>mysqldump --opt school&gt;school.bbb <br><br>注释:将数据库school备份到school.bbb文件，school.bbb是一个文本文件，文件名任取，打开看看你会有新发现。 <br><br>后记：其实MYSQL的对数据库的操作与其它的SQL类数据库大同小异，您最好找本将SQL的书看看。我在这里只介绍一些基本的，其实我也就只懂这些了，呵呵。最好的MYSQL教程还是&#8220;晏子&#8220;译的&#8220;MYSQL中文参考手册&#8220;不仅免费每个相关网站都有下载，而且它是最权威的。可惜不是象\"PHP4中文手册\"那样是chm的格式，在查找函数命令的时候不太方便。</div>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/125448.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2007-06-21 02:20 <a href="http://www.blogjava.net/OpenCloseD/archive/2007/06/21/125448.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL优化经验</title><link>http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123745.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Tue, 12 Jun 2007 18:55:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123745.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/123745.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123745.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/123745.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/123745.html</trackback:ping><description><![CDATA[<h1 class=firstHeading>MySQL优化经验</h1>
<div id=bodyContent>
<h3 id=siteSub>Wikipedia，自由的百科全书</h3>
<div id=contentSub></div>
<!-- start content -->
<p>同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法，因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。 </p>
<p>安装好mysql后，配制文件应该在/usr/local/mysql/share/mysql目录中，配制文件有几个，有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境，当然需要有不同的配制文件了。 </p>
<p>一般的情况下，my-medium.cnf这个配制文件就能满足我们的大多需要；一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了，使用mysqladmin variables extended-status &#8211;u root &#8211;p 可以看到目前的参数，有３个配置参数是最重要的，即key_buffer_size,query_cache_size,table_cache。 </p>
<p>key_buffer_size只对MyISAM表起作用， </p>
<p>key_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点　这个数字是远远不够的，通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE &#8216;key_read%&#8217;获得）。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql，以下的状态值都是本人通过phpmyadmin获得的实例分析: </p>
<p>这个服务器已经运行了20天 </p>
<pre>key_buffer_size &#8211; 128M
key_read_requests &#8211; 650759289
key_reads - 79112
</pre>
<p>比例接近1:8000 健康状况非常好 </p>
<p>另外一个估计key_buffer_size的办法　把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。 </p>
<p>从4.0.1开始，MySQL提供了查询缓冲机制。使用查询缓冲，MySQL将SELECT语句和查询结果存放在缓冲区中，今后对于同样的SELECT语句（区分大小写），将直接从缓冲区中读取结果。根据MySQL用户手册，使用查询缓冲最多可以达到238%的效率。 </p>
<p>通过调节以下几个参数可以知道query_cache_size设置得是否合理 </p>
<pre>Qcache inserts
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocks
</pre>
<p>Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，此时需要增加缓冲大小Qcache_hits的值不大，则表明你的查询重复率很低，这种情况下使用查询缓冲反而会影响效率，那么可以考虑不用查询缓冲。此外，在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。 </p>
<p>Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲 </p>
<p>我设置: </p>
<pre>query_cache_size = 32M
query_cache_type= 1
</pre>
<p>得到如下状态值: </p>
<pre>Qcache queries in cache 12737 表明目前缓存的条数
Qcache inserts 20649006
Qcache hits 79060095 　看来重复查询率还挺高的
Qcache lowmem prunes 617913　有这么多次出现缓存过低的情况
Qcache not cached 189896 　　
Qcache free memory 18573912　　目前剩余缓存空间
Qcache free blocks 5328 这个数字似乎有点大　碎片不少
Qcache total blocks 30953
</pre>
<p>如果内存允许32M应该要往上加点 </p>
<p>table_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE &#8216;Open%tables&#8217;获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。 </p>
<p>对于有1G内存的机器，推荐值是128－256。 </p>
<p>笔者设置table_cache = 256 </p>
<p>得到以下状态: </p>
<pre>Open tables 256
Opened tables 9046
</pre>
<p>虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说,已经运行了20天，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。 </p>
<p>如果你不需要记录2进制log 就把这个功能关掉，注意关掉以后就不能恢复出问题前的数据了，需要您手动备份，二进制日志包含所有更新数据的语句，其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外，如果做同步复制( Replication )的话，也需要使用二进制日志传送修改情况。 </p>
<p>log_bin指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引，每次启动服务时，都会重新生成一个新的二进制文件。此外，使用log-bin-index可以指定索引文件；使用binlog-do-db可以指定记录的数据库；使用binlog-ignore-db可以指定不记录的数据库。注意的是：binlog-do-db和binlog-ignore-db一次只指定一个数据库，指定多个数据库需要多个语句。而且，MySQL会将所有的数据库名称改成小写，在指定数据库时必须全部使用小写名字，否则不会起作用。 </p>
<p>关掉这个功能只需要在他前面加上#号 </p>
<pre>#log-bin
</pre>
<p>开启慢查询日志( slow query log ) 慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询，如果需要，还可以记录不使用索引的记录。下面是一个慢查询日志的例子： </p>
<p>开启慢查询日志，需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。 </p>
<p>log_slow_queries指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值，缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数，它指示记录不使用索引的查询。笔者设置long_query_time=10 </p>
<p>笔者设置: </p>
<pre>sort_buffer_size = 1M
max_connections=120
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
interactive_timeout=120
thread_concurrency = 4
</pre>
<p>参数说明: </p>
<p>back_log </p>
<p>要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。 </p>
<p>max_connections </p>
<p>并发连接数目最大，120 超过这个值就会自动恢复，出了问题能自动解决 </p>
<p>thread_cache </p>
<p>没找到具体说明，不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的 </p>
<p>thread_concurrency </p>
<pre>#设置为你的cpu数目x2,例如，只有一个cpu,那么thread_concurrency=2
#有2个cpu,那么thread_concurrency=4
skip-innodb
#去掉innodb支持
</pre>
<p>代码: </p>
<pre># Example MySQL config file for medium systems.
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /var/lib/mysql) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.
<br>
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
<br>
# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
net_buffer_length = 16K
myisam_sort_buffer_size = 1M
max_connections=120
#addnew config
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
skip-innodb
skip-bdb
skip-name-resolve
join_buffer_size=512k
query_cache_size = 32M
interactive_timeout=120
long_query_time=10
log_slow_queries= /usr/local/mysql4/logs/slow_query.log
query_cache_type= 1
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 4
<br>
#end new config
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking
<br>
# Replication Master Server (default)
# binary logging is required for replication
#log-bin
<br>
# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1
<br>
# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods&nbsp;:
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
# the syntax is:
#
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
# MASTER_USER=, MASTER_PASSWORD=&nbsp;;
#
# where you replace , , by quoted strings and
# by the master's port number (3306 by default).
#
# Example:
#
# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
# MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
# start replication for the first time (even unsuccessfully, for example
# if you mistyped the password in master-password and the slave fails to
# connect), the slave will create a master.info file, and any later
# change in this file to the variables' values below will be ignored and
# overridden by the content of the master.info file, unless you shutdown
# the slave server, delete master.info and restart the slaver server.
# For that reason, you may want to leave the lines below untouched
# (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id = 2
#
# The replication master for this slave - required
#master-host =
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user =
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port =
#
# binary logging - not required for slaves, but recommended
#log-bin
<br>
# Point the following paths to different dedicated disks
#tmpdir = /tmp/
#log-update = /path-to-dedicated-directory/hostname
<br>
# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000
<br>
# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql/
#innodb_log_arch_dir = /var/lib/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50
<br>
[mysqldump]
quick
max_allowed_packet = 16M
<br>
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
<br>
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
<br>
[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
<br>
[mysqlhotcopy]
interactive-timeout
</pre>
<p>补充 </p>
<p>优化table_cachetable_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE &#8216;Open%tables&#8217;获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。对于有1G内存的机器，推荐值是128－256。 </p>
<p>案例1：该案例来自一个不是特别繁忙的服务器table_cache &#8211; 512open_tables &#8211; 103opened_tables &#8211; 1273uptime &#8211; 4021421 (measured in seconds)该案例中table_cache似乎设置得太高了。在峰值时间，打开表的数目比table_cache要少得多。 </p>
<p>案例2：该案例来自一台开发服务器。table_cache &#8211; 64open_tables &#8211; 64opened-tables &#8211; 431uptime &#8211; 1662790 (measured in seconds)虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。案例3：该案例来自一个upderperforming的服务器table_cache &#8211; 64open_tables &#8211; 64opened_tables &#8211; 22423uptime &#8211; 19538该案例中table_cache设置得太低了。虽然运行时间不到6小时，open_tables达到了最大值，opened_tables的值也非常高。这样就需要增加table_cache的值。优化key_buffer_sizekey_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads，可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE &#8216;key_read%&#8217;获得）。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表，但是内部的临时磁盘表是MyISAM表，也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。对于1G内存的机器，如果不使用MyISAM表，推荐值是16M（8-64M）。 </p>
<p>案例1：健康状况key_buffer_size &#8211; 402649088 (384M)key_read_requests &#8211; 597579931key_reads - 56188案例2：警报状态key_buffer_size &#8211; 16777216 (16M)key_read_requests &#8211; 597579931key_reads - 53832731案例1中比例低于1:10000，是健康的情况；案例2中比例达到1:11，警报已经拉响。 </p>
</div>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/123745.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2007-06-13 02:55 <a href="http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123745.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql bakup</title><link>http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123744.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Tue, 12 Jun 2007 18:45:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123744.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/123744.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/123744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/123744.html</trackback:ping><description><![CDATA[最近装了MySQL 5.0后再把4.3.6的数据表放进data文件夹里边后,再到<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">phpmyadmin</strong>里边一看全是乱码,后重新看了mysql 5.0的手册,发现加了几个character_set_%,不过改了N^2次还是没能搞定,但是用PHP程序select出来的却又是正常的.问题就是<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">PHPMyadmin</strong>的问题了.. <br><br>　　在<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">phpMyAdmin</strong><a name=baidusnap1></a><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">2.6</strong>以上版本因为支持多语言集，弄得我们使用<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">phpMyAdmin</strong>管理数据库的时候，查询出来的中文都是乱码，但是在我们的PHP程序调用时却没有这些问题。 <br>　　看来是<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">phpMyAdmin</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">2.6</strong>的配置有问题了，为了解决这个问题，我上google上搜索了相关资料，这类的问题很多，但没一个可以解决的，真是没办法，看来只有自己动手解决了。。。。由于查找源代码过程非常烦琐，略最终花了半天的时间，总算找到了一个比较折衷的方法来解决。去<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">phpMyAdmin</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">2.6</strong>的根目录下，打开以下这个文件：libraries/select_lang.lib.php <br><br>　　1、找到有"zh-gb2312"的那一行，把'zh-gb2312' 改成 'zh-gb2312-utf-8'为什么这样加？那是因为服务器会把没有"-utf-8"的语言过滤掉，在libraries/database_interface.lib.php 第168行，根据英文说：&#8220;为了防止混淆&#8221;，:&lt;或者如果不把'zh-gb2312' 改成 'zh-gb2312-utf-8'，可以去掉过滤吧。把那个if去掉就OK了。 <br><br>　　2、找到"$mysql_charset_map = array("那一行把'gb2312' =&gt; 'gb2312',改成 'gb2312' =&gt; 'latin1',保存，OK，在进入<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">phpMyAdmin</strong>管理，选择语言chinese simplified(zh-gb2312-utf-8)再看看你的那些中文数据。 <br><br>　　所以说，我的这个解决办法就只是修改libraries/select_lang.lib.php这一个文件里的两个字就行，比较方便快捷，哈哈。
<div class=post-body></div>
<div class=post-body>ps:这个帖子的方法非常好用，推荐！</div>
<p class=diaryFoot>- 作者： <a onclick="window.open('http://publishblog.blogchina.com/blog/postMessage.b?receiver=111700','发送短消息','width=520, height=455')" href="javascript:void(0);"><u><font color=#0000ff>FS8C</font></u></a> 2006年12月19日, 星期二 15:37　 <a href="http://fs8c.bokee.com/5970767.html#comment"><u><font color=#0000ff>回复（0）</font></u></a> |　 <a href="http://fs8c.bokee.com/5970767.html#trackback"><u><font color=#0000ff>引用（0）</font></u></a> <a href="javascript:void(keyit=window.open('http://blogmark.blogchina.com/jsp/key/quickaddkey.jsp?k='+encodeURI('[转贴]解决phpMyAdmin数据乱码问题')+'&amp;u='+encodeURI('http://fs8c.blogchina.com/fs8c/5970767.html')+'&amp;c='+encodeURI(''),'keyit','scrollbars=no,width=500,height=430,status=no,resizable=yes'));keyit.focus();"><u><font color=#0000ff>加入博采</font></u></a></td>
</p>
<div class=entity>
<h5 class=diaryTitle><img class=imgShow onclick="{if((document.getElementById('diary5790024')).style.display=='none') {(document.getElementById('diary5790024')).style.display='block'; this.src='http://blog.blogchina.com/template/common/img/array.gif'} else {(document.getElementById('diary5790024')).style.display='none'; this.src='http://blog.blogchina.com/template/common/img/array_2.gif'}}" src="http://blog.blogchina.com/template/common/img/array.gif"> <a href="http://fs8c.bokee.com/5790024.html"><u><font color=#0000ff>MySQL 备份和恢复(转贴)</font></u></a> </h5>
<div class=diaryContent id=diary5790024 style="DISPLAY: block">
<h2 class=content-title>MySQL 备份和恢复 </h2>
<!-- start main content --><!-- begin content -->
<div class="node  ">
<div class=content>
<h1>MySQL 备份和恢复</h1>
<script language=javascript src="misc/cr.js" type=text/javascript></script>
<p><span class=style1>作者：叶金荣（Email:<img src="http://imysql.cn/files/pictures/email.gif" border=0>），来源：<a href="http://imysql.cn/"><u><font color=#0000ff>http://imysql.cn</font></u></a>，转载请注明译者和出处，并且不能用于商业用途，违者必究。</span></p>
<p>日期：2006/10/01</p>
<p>本文讨论 MySQL 的备份和恢复机制，以及如何维护数据表，包括最主要的两种表类型：<code><font face=新宋体>MyISAM</font></code> 和 <code><font face=新宋体>Innodb</font></code>，文中设计的 MySQL 版本为 5.0.22。</p>
<p>目前 MySQL 支持的免费备份工具有：<code><font face=新宋体>mysqldump、mysqlhotcopy</font></code>，还可以用 SQL 语法进行备份：<code><font face=新宋体>BACKUP TABLE</font></code> 或者 <code><font face=新宋体>SELECT INTO OUTFILE</font></code>，又或者备份<code><font face=新宋体>二进制日志（binlog）</font></code>，还可以是<code><font face=新宋体>直接拷贝数据文件和相关的配置文件</font></code>。MyISAM 表是保存成文件的形式，因此相对比较容易备份，上面提到的几种方法都可以使用。<code><font face=新宋体>Innodb</font></code> 所有的表都保存在同一个数据文件 <code><font face=新宋体>ibdata1</font></code> 中（也可能是多个文件，或者是独立的表空间文件），相对来说比较不好备份，免费的方案可以是<code><font face=新宋体>拷贝数据文件</font></code>、<code><font face=新宋体>备份 binlog</font></code>，或者用 <code><font face=新宋体>mysqldump</font></code>。</p>
<h3>1、mysqldump</h3>
<h4>1.1 备份</h4>
<p><code><font face=新宋体>mysqldump</font></code> 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。<br>现在来讲一下 <code><font face=新宋体>mysqldump</font></code> 的一些主要参数：</p>
<ul type=1>
    <li>--compatible=name
    <p>它告诉 mysqldump，导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 <code><font face=新宋体>ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options</font></code> 等，要使用几个值，用逗号将它们隔开。当然了，它并不保证能完全兼容，而是尽量兼容。 </p>
    <li>--complete-insert，-c
    <p>导出的数据采用包含字段名的完整 <code><font face=新宋体>INSERT</font></code> 方式，也就是把所有的值都写在一行。这么做能提高插入效率，但是可能会受到 <code><font face=新宋体>max_allowed_packet</font></code> 参数的影响而导致插入失败。因此，需要谨慎使用该参数，至少我不推荐。 </p>
    <li>--default-character-set=charset
    <p>指定导出数据时采用何种字符集，如果数据表不是采用默认的 <code><font face=新宋体>latin1</font></code> 字符集的话，那么导出时必须指定该选项，否则再次导入数据后将产生乱码问题。</p>
    <li>--disable-keys
    <p>告诉 <code><font face=新宋体>mysqldump</font></code> 在 <code><font face=新宋体>INSERT</font></code> 语句的开头和结尾增加 <code><font face=新宋体>/*!40000 ALTER TABLE table DISABLE KEYS */;</font></code> 和 <code><font face=新宋体>/*!40000 ALTER TABLE table ENABLE KEYS */;</font></code> 语句，这能大大提高插入语句的速度，因为它是在插入完所有数据后才重建索引的。该选项只适合 <code><font face=新宋体>MyISAM</font></code> 表。</p>
    <li>--extended-insert = true|false
    <p>默认情况下，<code><font face=新宋体>mysqldump</font></code> 开启 <code><font face=新宋体>--complete-insert</font></code> 模式，因此不想用它的的话，就使用本选项，设定它的值为 <code><font face=新宋体>false</font></code> 即可。 </p>
    <li>--hex-blob
    <p>使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 <code><font face=新宋体>BINARY、VARBINARY、BLOB</font></code>。</p>
    <li>--lock-all-tables，-x
    <p>在开始导出之前，提交请求锁定所有数据库中的所有表，以保证数据的一致性。这是一个全局读锁，并且自动关闭 <code><font face=新宋体>--single-transaction</font></code> 和 <code><font face=新宋体>--lock-tables</font></code> 选项。</p>
    <li>--lock-tables
    <p>它和 <code><font face=新宋体>--lock-all-tables</font></code> 类似，不过是锁定当前导出的数据表，而不是一下子锁定全部库下的表。本选项只适用于 <code><font face=新宋体>MyISAM</font></code> 表，如果是 <code><font face=新宋体>Innodb</font></code> 表可以用 <code><font face=新宋体>--single-transaction</font></code> 选项。</p>
    <li>--no-create-info，-t
    <p>只导出数据，而不添加 <code><font face=新宋体>CREATE TABLE</font></code> 语句。</p>
    <li>--no-data，-d
    <p>不导出任何数据，只导出数据库表结构。</p>
    <li>--opt
    <p>这只是一个快捷选项，等同于同时添加 <code><font face=新宋体>--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset</font></code> 选项。本选项能让 <code><font face=新宋体>mysqldump</font></code> 很快的导出数据，并且导出的数据能很快导回。该选项默认开启，但可以用 <code><font face=新宋体>--skip-opt</font></code> 禁用。注意，如果运行 <code><font face=新宋体>mysqldump</font></code> 没有指定 <code><font face=新宋体>--quick</font></code> 或 <code><font face=新宋体>--opt</font></code> 选项，则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。</p>
    <li>--quick，-q
    <p>该选项在导出大表时很有用，它强制 <code><font face=新宋体>mysqldump</font></code> 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。</p>
    <li>--routines，-R
    <p>导出存储过程以及自定义函数。</p>
    <li>--single-transaction
    <p>该选项在导出数据之前提交一个 <code><font face=新宋体>BEGIN</font></code> SQL语句，<code><font face=新宋体>BEGIN</font></code> 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表，例如 <code><font face=新宋体>InnoDB</font></code> 和 <code><font face=新宋体>BDB</font></code>。<br>本选项和 <code><font face=新宋体>--lock-tables</font></code> 选项是互斥的，因为 <code><font face=新宋体>LOCK TABLES</font></code> 会使任何挂起的事务隐含提交。<br>要想导出大表的话，应结合使用 <code><font face=新宋体>--quick</font></code> 选项。 </p>
    <li>--triggers
    <p>同时导出触发器。该选项默认启用，用 <code><font face=新宋体>--skip-triggers</font></code> 禁用它。</p>
    </li>
</ul>
<p>其他参数详情请参考手册，我通常使用以下 SQL 来备份 <code><font face=新宋体>MyISAM</font></code> 表：</p>
<pre>/usr/local/mysql/bin/mysqldump -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob -x db_name &gt; db_name.sql
</pre>
<p>使用以下 SQL 来备份 <code><font face=新宋体>Innodb</font></code> 表：</p>
<pre>/usr/local/mysql/bin/mysqldump -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob --single-transaction db_name &gt; db_name.sql
</pre>
<p>&#160;</p>
<h4>1.2 还原</h4>
<p>用 <code><font face=新宋体>mysqldump</font></code> 备份出来的文件是一个可以直接倒入的 SQL 脚本，有两种方法可以将数据导入。</p>
<ul type=1>
    <li>直接用 <code><font face=新宋体>mysql</font></code> 客户端
    <p>例如：</p>
    <pre>/usr/local/mysql/bin/mysql -uyejr -pyejr db_name &lt; db_name.sql
    </pre>
    <p>&#160;</p>
    <li>用 SOURCE 语法
    <p>其实这不是标准的 SQL 语法，而是 <code><font face=新宋体>mysql</font></code> 客户端提供的功能，例如：</p>
    <pre>SOURCE /tmp/db_name.sql;
    </pre>
    <p>这里需要指定文件的绝对路径，并且必须是 <code><font face=新宋体>mysqld</font></code> 运行用户(例如 nobody)有权限读取的文件。</p>
    </li>
</ul>
<h3>2、 mysqlhotcopy</h3>
<h4>2.1 备份</h4>
<p><code><font face=新宋体>mysqlhotcopy</font></code> 是一个 PERL 程序，最初由Tim Bunce编写。它使用 <code><font face=新宋体>LOCK TABLES、FLUSH TABLES</font></code> 和 <code><font face=新宋体>cp</font></code> 或 <code><font face=新宋体>scp</font></code> 来快速备份数据库。它是备份数据库或单个表的最快的途径，但它只能运行在数据库文件（包括数据表定义文件、数据文件、索引文件）所在的机器上。<code><font face=新宋体>mysqlhotcopy</font></code> 只能用于备份 <code><font face=新宋体>MyISAM</font></code>，并且只能运行在 <code><font face=新宋体>类Unix</font></code> 和 <code><font face=新宋体>NetWare</font></code> 系统上。</p>
<p><code><font face=新宋体>mysqlhotcopy</font></code> 支持一次性拷贝多个数据库，同时还支持正则表达。以下是几个例子：</p>
<pre>root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name /tmp (把数据库目录 <tt>db_name</tt> 拷贝到 <tt>/tmp</tt> 下)
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name./regex/ /tmp
</pre>
<p>更详细的使用方法请查看手册，或者调用下面的命令来查看 <code><font face=新宋体>mysqlhotcopy</font></code> 的帮助：</p>
<pre>perldoc /usr/local/mysql/bin/mysqlhotcopy
</pre>
<p>注意，想要使用 <code><font face=新宋体>mysqlhotcopy</font></code>，必须要有 <code><font face=新宋体>SELECT、RELOAD(要执行 FLUSH TABLES)</font></code> 权限，并且还必须要能够有读取 <tt><font face=新宋体>datadir/db_name</font></tt> 目录的权限。 </p>
<h4>2.2 还原</h4>
<p><code><font face=新宋体>mysqlhotcopy</font></code> 备份出来的是整个数据库目录，使用时可以直接拷贝到 <code><font face=新宋体>mysqld</font></code> 指定的 <tt><font face=新宋体>datadir</font></tt> (在这里是 <tt><font face=新宋体>/usr/local/mysql/data/</font></tt>)目录下即可，同时要注意权限的问题，如下例：</p>
<pre>root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 <code>mysqld</code> 运行用户)
</pre>
<p>
<h3>3、 SQL 语法备份</h3>
<h4>3.1 备份</h4>
<p><code><font face=新宋体>BACKUP TABLE</font></code> 语法其实和 <code><font face=新宋体>mysqlhotcopy</font></code> 的工作原理差不多，都是锁表，然后拷贝数据文件。它能实现在线备份，但是效果不理想，因此不推荐使用。它只拷贝表结构文件和数据文件，不同时拷贝索引文件，因此恢复时比较慢。<br>例子：</p>
<pre>BACK TABLE tbl_name TO '/tmp/db_name/';
</pre>
<p>注意，必须要有 <code><font face=新宋体>FILE</font></code> 权限才能执行本SQL，并且目录 <tt><font face=新宋体>/tmp/db_name/</font></tt> 必须能被 <code><font face=新宋体>mysqld</font></code> 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。 </p>
<p><code><font face=新宋体>SELECT INTO OUTFILE</font></code> 则是把数据导出来成为普通的文本文件，可以自定义字段间隔的方式，方便处理这些数据。<br>例子：</p>
<pre>SELECT INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
</pre>
<p>注意，必须要有 <code><font face=新宋体>FILE</font></code> 权限才能执行本SQL，并且文件 <tt><font face=新宋体>/tmp/db_name/tbl_name.txt</font></tt> 必须能被 <code><font face=新宋体>mysqld</font></code> 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。 </p>
<h4>3.2 恢复</h4>
<p>用 <code><font face=新宋体>BACKUP TABLE</font></code> 方法备份出来的文件，可以运行 <code><font face=新宋体>RESTORE TABLE</font></code> 语句来恢复数据表。<br>例子：</p>
<pre>RESTORE TABLE FROM '/tmp/db_name/';
</pre>
<p>权限要求类似上面所述。</p>
<p>用 <code><font face=新宋体>SELECT INTO OUTFILE</font></code> 方法备份出来的文件，可以运行 <code><font face=新宋体>LOAD DATA INFILE</font></code> 语句来恢复数据表。<br>例子：</p>
<pre>LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
</pre>
<p>权限要求类似上面所述。倒入数据之前，数据表要已经存在才行。如果担心数据会发生重复，可以增加 <code><font face=新宋体>REPLACE</font></code> 关键字来替换已有记录或者用 <code><font face=新宋体>IGNORE</font></code> 关键字来忽略他们。</p>
<h3>4、 启用二进制日志(binlog)</h3>
<p>采用 <code><font face=新宋体>binlog</font></code> 的方法相对来说更灵活，省心省力，而且还可以支持增量备份。</p>
<p>启用 <code><font face=新宋体>binlog</font></code> 时必须要重启 <code><font face=新宋体>mysqld</font></code>。首先，关闭 <code><font face=新宋体>mysqld</font></code>，打开 <code><font face=新宋体>my.cnf</font></code>，加入以下几行：</p>
<pre>server-id	= 1
log-bin		= binlog
log-bin-index	= binlog.index
</pre>
<p>然后启动 <code><font face=新宋体>mysqld</font></code> 就可以了。运行过程中会产生 <code><font face=新宋体>binlog.000001</font></code> 以及 <code><font face=新宋体>binlog.index</font></code>，前面的文件是 <code><font face=新宋体>mysqld</font></code> 记录所有对数据的更新操作，后面的文件则是所有 <code><font face=新宋体>binlog</font></code> 的索引，都不能轻易删除。关于 <code><font face=新宋体>binlog</font></code> 的信息请查看手册。</p>
<p>需要备份时，可以先执行一下 SQL 语句，让 <code><font face=新宋体>mysqld</font></code> 终止对当前 <code><font face=新宋体>binlog</font></code> 的写入，就可以把文件直接备份，这样的话就能达到增量备份的目的了：</p>
<pre>FLUSH LOGS;</pre>
<p>如果是备份复制系统中的从服务器，还应该备份 <tt><font face=新宋体>master.info</font></tt> 和 <tt><font face=新宋体>relay-log.info</font></tt> 文件。 </p>
<p>备份出来的 <code><font face=新宋体>binlog</font></code> 文件可以用 MySQL 提供的工具 <code><font face=新宋体>mysqlbinlog</font></code> 来查看，如：</p>
<pre>/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
</pre>
<p>该工具允许你显示指定的数据库下的所有 SQL 语句，并且还可以限定时间范围，相当的方便，详细的请查看手册。</p>
<p>恢复时，可以采用类似以下语句来做到：</p>
<pre>/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
</pre>
<p>把 <code><font face=新宋体>mysqlbinlog</font></code> 输出的 SQL 语句直接作为输入来执行它。</p>
<p>如果你有空闲的机器，不妨采用这种方式来备份。由于作为 <code><font face=新宋体>slave</font></code> 的机器性能要求相对不是那么高，因此成本低，用低成本就能实现增量备份而且还能分担一部分数据查询压力，何乐而不为呢？</p>
<h3>5、 直接备份数据文件</h3>
<p>相较前几种方法，备份数据文件最为直接、快速、方便，缺点是基本上不能实现增量备份。为了保证数据的一致性，需要在靠背文件前，执行以下 SQL 语句：</p>
<pre>FLUSH TABLES WITH READ LOCK;</pre>
<p>也就是把内存中的数据都刷新到磁盘中，同时锁定数据表，以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单，直接拷贝回原来的数据库目录下即可。</p>
<p>注意，对于 <code><font face=新宋体>Innodb</font></code> 类型表来说，还需要备份其日志文件，即 <code><font face=新宋体>ib_logfile*</font></code> 文件。因为当 <code><font face=新宋体>Innodb</font></code> 表损坏时，就可以依靠这些日志文件来恢复。</p>
<h3>6、 备份策略</h3>
<p>对于中等级别业务量的系统来说，备份策略可以这么定：第一次全量备份，每天一次增量备份，每周再做一次全量备份，如此一直重复。而对于重要的且繁忙的系统来说，则可能需要每天一次全量备份，每小时一次增量备份，甚至更频繁。为了不影响线上业务，实现在线备份，并且能增量备份，最好的办法就是采用主从复制机制(<code><font face=新宋体>replication</font></code>)，在 <code><font face=新宋体>slave</font></code> 机器上做备份。</p>
<h3>7、 数据维护和灾难恢复</h3>
<p>作为一名DBA(我目前还不是，呵呵)，最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此，需要定期维护你的数据表。以下 SQL 语句就很有用：</p>
<pre>CHECK TABLE 或 REPAIR TABLE，检查或维护 MyISAM 表
OPTIMIZE TABLE，优化 MyISAM 表
ANALYZE TABLE，分析 MyISAM 表
</pre>
<p>当然了，上面这些命令起始都可以通过工具 <code><font face=新宋体>myisamchk</font></code> 来完成，在这里不作详述。</p>
<p><code><font face=新宋体>Innodb</font></code> 表则可以通过执行以下语句来整理碎片，提高索引速度：</p>
<pre>ALTER TABLE tbl_name ENGINE = Innodb;
</pre>
<p>这其实是一个 <code><font face=新宋体>NULL</font></code> 操作，表面上看什么也不做，实际上重新整理碎片了。</p>
<p>通常使用的 <code><font face=新宋体>MyISAM</font></code> 表可以用上面提到的恢复方法来完成。如果是索引坏了，可以用 <code><font face=新宋体>myisamchk</font></code> 工具来重建索引。而对于 <code><font face=新宋体>Innodb</font></code> 表来说，就没这么直接了，因为它把所有的表都保存在一个表空间了。不过 <code><font face=新宋体>Innodb</font></code> 有一个检查机制叫 <code><font face=新宋体>模糊检查点</font></code>，只要保存了日志文件，就能根据日志文件来修复错误。可以在 <tt><font face=新宋体>my.cnf</font></tt> 文件中，增加以下参数，让 <code><font face=新宋体>mysqld</font></code> 在启动时自动检查日志文件：</p>
<pre>innodb_force_recovery	= 4
</pre>
<p>关于该参数的信息请查看手册。</p>
<h3>8、 总结</h3>
<p>做好数据备份，定只好合适的备份策略，这是一个DBA所做事情的一小部分，万事开头难，就从现在开始吧！</p>
</div>
</div>
</div>
</div>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/123744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2007-06-13 02:45 <a href="http://www.blogjava.net/OpenCloseD/archive/2007/06/13/123744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ORACLE触发器</title><link>http://www.blogjava.net/OpenCloseD/archive/2006/10/16/75331.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Sun, 15 Oct 2006 17:03:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2006/10/16/75331.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/75331.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2006/10/16/75331.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/75331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/75331.html</trackback:ping><description><![CDATA[
		<p>
				<font color="#deb887">触发器是一种特殊的存储过程，它在插入，删除或修改特定表中的数据时触发执行，它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下的作用：</font>
		</p>
		<p>
				<font color="#deb887">* 安全性。可以基于数据库的值使用户具有操作数据库的某种权利。</font>
		</p>
		<p>
				<font color="#deb887"># 可以基于时间限制用户的操作，例如不允许下班后和节假日修改数据库数据。</font>
		</p>
		<p>
				<font color="#deb887"># 可以基于数据库中的数据限制用户的操作，例如不允许股票的价格的升幅一次超过10%。</font>
		</p>
		<p>
				<font color="#deb887">* 审计。可以跟踪用户对数据库的操作。</font>
		</p>
		<p>
				<font color="#deb887"># 审计用户操作数据库的语句。</font>
		</p>
		<p>
				<font color="#deb887"># 把用户对数据库的更新写入审计表。</font>
		</p>
		<p>
				<font color="#deb887">* 实现复杂的数据完整性规则。</font>
		</p>
		<p>
				<font color="#deb887"># 实现非标准的数据完整性检查和约束。触发器可产生比规则更为复杂的限制。与规则不同，触发器可以引用列或数据库对象。例如，触发器可回退任何企图吃进超过自己保证金的期货。</font>
		</p>
		<p>
				<font color="#deb887"># 提供可变的缺省值。</font>
		</p>
		<p>
				<font color="#deb887">* 实现复杂的非标准的数据库相关完整性规则。触发器可以对数据库中相关的表进行连环更新。例如，在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。</font>
		</p>
		<p>
				<font color="#deb887"># 在修改或删除时级联修改或删除其它表中的与之匹配的行。</font>
		</p>
		<p>
				<font color="#deb887"># 在修改或删除时把其它表中的与之匹配的行设成NULL值。</font>
		</p>
		<p>
				<font color="#deb887"># 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。</font>
		</p>
		<p>
				<font color="#deb887"># 触发器能够拒绝或回退那些破坏相关完整性的变化，取消试图进行数据更新的事务。当插入一个与其主健不匹配的外部键时，这种触发器会起作用。例如，可以在books.author_code列上生成一个插入触发器，如果新值与auths.author_code列中的某值不匹配时，插入被回退。</font>
		</p>
		<p>
				<font color="#deb887">* 同步实时地复制表中的数据。</font>
		</p>
		<p>
				<font color="#deb887">* 自动计算数据值，如果数据的值达到了一定的要求，则进行特定的处理。例如，如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。</font>
		</p>
		<p>
				<font color="#deb887">ORACLE与SYBASE数据库的触发器有一定的区别，下面将分别讲述这两种数据库触发器的作用和写法。</font>
		</p>
		<p>
				<font color="#deb887">二 ORACLE 触发器</font>
		</p>
		<p>
				<font color="#deb887">ORACLE产生数据库触发器的语法为：</font>
		</p>
		<p>
				<font color="#deb887">create [or replace] trigger 触发器名 触发时间 触发事件</font>
		</p>
		<p>
				<font color="#deb887">on 表名</font>
		</p>
		<p>
				<font color="#deb887">[for each row]</font>
		</p>
		<p>
				<font color="#deb887">pl/sql 语句</font>
		</p>
		<p>
				<font color="#deb887">其中：</font>
		</p>
		<p>
				<font color="#deb887">触发器名：触发器对象的名称。由于触发器是数据库自动执行的，因此该名称只是一个名称，没有实质的用途。</font>
		</p>
		<p>
				<font color="#deb887">触发时间：指明触发器何时执行，该值可取：</font>
		</p>
		<p>
				<font color="#deb887">before---表示在数据库动作之前触发器执行；</font>
		</p>
		<p>
				<font color="#deb887">after---表示在数据库动作之后出发器执行。</font>
		</p>
		<p>
				<font color="#deb887">触发事件：指明哪些数据库动作会触发此触发器：</font>
		</p>
		<p>
				<font color="#deb887">insert：数据库插入会触发此触发器；</font>
		</p>
		<p>
				<font color="#deb887">update：数据库修改会触发此触发器；</font>
		</p>
		<p>
				<font color="#deb887">delete：数据库删除会触发此触发器。</font>
		</p>
		<p>
				<font color="#deb887">表 名：数据库触发器所在的表。</font>
		</p>
		<p>
				<font color="#deb887">for each row：对表的每一行触发器执行一次。如果没有这一选项，则只对整个表执行一次。</font>
		</p>
		<p>
				<font color="#deb887">举例：下面的触发器在更新表auths之前触发，目的是不允许在周末修改表：</font>
		</p>
		<p>
				<font color="#deb887">create trigger auth_secure</font>
		</p>
		<p>
				<font color="#deb887">before insert or update or delete //对整表更新前触发</font>
		</p>
		<p>
				<font color="#deb887">on auths</font>
		</p>
		<p>
				<font color="#deb887">begin</font>
		</p>
		<p>
				<font color="#deb887">if(to_char(sysdate,'DY')='SUN'</font>
		</p>
		<p>
				<font color="#deb887">RAISE_APPLICATION_ERROR(-20600,'不能在周末修改表auths');</font>
		</p>
		<p>
				<font color="#deb887">end if;</font>
		</p>
		<p>
				<font color="#deb887">end</font>
		</p>
		<p>
				<font color="#deb887">三 SYBASE数据库触发器</font>
		</p>
		<p>
				<font color="#deb887">SYBASE数据库触发器的作用与ORACLE非常类似，仅有较小的差异。</font>
		</p>
		<p>
				<font color="#deb887">SYBASE产生触发器的语法为：</font>
		</p>
		<p>
				<font color="#deb887">CREATE TRIGGER 触发器名</font>
		</p>
		<p>
				<font color="#deb887">ON 表名</font>
		</p>
		<p>
				<font color="#deb887">FOR INSERT，UPDATE，DELETE</font>
		</p>
		<p>
				<font color="#deb887">AS</font>
		</p>
		<p>
				<font color="#deb887">SQL_statement |</font>
		</p>
		<p>
				<font color="#deb887">FOR INSERT，UPDATE</font>
		</p>
		<p>
				<font color="#deb887">AS</font>
		</p>
		<p>
				<font color="#deb887">IF UPDATE(column_name) [AND|OR UPDATE(column_name)]...</font>
		</p>
		<p>
				<font color="#deb887">SQL_statements</font>
		</p>
		<p>
				<font color="#deb887">上面FOR子句用来指定在触发器上的哪些数据更新命令可激活该触发器。IF UPDATE子句检查对指定列的操作类型，在IF UPDATE子句中可指定多个列。</font>
		</p>
		<p>
				<font color="#deb887">与ORACLE不同，对于每条SQL语句，触发器只执行一次。触发器在数据更新语句完成以后立即执行。触发器和启动它的语句被当作一个事务处理，事务可以在触发器中回退。</font>
		</p>
		<p>
				<font color="#deb887">下面举例说明SYBASE触发器的写法。</font>
		</p>
		<p>
				<font color="#deb887">create trigger forinsert_books</font>
		</p>
		<p>
				<font color="#deb887">on books</font>
		</p>
		<p>
				<font color="#deb887">for insert</font>
		</p>
		<p>
				<font color="#deb887">as</font>
		</p>
		<p>
				<font color="#deb887">if(select count(*) from auths,inserted</font>
		</p>
		<p>
				<font color="#deb887">where auths.author_code=insert.author_code)!=@@rowcount</font>
		</p>
		<p>
				<font color="#deb887">begin</font>
		</p>
		<p>
				<font color="#deb887">rollback transaction</font>
		</p>
		<p>
				<font color="#deb887">print "books 表中 author_code 列的值在auths 表中不存在。"</font>
		</p>
		<p>
				<font color="#deb887">end</font>
		</p>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/75331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2006-10-16 01:03 <a href="http://www.blogjava.net/OpenCloseD/archive/2006/10/16/75331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EASY MYSQL!</title><link>http://www.blogjava.net/OpenCloseD/archive/2006/09/13/69281.html</link><dc:creator>开关</dc:creator><author>开关</author><pubDate>Wed, 13 Sep 2006 00:39:00 GMT</pubDate><guid>http://www.blogjava.net/OpenCloseD/archive/2006/09/13/69281.html</guid><wfw:comment>http://www.blogjava.net/OpenCloseD/comments/69281.html</wfw:comment><comments>http://www.blogjava.net/OpenCloseD/archive/2006/09/13/69281.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/OpenCloseD/comments/commentRss/69281.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/OpenCloseD/services/trackbacks/69281.html</trackback:ping><description><![CDATA[
		<div class="postText">
				<p>
						<span class="txt">
								<font color="#deb887" size="2">　　Mysql学习点滴【转】<br /><br />由于工作中需要使用mysql，笔者通过网上学习，动手实践，终于从一个"数据库菜鸟"变成了能熟练操作mysql的"准大虾"了，：)。现将学习心得整理如下。<br /><br />　　MySQL是完全网络化的跨平台关系型数据库系统，一个真正的多用户、多线程SQL数据库服务器，同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点，用户可利用许多语言编写访问MySQL 数据库的程序，对于中、小型应用系统是非常理想的。除了支持标准的ANSI SQL语句，更重要的是，它还支持多种平台，而在Unix系统上该软件支持多线程运行方式，从而能获得相当好的性能。对于不使用Unix的用户，它可以在Windows NT系统上以系统服务方式运行，或者在Windows 95/98系统上以普通进程方式运行。而在Unix/Linux系统上，MySQL支持多线程运行方式，从而能获得相当好的性能，而且它是属于开放源代码软。<br /><br />　　MySQL是以一个客户机/服务器结构的实现，它由一个服务器守护程序mysqld和很多不同的客户程序和库组成，MySQL 的执行性能非常高，运行速度非常快，并非常容易使用，是一个非常棒的数据库。MySQL的官方发音是"My Ess Que Ell"(不是 MY-SEQUEL )。<br /><br /><b>一．获得MySQL</b><br /><br />　　首先必须下载MySQL。Mysql的官方网站是：http://www.mysql.com ，在中国的镜像是：http://www.freecode.net.cn/mirror/mysql/ 或者http://www2.linuxforum.net/mirror/mysql/，可以下载MySQL的稳定版本3.22.32(截止到笔者发稿为止)。其版本名称是mysql-shareware-3.22.32-win，不但免费而且没有所谓的"30天使用期限"。<br /><br /><b>二．MySQL的安装</b><br /><br /><b>(一)在Win98/Winnt下的安装</b><br /><br />　　到一个目录，运行Setup程序，会提示整个安装的过程。它默认安装到c:\mysql下，如果要安装到其它目录下还有改动一些东西，作为初学者，可以先不管，以默认的目录安装。好了，安装后，进入c:\mysql\bin目录下，运行mysqld-shareware.exe文件在Win98下直接运行，正常情况下，没有什么提示信息。<br /><br />　　1。将下载后的文件解压解压到一个临时目录。<br />　　2。点击setup.exe安装到c:\mysql(默认)。<br />　　3。将mysql_example.cnf拷贝到c:\my.cnf，把文件中的#basedir=d:/mysql/改为basedir=c:\mysql。<br />　　4。进入msdos，到目录c:\mysql\bin。<br />　　5。输入mysqld-shareware -install，此为启动Mysql数据库服务。<br />　　6。mysqladmin －u root -p password 新密码，此为修改root用户的密码(原来默认的密码为空。) <br />　　7。输入mysql -u root -p。<br />　　8．接着，根据提示输入新密码 ，正常情况下会出现几行提示信息并出现提示符号：<br />　</font>
								<font color="#deb887" size="2">　　　Welcome to the MySQL monitor. Commands end with ; or \g.<br />　　　　Your MySQL connection id is 6268 to server version: 3.22.32 <br />　　　　</font>
								<font color="#deb887" size="2">Type 'help' for help.<br />　　　　mysql&gt;<br /><br />到此，你已经成功安装了MySQL。</font>
						</span>
				</p>
				<p>
						<span class="txt">
								<font size="2">
										<font color="#deb887">
												<span class="txt">
														<b>(二)在Windows2000 下的安装</b>
														<br />
														<br />　　1。安装时选默认目录： c:\mysql<br />　　2。把 c:\mysql\my-example.cnf copy 为 c:\my.cnf，并把 c:\mysql\lib\cygwinb19.dll copy 到 winnt\system32。<br />　　3。启动 mysql的方法是：<br />　　　　c:\mysql\bin\mysqld-shareware --install<br />　　　　net start mysql<br />　　这么简单，就可以启动了</span>
												<br />　　4。更改 超级用户(root) 的密码：<br />　　　　C:\mysql\bin\mysql mysql<br />　　　　mysql&gt; UPDATE user SET password=PASSWORD('your password') WHERE user='root';<br />　　　　mysql&gt; QUIT<br />　　　　C:\mysql\bin\mysqladmin reload <br />　　　　使用命令C:\mysql\bin\mysqlshow去看看检测一下。在这里应该显示：<br />　　　　+-----------+<br />　　　　| Databases |<br />　　　　+-----------+<br />　　　　| mysql |<br />　　　　| test |<br />　　　　+-----------+<br />　　　　看到这些信息这一步就证明没问题了<br />　　　　再来:<br />　　　　C:\mysql\bin\mysqlshow --user=root --password=your password mysql<br />　　　　在这里应该显示：<br />　　　　Database: mysql<br />　　　　+--------------+<br />　　　　| Tables |<br />　　　　+--------------+<br />　　　　| columns_priv |<br />　　　　| db |<br />　　　　| host |<br />　　　　| tables_priv |<br />　　　　| user |<br />　　　　+--------------+<br />　　　　一切搞定！<br /><br />　　5。C:\mysql\bin\mysqladmin version status proc<br />　　应该可以看到这些版本信息的：<br />　　　mysqladmin Ver 8.0 Distrib 3.22.32, for Win95/Win98 on i586<br />　　　TCX Datakonsult AB, by Monty<br /><br />　　　Server version 3.22.32-shareware-debug<br />　　　Protocol version 10<br />　　　Connection localhost via TCP/IP<br />　　　TCP port 3306<br />　　　Uptime: 1 hour 29 min 30 sec<br /><br />　　　Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K Max memory 　　　　　used: 16490K<br />　　　Uptime: 5370 Threads: 1 Questions: 72 Slow queries: 0 Opens: 16 Flush tables: 1 Open tables: 0 Memory in use: 16423K 　　　　Max memory used: 16490K<br />　　　　+----+------+-----------+----+---------+------+-------+------------------+<br />　　　　| Id | User | Host | db | Command | Time | State | Info |<br />　　　　+----+------+-----------+----+---------+------+-------+------------------+<br />　　　　| 35 | ODBC | localhost | | Query | 0 | | show processlist |<br />　　　　+----+------+-----------+----+---------+------+-------+------------------+<br />　　接着，用show databases命令可以将安装的数据库列出来：<br />　　　　mysql&gt; show databases;<br />　　你就可以看到：<br />　　　　+----------+<br />　　　　| Database |<br />　　　　+----------+<br />　　　　| mysql |<br />　　　　| test |<br />　　　　+----------+<br />　　　　2 rows in set (0.00 sec)<br />　　如果一切正常的话，那说明MySQL可以完全工作了!如果要退出程序，输入：exit<br />　　　　mysql&gt; exit;<br />　　　　Bye</font>
								</font>
						</span>
				</p>
				<p>
						<span class="txt">
								<span class="txt">
										<font size="2">
												<font color="#deb887">
														<b>三．Mysql常识</b>
														<br />
														<br />
														<b>(一) 字段类型</b>
														<br />
														<br />　　1．INT[(M)] <br />　　正常大小整数类型<br />　　2．DOUBLE[(M,D)] [ZEROFILL] <br />　　正常大小(双精密)浮点数字类型<br />　　3．DATE <br />　　日期类型。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值，但是允许你使用字符串或数字把值赋给　　DATE列<br />　　4．CHAR(M) <br />　　定长字符串类型，当存储时，总是是用空格填满右边到指定的长度<br />　　5．BLOB TEXT <br />　　BLOB或TEXT类型，最大长度为65535(2^16-1)个字符。<br />　　6．VARCHAR<br />　　变长字符串类型，最常用的类型。 <br /><br /><b>(二)基本操作</b><br /><br />　　1: 显示数据库 <br />　　　mysql&gt;SHOW DATABASES; <br />　　2：当前选择的数据库， <br />　　　mysql&gt; SELECT DATABASE(); <br />　　　+------------+ <br />　　　| DATABASE() | <br />　　　+------------+ <br />　　　| test | <br />　　　+------------+ <br />　　3.当前数据库包含的表信息： <br />　　　mysql&gt; SHOW TABLES; <br />　　　+---------------------+ <br />　　　| Tables in test | <br />　　　+---------------------+ <br />　　　| mytable1 | <br />　　　| mytable2 | <br />　　　+---------------------+ <br />　　4.获取表结构 <br />　　　mysql&gt; desc mytable1; <br />　　　+---------+-------------+------+-----+---------+-------+ <br />　　　| Field | Type | Null | Key | Default | Extra | <br />　　　+---------+-------------+------+-----+---------+-------+ <br />　　　| s1 | varchar(20) | YES | | NULL | | <br />　　　+---------+-------------+------+-----+---------+-------+ <br />　　5．创建表 <br />　　表是数据库的最基本元素之一，表与表之间可以相互独立，也可以相互关联。创建表的基本语法如下： <br />　　　create table table_name <br />　　　(column_name datatype {identity |null|not null}, <br />　　　…) <br />　　其中参数table_name和column_name必须满足用户数据库中的识别器(identifier)的要求，参数datatype是一个标准的SQL类型或由用户数　　据库提供的类型。用户要使用non-null从句为各字段输入数据。 <br />　　create table还有一些其他选项，如创建临时表和使用select子句从其他的表中读取某些字段组成新表等。还有，在创建表是可用PRIMARY 　　KEY、KEY、INDEX等标识符设定某些字段为主键或索引等。书写上要注意： 在一对圆括号里的列出完整的字段清单。字段名间用逗号隔开　　。 字段名间的逗号后要加一个空格。最后一个字段名后不用逗号。所有的SQL陈述都以分号";"结束。 <br />　　例： <br />　　<b>　mysql&gt;CREATE TABLE guest (name varchar(10),sex varchar(2),age int(3),career varchar(10));</b><br />　　6．创建索引 <br />　　索引用于对数据库的查询。一般数据库建有多种索引方案，每种方案都精于某一特定的查询类。索引可以加速对数据库的查询过程。创建　　索引的基本语法如下： <br />　　　create index index_name <br />　　　on table_name (col_name[(length)],... ) <br />　　例： <br />　　</font>
										</font>
										<font size="2">
												<font color="#deb887">
														<b>　mysql&gt; CREATE INDEX number ON guest (number(10));<br /></b>
														<b>
														</b>　　7．执行查询 <br />　　查询是使用最多的SQL命令。查询数据库需要凭借结构、索引和字段类型等因素。大多数数据库含有一个优化器(optimizer)，把用户的查　　询语句转换成可选的形式，以提高查询效率。 <br />　　值得注意的是MySQL不支持SQL92标准的嵌套的where子句，即它只支持一个where子句。其基本语法如下： <br />　　　SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY] <br />　　　[DISTINCT | DISTINCTROW | ALL] <br />　　　select_expression,... <br />　　　[INTO {OUTFILE | DUMPFILE} 'file_name' export_options] <br />　　　[FROM table_references <br />　　　[WHERE where_definition] <br />　　　[GROUP BY col_name,...] <br />　　　[HAVING where_definition] <br />　　　[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...] <br />　　　[LIMIT [offset,] rows] <br />　　　[PROCEDURE procedure_name] ] <br />　　其中where从句是定义选择标准的地方，where_definition可以有不同的格式，但都遵循下面的形式： <br />　　字段名操作表达式 <br />　　字段名操作字段名 <br />　　在第一种形式下，标准把字段的值与表达式进行比较；在第二种形式下，把两个字段的值进行比较。根据所比较的数据类型，　　　　　　　search_condition中的操作可能选以下几种： <br />　　　= 检查是否相等 <br />　　　！= 检查是否不等 <br /><br />　　　&gt; (或&gt;=) 检查左边值是否大于(或大于等于)右边值 <br />　　　&lt; (或&lt;=) 检查左边值是否小于(或小于等于)右边值 <br />　　　[not] between 检查左边值是否在某个范围内 <br />　　　[not] in 检查左边是否某个特定集的成员 <br />　　　[not] like 检查左边是否为右边的子串 <br />　　　is [not] null 检查左边是否为空值 <br />　　在这里，可以用通配符_代表任何一个字符，%代表任何字符串。使用关键字<and></and>、<or></or>和<not></not>可以生成复杂的词，它们运行检查时使用　　布尔表达式的多重标准集。 <br />　　例： <br />　　　</font>
										</font>
										<font size="2">
												<font color="#deb887">
														<b>mysql&gt; select t1.name, t2.salary from employee AS t1, info AS t2 where t1.name = t2.name; <br />　　　mysql&gt; select college, region, seed from tournament <br />　　　ORDER BY region, seed; <br />　　　mysql&gt; select col_name from tbl_name WHERE col_name &gt; 0; </b>
														<br />　　8．改变表结构 <br />　　在数据库的使用过程中，有时需要改变它的表结构，包括改变字段名，甚至改变不同数据库字段间的关系。可以实现上述改变的命令是　　　alter，其基本语法如下： <br />　　alter table table_name alter_spec [, alter_spec ...] <br />　　例： <br />　　<b>　mysql&gt; alter table dbname add column userid int(11) not null primary key auto_increment;</b><br />　　这样，就在表dbname中添加了一个字段userid，类型为int(11)。<br />　　9．修改表中数据 <br />　　在使用数据库过程中，往往要修改其表中的数据，比如往表中添加新数据，删除表中原有数据，或对表中原有数据进行更改。它们的基本　　语法如下： <br />　　数据添加： <br />　　　insert [into] table_name [(column(s))] <br />　　　values (expression(s)) <br />　　例：<br />　　　</font>
										</font>
										<font color="#deb887" size="2">
												<strong>mysql&gt;insert into mydatabase values('php','mysql','asp','sqlserver','jsp','oracle');<br /></strong>
										</font>
										<font color="#deb887" size="2">
												<span class="txt">　　10. 表的数据更新 <br /><br />　　(1) 一次修改一个字段，再次注意语法。文本需要加引号但数字不要。 <br />　　　mysql&gt;update table01 set field03='new info' where field01=1; <br />　　　Query OK, 1 row affected (0.00 sec) <br />　　(2)一次改变多个字段，记住在每一个更新的字段间用逗号隔开。 <br />　　　mysql&gt;update table01 set field04=19991022, field05=062218 where field01=1; <br />　　　Query OK, 1 row affected (0.00 sec) <br />　　(3) 一次更新多个数据 <br />　　　mysql&gt;update table01 set field05=152901 where field04&gt;19990101; <br />　　　Query OK, 3 rows affected (0.00 sec) <br />　　11. 删除数据 <br />　　　mysql&gt;delete from table01 where field01=3; <br />　　　Query OK, 1 row affected (0.00 sec) <br />　　12．导入数据库表<br />　　　(1)创建.sql文件<br />　　　(2)先产生一个库如auction.c:\mysql\bin&gt;mysqladmin -u root -p creat auction，会提示输入密码，然后成功创建。<br />　　　(3)导入auction.sql文件<br />　　　　c:\mysql\bin&gt;mysql -u root -p auction &lt; auction.sql。<br />　　　通过以上操作，就可以创建了一个数据库auction以及其中的一个表auction。<br />　　13．mysql数据库的授权<br />　　　mysql&gt;grant select,insert,delete,create,drop<br />　　　on *.* (或test.*/user.*/..)<br />　　　to 用户名@localhost<br />　　　identified by '密码'；<br />　　如：新建一个用户帐号以便可以访问数据库，需要进行如下操作：<br />　　　mysql&gt; grant usage<br />　　　-&gt; ON test.*<br />　　　-&gt; TO testuser@localhost;<br />　　　Query OK, 0 rows affected (0.15 sec)<br />　　此后就创建了一个新用户叫：testuser，这个用户只能从localhost连接到数据库并可以连接到test 数据库。下一步，我们必须指定　　　　　testuser这个用户可以执行哪些操作：<br />　　　mysql&gt; GRANT select, insert, delete,update<br />　　　-&gt; ON test.*<br />　　　-&gt; TO testuser@localhost;<br />　　　Query OK, 0 rows affected (0.00 sec)<br />　　此操作使testuser能够在每一个test数据库中的表执行SELECT，INSERT和DELETE以及UPDATE查询操作。现在我们结束操作并退出MySQL客户　　程序：<br />　　　mysql&gt; exit<br />　　　Bye <br />　　14．授权 MySQL用户密码<br />　　MySQL数据库的默认用户名为"root"(MS SQL Server 的 sa 相似)，密码默认为空。在DOS提示符(注意，不是mysql提示符)下输入<br />　　c:\mysql\bin&gt;"mysqladmin -u root -p password newpassword<br />　　回车后会提示你输入原来的密码，由于原来密码为空，直接回车，root用户的密码便改为"newpassword"了。</span>
										</font>
								</span>
						</span>
				</p>
				<p>
						<span class="txt">
								<span class="txt">
										<span class="txt">
												<font size="2">
														<font color="#deb887">
																<strong>四．安装phpMyAdmin<br /><br /></strong>　　MySQL图形界面管理器phpMyAdmin是一套以php3 写成，针对MySQL数据库系统的Web管理界面。它可以很方便地以图形化界面，来对MySQL数据库里的字段、数据进行增加、删除等的动作，更可以做数据库本身的增删管理；phpMyAdmin可以管理整个MySQL服务器(需要超级用户)，也可以管理单个数据库。另外，您也可以通过使用这个图形化界面来学习SQL正确的语法，直至熟练掌握。那要等到你看过MySQL手册中相关的部分。你可以到http://www.phpwizard.net/phpMyAdmin/ 去下载最新的版本。<br /><br />首先，将phpMyAdmin软件包解到一个目录下。<br />1．修改文档config.inc.php3。<br />将原来的设定： <br />$cfgServers[1]['host'] = ''; // MySQL hostname <br />$cfgServers[1]['port'] = ''; // MySQL port - leave blank for　default port <br />$cfgServers[1]['adv_auth'] = false; // Use advanced authentication? <br />$cfgServers[1]['stduser'] = ''; // MySQL standard user (only needed with advanced auth) <br />$cfgServers[1]['stdpass'] = ''; // MySQL standard password (only needed with advanced auth) <br />$cfgServers[1]['user'] = ''; // MySQL user (only needed withbasic auth) <br />$cfgServers[1]['password'] = ''; // MySQL password (only needed with basic auth) <br />$cfgServers[1]['only_db'] = ''; // If set to a db-name, only this db is accessible <br />$cfgServers[1]['verbose'] = ''; // Verbose name for this host -leave blank to show the hostname <br />: <br />: <br />require("english.inc.php3");<br />修改成：<br />$cfgServers[1]['host'] = 'MySQL Server的hostname'; // 填入您的MySQL Server的主机名称<br />$cfgServers[1]['port'] = ''; // 填入连结 MySQL的port，不填则以预设的port进行连结 <br />$cfgServers[1]['adv_auth'] = true; // 改成true则进入phpMyAdmin必须先身份认证 <br />$cfgServers[1]['stduser'] = 'root'; // MySQL使用者的帐号 <br />$cfgServers[1]['stdpass'] = '密码'; // MySQL使用者的密码 <br />$cfgServers[1]['user'] = 'root'; // MySQL管理帐号 <br />$cfgServers[1]['password'] = '密码'; // MySQL管理密码 <br />$cfgServers[1]['only_db'] = ''; // 指定管理的资库名称，不填则可以管理整个Server <br />$cfgServers[1]['verbose'] = ''; // 指定MySQL的名称，不填则使用系统本身的hostname <br />: <br />: <br />require("chinese_gb.inc.php3"); //将语言改成中文<br />说明如下： <br />　(1)因本管理接口，可以以一个接口，管理多个MySQL Server，所以可以在config.inc.php3中找到 <br />　　$cfgServers[1]... <br />　　$cfgServers[1]... <br />　　$cfgServers[1]... <br />　　　： <br />　　$cfgServers[2]... <br />　　$cfgServers[2]... <br />　　$cfgServers[2]... <br />　　其中[1]代表第一个MySQL Server，[2]代表第二个MySQL Server，您要管理的MySQL Server超过三台以上，您可以依照同样的述，增加[4].....下去！<br />　　(2)若您的MySQL Server与http Server是同一台，则$cfgServers[1]['host'] =可直接填入localhost。<br />最后，打开流览器，输入 http://你的网址/phpMyAdmin 之后您会看到一个密码验证的小窗口，输入您的MySQL管理帐号及密码，即可成功地看到phpMyAdmin的管理画面。通过phpmyadmin，你就可以图形化的、方便的管理你的所有数据库了。<br /><br /><b>五．小结</b><br />　　通过以上的学习和操作，终于可以自由操作mysql数据库了，也可以轻车熟路的使用php或者asp调用mysql了。最后，笔者要特别感谢开发了mysql并且免费贡献的天才以及在网上提供mysql使用说明的大虾们。</font>
												</font>
										</span>
								</span>
						</span>
				</p>
		</div>
<img src ="http://www.blogjava.net/OpenCloseD/aggbug/69281.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/OpenCloseD/" target="_blank">开关</a> 2006-09-13 08:39 <a href="http://www.blogjava.net/OpenCloseD/archive/2006/09/13/69281.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>