﻿<?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-刘文涛-随笔分类-数据库 - mysql</title><link>http://www2.blogjava.net/liuwentao253/category/12142.html</link><description>I am a coder</description><language>zh-cn</language><lastBuildDate>Sun, 05 Aug 2007 06:29:46 GMT</lastBuildDate><pubDate>Sun, 05 Aug 2007 06:29:46 GMT</pubDate><ttl>60</ttl><item><title>MySQL 性能优化</title><link>http://www.blogjava.net/liuwentao253/archive/2006/08/09/62594.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Wed, 09 Aug 2006 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/08/09/62594.html</guid><description><![CDATA[
		<p>公司网站访问量越来越大，MySQL自然成为瓶颈，因此最近我一直在研究 MySQL 的优化，第一步自然想到的是 MySQL 系统参数的优化，作为一个访问量很大的网站（日20万人次以上）的数据库系统，不可能指望 MySQL 默认的系统参数能够让 MySQL运行得非常顺畅。 </p>
		<p>通过在网络上查找资料和自己的尝试，我认为以下系统参数是比较关键的： </p>
		<p>(1)、back_log： <br />要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。 <br />back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。 <br />当你观察你的主机进程列表，发现大量 264084 │ unauthenticated user │ xxx.xxx.xxx.xxx │ NULL │ Connect │ NULL │ login │ NULL 的待连接进程时，就要加大 back_log 的值了。默认数值是50，我把它改为500。 </p>
		<p>(2)、interactive_timeout： <br />服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800，我把它改为7200。 </p>
		<p>(3)、key_buffer_size： <br />索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小，增加它可得到更好处理的索引(对所有读和多重写)，到你能负担得起那样多。如果你使它太大，系统将开始换页并且真的变慢了。默认数值是8388600(8M)，我的MySQL主机有2GB内存，所以我把它改为402649088(400MB)。 </p>
		<p>(4)、max_connections： <br />允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加，否则，你将经常看到 Too many connections 错误。 默认数值是100，我把它改为1024 。 </p>
		<p>(5)、record_buffer： <br />每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描，你可能想要增加该值。默认数值是131072(128K)，我把它改为16773120 (16M) </p>
		<p>(6)、sort_buffer： <br />每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M)，我把它改为 16777208 (16M)。 </p>
		<p>(7)、table_cache： <br />为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64，我把它改为512。 </p>
		<p>(8)、thread_cache_size： <br />可以复用的保存在中的线程的数量。如果有，新的线程从缓存中取得，当断开连接的时候如果有空间，客户的线置在缓存中。如果有很多新的线程，为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量，可以看到这个变量的作用。我把它设置为 80。 </p>
		<p>(10)、wait_timeout： <br />服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800，我把它改为7200。 </p>
		<p>注：参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作，上面的结果也仅仅是我的一些看法，你可以根据你自己主机的硬件情况（特别是内存大小）进一步修改。<br /></p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/62594.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-08-09 16:21 <a href="http://www.blogjava.net/liuwentao253/archive/2006/08/09/62594.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysqldump工具有大量的选项</title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/15/53047.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Thu, 15 Jun 2006 09:56:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/15/53047.html</guid><description><![CDATA[
		<p>--add-drop-table </p>
		<p>这个选项将会在每一个表的前面加上DROP TABLE IF EXISTS语句，这样可以保证导回MySQL数据库的时候不会出错，因为每次导回的时候，都会首先检查表是否存在，存在就删除 </p>
		<p>--add-locks </p>
		<p>这个选项会在INSERT语句中捆上一个LOCK TABLE和UNLOCK TABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作 　　　</p>
		<p>　-c or - complete_insert </p>
		<p>这个选项使得mysqldump命令给每一个产生INSERT语句加上列（field）的名字。当把数据导出导另外一个数据库时这个选项很有用。 </p>
		<p>--delayed-insert 在INSERT命令中加入DELAY选项 </p>
		<p>-F or -flush-logs 使用这个选项，在执行导出之前将会刷新MySQL服务器的log. </p>
		<p>-f or -force 使用这个选项，即使有错误发生，仍然继续导出 </p>
		<p>--full 这个选项把附加信息也加到CREATE TABLE的语句中 </p>
		<p>-l or -lock-tables 使用这个选项，导出表的时候服务器将会给表加锁。 </p>
		<p>-t or -no-create- info </p>
		<p>这个选项使的mysqldump命令不创建CREATE TABLE语句，这个选项在您只需要数据而不需要DDL（数据库定义语句）时很方便。 　　　　-d or -no-data 这个选项使的mysqldump命令不创建INSERT语句。 </p>
		<p>在您只需要DDL语句时，可以使用这个选项。 </p>
		<p>--opt 此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。 </p>
		<p>-q or -quick 这个选项使得MySQL不会把整个导出的内容读入内存再执行导出，而是在读到的时候就写入导文件中。 </p>
		<p>-T path or -tab = path 这个选项将会创建两个文件，一个文件包含DDL语句或者表创建语句，另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在，并且命令的使用者有对文件的特权。 　　　　-w "WHERE Clause" or -where = "Where clause " </p>
		<p>如前面所讲的，您可以使用这一选项来过筛选将要放到 导出文件的数据。 　　　　假定您需要为一个表单中要用到的帐号建立一个文件，经理要看今年（2004年）所有的订单（Orders），它们并不对DDL感兴趣，并且需要文件有逗号分隔，因为这样就很容易导入到Excel中。 为了完成这个人物，您可以使用下面的句子： </p>
		<p>bin/mysqldump –p –where "Order_Date &gt;='2000-01-01'" 　　–tab = /home/mark –no-create-info –fields-terminated-by=, Meet_A_Geek Orders </p>
		<p>这将会得到您想要的结果。 　　　　schema：模式 </p>
		<p>The set of statements, expressed in data definition language, that completely describe the structure of a data base. </p>
		<p>一组以数据定义语言来表达的语句集,该语句集完整地描述了数据库的结构。 　　　　SELECT INTO OUTFILE ： </p>
		<p>如果您觉得mysqldump工具不够酷，就使用SELECT INTO OUTFILE吧, MySQL同样提供一个跟LOAD DATA INFILE命令有相反作用的命令，这就是SELECT INTO OUTFILE 命令，这两个命令有很多的相似之处。首先，它们有所有的选项几乎相同。现在您需要完成前面用mysqldump完成的功能，可以依照下面的步骤进行操作： 　　　　1. 确保mysqld进程（服务）已经在运行 </p>
		<p>2. cd /usr/local/mysql </p>
		<p>3. bin/mysqladmin ping ；// 如果这个句子通不过，可以用这个：mysqladmin -u root -p ping </p>
		<p>mysqladmin ping用于检测mysqld的状态，is alive说明正在运行，出错则可能需要用户名和密码。 </p>
		<p>4. 启动MySQL 监听程序. </p>
		<p>5. bin/mysql –p Meet_A_Geek；// 进入mysql命令行，并且打开数据库Meet_A_Geek,需要输入密码 </p>
		<p>6. 在命令行中，输入一下命令: </p>
		<p>SELECT * INTO OUTFILE '/home/mark/Orders.txt' 　　FIELDS 　　TERMINATED BY = ',' 　　FROM Orders 　　WHERE Order_Date &gt;= '2000-01-01' 　　　　在你按了Return（回车）之后，文件就创建了。这个句子就像一个规则的SELECT语句，只是把想屏幕的输出重定向到了文件中。这意味这您可以使用JOIN来实现多表的高级查询。这个特点也可以被用作一个报表产生器。 　　　　比方说，您可以组合这一章中讨论的方法来产生一个非常有趣的查询，试试这个： 　　　　在mysql目录建立一个名为Report_G.rpt 的文本文件，加入下面的行： </p>
		<p>USE Meet_A_Geek; 　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name) 　　VALUES (NULL, "Kinnard", "Vicky"); 　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name) 　　VALUES (NULL, "Kinnard", "Steven"); 　　INSERT INTO Customers (Customer_ID, Last_Name, First_Name) 　　VALUES (NULL, "Brown", "Sam"); 　　SELECT Last_Name INTO OUTFILE '/home/mark/Report.rpt' 　　FROM Customers WHERE Customer_ID &gt; 1; </p>
		<p>然后确认 mysql进程在运行，并且您在mysql目录中， 输入下面的命令： </p>
		<p>bin/mysql &lt; Report_G.rpt检查您命名作为输出的文件，这个文件将会包含所有您在Customers表中输入的顾客的姓。 如您所见，您可以使用今天学到的导入/导出（import/export）的方法来帮助得到报表。 </p>
		<p> </p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/53047.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-15 17:56 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/15/53047.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL5 入门知识</title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/13/52544.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Tue, 13 Jun 2006 10:21:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/13/52544.html</guid><description><![CDATA[
		<p>一、        关于MySQL5<br />MySQL5系列数据库是MySQL的最新版本的数据库，比较流行的发行版是<font color="#0000ff"><strong>mysql-5.0.18</strong></font>。MySQL        英文官方网站是<a href="http://www.mysql.com/">http://www.mysql.com</a></p>
		<p>二、        获得MySQL5<br />所有的关于MySQL数据库的程序，都可以在它的英文官方网站下载到，但是，鉴于不不是所有人的英文都很好，所以建议大家尽量区MySQL的中文官方网站下载自己所需的程序，如果找不到，再去找英文的网站。<br />MySQL5有<font color="#0000ff"><u>安装版</u></font>和<font color="#0000ff"><u>免安装版</u></font>之分，顾名思义，安装版就是需要安装以后才可以使用；免安装版的MySQL下载下来之后就可以使用，或者进行简单的设置就可以使用。<br />MySQL5安装版下载地址：<br /><font color="#0000ff"><strong>Windows版本</strong></font>：<a href="http://download.mysql.cn/src/2006/0218/199.html">http://download.mysql.cn/src/2006/0218/199.html</a><br />Linux版本（<font color="#0000ff"><u>源码包</u></font>）：<a href="http://download.mysql.cn/src/2006/0208/62.html">http://download.mysql.cn/src/2006/0208/62.html</a><br />MySQL5免安装版下载地址：<br />Windows版本：<a href="http://download.mysql.cn/src/2006/0302/205.html">http://download.mysql.cn/src/2006/0302/205.html</a></p>
		<p>三、        MySQL5安装<br />Windows版安装手册：<a href="http://bbs.mysql.cn/thread-261-1-1.html">http://bbs.mysql.cn/thread-261-1-1.html</a><br />Linux版本（源码包）安装手册：<a href="http://bbs.mysql.cn/thread-493-1-2.html">http://bbs.mysql.cn/thread-493-1-2.html</a><br />Windows免安装版本使用手册：<a href="http://bbs.mysql.cn/thread-552-1-1.html">http://bbs.mysql.cn/thread-552-1-1.html</a></p>
		<p>四、        备份与恢复<br />常规备份命令是<font color="#0000ff"><strong>mysqldump</strong></font>,这里以tm数据库为例，做简单介绍，详细资料参考<br /><a href="http://info.mysql.cn/install/2006/0410/5521.html">http://info.mysql.cn/install/2006/0410/5521.html</a><br />备份：<br /><font color="#ff0000"><strong>#mysqldump -u root -p tm &gt; tm_20060101.sql</strong></font>  <br />按提示输入密码，这就把tm数据库所有的表结构和数据备份到tm_20060101.sql了，因为要总进行备份工作，如果数据量大会占用很大空间，这是可以利用gzip压缩数据，命令如下：<br />#mysqldump -u root -p tm | gzip &gt; tm_20060101.sql.gz<br />还可以备份到远程机器，用-h制定，如<br /><font color="#ff0000"><strong>#mysqldump -u root -p tm &gt; tm_20060101.sql -h xxx.xxx.xxx.xxx</strong></font><br />可以直接备份到IP地址为xxx.xxx.xxx.xxx的远程计算机。<br />系统崩溃，重建系统，或恢复数据库时，可以这样恢复数据：<br /><font color="#ff0000"><strong>#mysql -u root -p tm &lt; tm_20060101.sql<br /></strong></font>从压缩文件直接恢复：<br />#gunzip &lt; tm_20060101.sql.gz | mysql -u root -p tm</p>
		<p>五、        FAQ<br />Q：为什么我使用mysql出现乱码？<br />A：安<font color="#0000ff"><strong>装mysql5时默认的字符集是瑞典编码latin1</strong></font>，不支持中文。并且出现乱码的原因很多，建议到bbs.mysql.cn论坛寻找答案。发贴的话请详细说明自己的环境、安装过程及使用的信息，以便大家能快速分析你的问题。</p>
		<p>Q：能中文数据库名称么？<br />A：可以，但是不推荐，用起来不方便。</p>
		<p>Q：如果我忘记了root密码，怎么办？<br />A：在windows下：<br />打开命令行窗口，停止mysql服务：        Net stop mysql<br />启动mysql，一般到mysql的安装路径，找到 mysqld-nt.exe<br />执行：mysqld-nt --skip-grant-tables<br />另外打开一个命令行窗口，执行mysql<br />&gt;use mysql<br />&gt;update user set password=password("new_pass") where user="root";<br />&gt;flush privileges;<br />&gt;exit<br />用Ctrl+Alt+Del，找到mysqld-nt的进程杀掉它，在重新启动mysql-nt服务，就可以用新密码登录了</p>
		<p> </p>
<img src ="http://www.blogjava.net/liuwentao253/aggbug/52544.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-13 18:21 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/13/52544.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle釜底抽薪，打击MySQL！ </title><link>http://www.blogjava.net/liuwentao253/archive/2006/06/04/50212.html</link><dc:creator>刘文涛</dc:creator><author>刘文涛</author><pubDate>Sun, 04 Jun 2006 01:35:00 GMT</pubDate><guid>http://www.blogjava.net/liuwentao253/archive/2006/06/04/50212.html</guid><description><![CDATA[<span class=postbody>Oracle收购了Innobase公司。Innobase公司的产品<font color=#0000ff><strong>innodb</strong></font>是MySQL的嵌入式数据库引擎，给MySQL提供了：<br><br>事务功能，<br>行级锁定，<br>外键约束和高负载能力，<br>并且最新的innodb还提供了分布式事务协调的能力，<br>此外innodb还支持在裸设备上面创建表空间。<br><br>可以说，如果没有innodb，MySQL只能小打小闹，根本不可能进入企业的关键应用，正是innodb提供的诸多数据库关键特性，从而保证了MySQL也可以被应用在对数据、对并发负载，对事务要求比较高的关键中。 <br><br>Yahoo，slatshot都是使用MySQL Innodb。<font color=#0000ff><strong>JavaEye在没有使用innodb的时候（MyISAM），只要在线人数超过100人，数据库经常无法连接，表锁定现象时有发生，自从改为innodb，这些问题全部解决</strong></font>。 <br><br>也许是有感于MySQL的竞争压力，Oracle玩了一招釜底抽薪，收购了innobase，这样，MySQL通往关键数据库应用之路已经被Oracle握在手里。Oracle官方的说法是：</span> <span class=postbody>但是MySQL已经感觉到了背后的一丝丝寒意：</span> <span class=postbody><br>Oracle假惺惺的说期望谈判，发展伙伴关系。而MySQL强调innodb是GPL的，我有权自己随便改，GPL保证了我们客户的利益。 <br><br>个人认为，Oracle这一招重重打击了MySQL，使得很多MySQL的高端用户不得不转而考虑使用Oracle数据库。Oracle什么都不用做，只要停止innodb的继续开发，MySQL现有的那么多使用innodb的客户都将蒙受损失。 <br><br>在MySQL5.0正式版即将发布之时，MySQL即将具备视图，触发器，存储过程和分布式事务协调器等关键功能之时，Oracle玩了一个阴招，掐住了MySQL的脖子。<br><br>－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－－<br><span class=postbody>基于版本控制（multi virsion concurrent control，mvcc）的<font color=#0000ff><strong>并发处理机制</strong></font>在interbase/ifrebird，oracle，postgre以及db2的最新版本中得到了应用，效果很不错。 <br><br>似乎只有mssql基于lock实现并发处理，lock多了就只好借助timeout来处理死锁。 <br><br>mvcc 读写不冲突，lock资源消耗少。2种风格的数据库使用风格也不同。适用mvcc的应用不一定适合lock；反过来也一样。 <br><br>mysql有统一的前端，后端可以选择lock的<font color=#0000ff><strong>myisam</strong></font>以及mvcc的<font color=#0000ff><strong>innodb</strong></font>来处理不同的应用。（还支持其他的格式。。。） <br><br>btw，<font color=#0000ff><strong>innodb可以free的用，但innodb的back up以及恢复工具需要￥。</strong></font></span></span> 
<img src ="http://www.blogjava.net/liuwentao253/aggbug/50212.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwentao253/" target="_blank">刘文涛</a> 2006-06-04 09:35 <a href="http://www.blogjava.net/liuwentao253/archive/2006/06/04/50212.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>