﻿<?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>IT博客-WINDONE！第三块石头，相信自己能行，那你就一定能行！-随笔分类-数据库</title><link>http://www.cnitblog.com/windone0109/category/7085.html</link><description>交流！共享！
既然选择了远方，便只管风雨兼程。
软件测试有所长进！自动化测试正在尝试！白盒测试希望介入！
                                    
欢迎各位朋友和我联系。 联系方式: QQ：70566744 Email：windone0109@yahoo.com.cn </description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 17:20:41 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 17:20:41 GMT</pubDate><ttl>60</ttl><item><title>ADO.NET 连接数据库字符串(Oracle、SqlServer、Access、ODBC)</title><link>http://www.cnitblog.com/windone0109/archive/2008/06/16/45775.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Mon, 16 Jun 2008 02:26:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/06/16/45775.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/45775.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/06/16/45775.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/45775.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/45775.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: ADO.NET 连接数据库字符串(Oracle、SqlServer、Access、ODBC)<br>以下是连接实例：<br><br>ACCESS<br>string conStr=@"provider=microsoft.Jet.OleDb.4.0;data source=d:\\accessData.mdb;uid=sa;pwd=dd";<br><br>SQL SERVER<br>string conStr=@"Server=bwj;database=demo;uid=sa;pwd=";<br><br>ORACLE<br>string conStr=@"Provider=MSDAORA.1;Password=pwd;User ID=user_name;Data Source=link_str"<br>&nbsp;&nbsp;<a href='http://www.cnitblog.com/windone0109/archive/2008/06/16/45775.html'>阅读全文</a><img src ="http://www.cnitblog.com/windone0109/aggbug/45775.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-06-16 10:26 <a href="http://www.cnitblog.com/windone0109/archive/2008/06/16/45775.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux数据库热备份mysqlhotcopy</title><link>http://www.cnitblog.com/windone0109/archive/2008/05/09/43536.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Fri, 09 May 2008 03:19:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/05/09/43536.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/43536.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/05/09/43536.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/43536.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/43536.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Linux数据库热备份mysqlhotcopy&nbsp;&nbsp;<a href='http://www.cnitblog.com/windone0109/archive/2008/05/09/43536.html'>阅读全文</a><img src ="http://www.cnitblog.com/windone0109/aggbug/43536.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-05-09 11:19 <a href="http://www.cnitblog.com/windone0109/archive/2008/05/09/43536.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跨越SQL45个练习题(附答案)</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/29/43090.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Tue, 29 Apr 2008 09:19:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/29/43090.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/43090.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/29/43090.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/43090.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/43090.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。<br>41、查询“男”教师及其所上的课程。<br>42、查询最高分同学的Sno、Cno和Degree列。<br>43、查询和“李军”同性别的所有同学的Sname.<br>44、查询和“李军”同性别并同班的同学Sname.<br>45、查询所有选修“计算机导论”课程的“男”同学的成绩表&nbsp;&nbsp;<a href='http://www.cnitblog.com/windone0109/archive/2008/04/29/43090.html'>阅读全文</a><img src ="http://www.cnitblog.com/windone0109/aggbug/43090.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-29 17:19 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/29/43090.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跨越SQL45个练习题(附答案)</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/29/43091.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Tue, 29 Apr 2008 09:19:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/29/43091.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/43091.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/29/43091.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/43091.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/43091.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。<br>41、查询“男”教师及其所上的课程。<br>42、查询最高分同学的Sno、Cno和Degree列。<br>43、查询和“李军”同性别的所有同学的Sname.<br>44、查询和“李军”同性别并同班的同学Sname.<br>45、查询所有选修“计算机导论”课程的“男”同学的成绩表&nbsp;&nbsp;<a href='http://www.cnitblog.com/windone0109/archive/2008/04/29/43091.html'>阅读全文</a><img src ="http://www.cnitblog.com/windone0109/aggbug/43091.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-29 17:19 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/29/43091.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>跨越SQL45个练习题(附答案)</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/29/43089.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Tue, 29 Apr 2008 09:12:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/29/43089.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/43089.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/29/43089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/43089.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/43089.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 40、以班号和年龄从大到小的顺序查询Student表中的全部记录。<br>41、查询“男”教师及其所上的课程。<br>42、查询最高分同学的Sno、Cno和Degree列。<br>43、查询和“李军”同性别的所有同学的Sname.<br>44、查询和“李军”同性别并同班的同学Sname.<br>45、查询所有选修“计算机导论”课程的“男”同学的成绩表&nbsp;&nbsp;<a href='http://www.cnitblog.com/windone0109/archive/2008/04/29/43089.html'>阅读全文</a><img src ="http://www.cnitblog.com/windone0109/aggbug/43089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-29 17:12 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/29/43089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为项目写的触发器trigger on MySQL</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/23/42656.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Wed, 23 Apr 2008 09:04:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/23/42656.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/42656.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/23/42656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/42656.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/42656.html</trackback:ping><description><![CDATA[<br>项目要求能够重复利用编号值，编号值得范围是 1~65535。也就是，当自动分配的上限超过65535的时候，能够回过头来找那些已经不使用的编号值。有4张表需要重复利用编号值。<br>&nbsp;<br>思路是每张表都做一个 trigger before insert。每次取该表的最大编号+1。如果该编号已经超过65535。那么随机分配一个1~65535的编号，检查是否使用，如果已经有人使用，那么继续随机。尝试次数超过65535时，也就是不太可能再找到合适的编号时，随便插入一个最大编号。编号列有唯一索引，所以此时会出错退出事务。<br>&nbsp;<br>缺陷有几个：<br>1、随机寻找的编号可能分布不均匀，有可能还是有少数几个可以使用的编号，但是找不到。也就是查找编号的算法需要改进。<br>&nbsp;&nbsp;&nbsp; （比如遍历？比如分配的时候采用二分法分配，二分法查找？这样可以均匀分配编号，又可以快速查找）<br>2、出错的方式不优雅。当编号用满时，是通过唯一索引检查失败之后产生错误。MySQL不能从trigger 中抛出自定义的错误。<br>&nbsp;<br>PS：写完才发现二分法更好，看来算法基础不行。<br>&nbsp;<br>这次任务加深了对 MySQL trigger &amp; procedure的了解。拷贝代码做一个记录~~~<br>其中一张表的触发器代码：<br>create trigger SetPiUnderId BEFORE INSERT on t_play_item <br>for each ROW<br>&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DECLARE uid int;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare usedNum int;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare retry int;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; declare maxRetry int;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT max(pi_under_id)+1 into uid from t_play_item;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF uid = 0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set uid = 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF uid &lt; 65535 THEN <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- UPDATE t_play_item set pi_under_id = pi_id where pi_id = new.pi_id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set NEW.pi_under_id = uid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 否则开始生成随机数查询<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set maxRetry = 65530;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set retry = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; REPEAT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set uid = RAND() * 65530;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set usedNum = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 有几条记录使用这个编号<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select count(*) into usedNum from t_play_item where pi_under_id = uid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set retry = retry + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; until usedNum = 0 or retry &gt;= maxRetry <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end repeat;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF&nbsp; usedNum = 0 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- UPDATE t_play_item set pi_under_id = uid where pi_id = new.pi_id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set NEW.pi_under_id = uid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- 强制设置成id， 没有找到抛出错误的办法，<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set NEW.pi_under_id = uid;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- UPDATE t_play_item set pi_under_id = pi_id where pi_id = new.pi_id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -- UPDATE t_play_item set pi_under_id = 65535 where pi_id = new.pi_id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br>&nbsp;&nbsp;&nbsp; end<br>&nbsp;<br>&nbsp;<br>&nbsp;<br>用来测试的存储过程：<br>CREATE PROCEDURE TestSetPiUnderId(in times int, in showMsg bool)<br>&nbsp;&nbsp;&nbsp; MODIFIES SQL DATA<br>begin<br>&nbsp;&nbsp;&nbsp;&nbsp; declare t int;<br>&nbsp;&nbsp;&nbsp;&nbsp; set t = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp; REPEAT<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set t = t + 1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; insert into t_play_item(pi_style, pi_rect_no, pi_sent, pi_des) values(t, 1, 0, '');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IF showMsg then <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select CONCAT('插入成功第', CAST(t as char));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; end if;<br>&nbsp;&nbsp;&nbsp;&nbsp; until t&gt; times<br>&nbsp;&nbsp;&nbsp;&nbsp; end repeat;<br>end;<br><img src ="http://www.cnitblog.com/windone0109/aggbug/42656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-23 17:04 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/23/42656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SQL Key words(INNER JOIN, LEFT JOIN, RIGHT JOIN, UNION and more!)</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/08/42114.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Tue, 08 Apr 2008 01:36:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/08/42114.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/42114.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/08/42114.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/42114.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/42114.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">INNER JOIN--&gt;return all rows from both tables where there is a match.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">LEFT JOIN--&gt;Return all rows from the first table, return rows from the second table where there is a match.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">RIGHT JOIN--&gt;Return all rows from the second table,return rows from the first table where there is a match.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">UNION--&gt;Selected columns need to have the same data type: eg. Employee_USA and Employee_UK. Select two or more columns, but get only one column for the results. With UNION, only distinct values are selected. With UNION ALL,all values are selected.<br>eg. SELECT employee_name FROM employee_Norway<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UNION ALL<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT employee_name FROM employee_USA</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">ORDER BY--&gt;eg. ORDER BY company DESC --&gt;逆顺序<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ORDER BY name ASC --&gt;正顺序</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">IN--&gt;SELECT column_name FROM table_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE column_name IN (value1, value2,...)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">BETWEEN--&gt;Selects a range of data between two values, these values can be numbers, texts or dates.<br>SELECT column_name FROM table_name<br>WHERE column_name<br>BETWEEN value1 AND value2<br>eg. SELECT * FROM person WHERE lastname BETWEEN 'Hanson' and 'Peter'<br>The BETWEEN... AND operator is treated differently in different databases(involving including or excluding the test values), therefore it's important to check how the database treats "between and" operators. 所以如果你不确定的话，最好用 &gt;= 和 &lt;=.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">CREATE--&gt;创建 database:<br>&nbsp;&nbsp;&nbsp; CREATE DATABASE database_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建 table:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CREATE TABLE table_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column_name1 data_type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; column_name2 data_type,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ... <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; )<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建 index:&nbsp;&nbsp;&nbsp; CREATE INDEX index_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ON table_name (column_name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建 stored procedure:&nbsp;&nbsp;&nbsp; CREATE PROCEDURE procedure_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 创建 view:&nbsp;&nbsp;&nbsp; CREATE VIEW view_name AS<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SELECT column_name(s)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM table_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE condition</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial"><br>VIEW--&gt;a view is a virtual table based on the result-set of a select statement.You can add sql functions, WHERE and JOIN statements to a view and present the data as if the data were coming form a single table.The database does not store the view data, the database engine recreates the data each time.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">使用View 的例子：</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">SELECT&nbsp;&nbsp;&nbsp; DISTINCT<br>&nbsp; tabcount.NumberOfTabs,<br>&nbsp;&nbsp;&nbsp; rptform.FormID,<br>&nbsp;&nbsp;&nbsp; rptform.Forename,<br>&nbsp;&nbsp;&nbsp; rptform.IsPopUpFprm,<br>&nbsp;&nbsp;&nbsp; rpt.form.IsConfirmRequired,<br>&nbsp;&nbsp;&nbsp; ...<br>&nbsp;&nbsp;&nbsp; ...<br>FROM&nbsp;&nbsp;&nbsp; rptform<br>INNER JOIN&nbsp;&nbsp;&nbsp; login<br>ON&nbsp;&nbsp;&nbsp; rptform.LoginID=login.LoginID<br>INNER JOIN (SELECT <br>&nbsp;&nbsp;&nbsp;&nbsp; COUNT(rptform.RptFormTabID) AS NumberOfTabs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rptformtab.RptFormID<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM rptformtab<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GROUP BY rptformtab.RptFormID) tabcount<br>ON&nbsp;&nbsp;&nbsp; tabcount.RptFormID = rptform.RptFormID</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">SELECT DISTINCT--&gt;只选不重复的Rows.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DROP--&gt;drop index--&gt;SQL--&gt;delete an index<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DROP INDEX table_name.index_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;Oracle--&gt;delete an index<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DROP INDEX index_name</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;drop table--&gt;删除table--&gt;DROP TABLE table_name<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;drop database--&gt;删除databse--&gt;DROP DATABASE database_name</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">TRUNCATE--&gt;truncate table只删除table里面的data, table还在。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;TRUNCATE TABLE table_name</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">LEFT(SQL的)--&gt;LEFT (Character_expression, integer_expression)--&gt;returns 从左数的n个跟Character_expression长得一样的字符。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE的)--&gt;SUBSTR(Character_expression, 1 ,integer_expression)--&gt;从左边</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;SUBSTR(Character_expression, -1 ,integer_expression)--&gt;从右边</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">LEN(SQL的)--&gt;LEN(string_expression)--&gt; returns number of characters of the string.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE的)--&gt;LENHTH(String_Expression)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">PATINDEX(SQL的)--&gt;PATINDEX('%pattern%',expression)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (ORACLE的)--&gt;INSTR(String1,String2,[start_position],[appearence])--&gt;return the nth appearence of string2 in string1. eg. INSTR(string1, string2)--&gt;return the first appreance of string2 in string1.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DATE TIME CONVERTION</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp; SQL--&gt; CONVERT(datetime, '2050-12-31 00:00:00', 120)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; ORACLE--&gt;CONVERT('2050-12-31 00:00:00', 'YYYY-MM-DD HH:MI:SS')</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">GET RETURN CURRENT DATE</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp; SQL--&gt; GETDATE()</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; ORACLE--&gt;CURRENT_DATE</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DATE TIME OPERATION(例如时间倒退30秒)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp; SQL--&gt;DATEADD(SECOND, -30, @dShiftStartTIme)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; ORACLE--&gt;dShiftStartTime - 30/86400 --&gt;Oracle用的是一天，也就是如果 -1就是倒退一天</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; 1秒 = 1/86400</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; 1分钟 = 1/1440</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; 1小时 = 1/24</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">DATEDIFF</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; SQL--&gt;DATEDIFF('dd', '1999-01-01 00:00:00', '1999-12-20 00:00:00') </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --&gt;应该会return 353,因为有353天between这两天。</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; ORACLE--&gt;1999-12-20 00:00:00 - 1999-01-01 00:00:00</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">NULL(如果是NULL return something else)</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp; SQL--&gt;NULL(@ID,0) --&gt; Convert @ID to 0 如果@ID是NULL</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp; ORACLE--&gt;NVL(ID,0) --&gt; Convert ID to 0 如果ID是NULL</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">SELECT TOP N</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; SQL--&gt;&nbsp; SELECT TOP 1 rfToolCavityStatusID</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM lkTSTC</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; ORACLE--&gt; SELECT rfToolCavityStatusID</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FROM lkTSTC</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WHERE ROWNUM = 1</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">UPDATE eg.</p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp; UPDATE dbo.Users </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; SET </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sUsername = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#120;&#120;&#120;&#64;&#120;&#120;&#120;&#46;&#99;&#111;&#109;&#39;">xxx@xxx.com'</a> </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">&nbsp;&nbsp;&nbsp; WHERE </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">uiUserID = 'aaaaaaaaaaaaaa' <br>&nbsp;&nbsp;&nbsp; AND </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">sUsername = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#121;&#121;&#121;&#64;&#121;&#121;&#121;&#46;&#99;&#111;&#109;&#39;">'yyy@yyy.com'</a> </p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Arial">sContactEmailAddress = <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#39;&#120;&#120;&#120;&#64;&#120;&#120;&#120;&#46;&#99;&#111;&#109;&#39;">'xxx@xxx.com'</a>, </p><img src ="http://www.cnitblog.com/windone0109/aggbug/42114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-08 09:36 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/08/42114.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下mysql整个数据库的备份和还原</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/07/42056.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Mon, 07 Apr 2008 04:25:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/07/42056.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/42056.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/07/42056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/42056.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/42056.html</trackback:ping><description><![CDATA[<p><br>[root]# /usr/bin/mysqldump -h127.0.0.1 -uusername -ppassword databasename &gt;/opt/share/1/backup.sql</p>
<p>/usr/bin/mysqldump:用于执行的程序； <br>-h：主机名称 <br>-u：数据库用户 <br>-p：数据库密码 <br>databasename：数据库名称 <br>&gt;/opt/share/1/backup.sql：导出文件的保存名称 <br>以这样的方式导出的文件打开后发现里面有乱码，这个是正常的，是因为导出时没有设置字体的缘故，这个不影响数据库内容的备份和还原。<br></p>
<p><br>然后使用<br>[root]# /usr/bin/mysql -h127.0.0.1 -uusername -ppassword databasename2 &lt;/opt/share/1/backup.sql<br>导入数据到databasename2中<br><br>OK，完工！</p><img src ="http://www.cnitblog.com/windone0109/aggbug/42056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-07 12:25 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/07/42056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL 备份和恢复</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/07/42055.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Mon, 07 Apr 2008 03:45:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/07/42055.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/42055.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/07/42055.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/42055.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/42055.html</trackback:ping><description><![CDATA[<p>本文讨论 MySQL 的备份和恢复机制，以及如何维护数据表，包括最主要的两种表类型：<code>MyISAM</code> 和 <code>Innodb</code>，文中设计的 MySQL 版本为 5.0.22。</p>
<p>目前 MySQL 支持的免费备份工具有：<code>mysqldump、mysqlhotcopy</code>，还可以用 SQL 语法进行备份：<code>BACKUP TABLE</code> 或者 <code>SELECT INTO OUTFILE</code>，又或者备份<code>二进制日志（binlog）</code>，还可以是<code>直接拷贝数据文件和相关的配置文件</code>。MyISAM 表是保存成文件的形式，因此相对比较容易备份，上面提到的几种方法都可以使用。<code>Innodb</code> 所有的表都保存在同一个数据文件 <code>ibdata1</code> 中（也可能是多个文件，或者是独立的表空间文件），相对来说比较不好备份，免费的方案可以是<code>拷贝数据文件</code>、<code>备份 binlog</code>，或者用 <code>mysqldump</code>。</p>
<h3>1、mysqldump</h3>
<h4>1.1 备份</h4>
<p><code>mysqldump</code> 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。<br>现在来讲一下 <code>mysqldump</code> 的一些主要参数：</p>
<ul type=1>
    <li>--compatible=name
    <p>它告诉 mysqldump，导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 <code>ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options</code> 等，要使用几个值，用逗号将它们隔开。当然了，它并不保证能完全兼容，而是尽量兼容。 </p>
    <li>--complete-insert，-c
    <p>导出的数据采用包含字段名的完整 <code>INSERT</code> 方式，也就是把所有的值都写在一行。这么做能提高插入效率，但是可能会受到 <code>max_allowed_packet</code> 参数的影响而导致插入失败。因此，需要谨慎使用该参数，至少我不推荐。 </p>
    <li>--default-character-set=charset
    <p>指定导出数据时采用何种字符集，如果数据表不是采用默认的 <code>latin1</code> 字符集的话，那么导出时必须指定该选项，否则再次导入数据后将产生乱码问题。</p>
    <li>--disable-keys
    <p>告诉 <code>mysqldump</code> 在 <code>INSERT</code> 语句的开头和结尾增加 <code>/*!40000 ALTER TABLE table DISABLE KEYS */;</code> 和 <code>/*!40000 ALTER TABLE table ENABLE KEYS */;</code> 语句，这能大大提高插入语句的速度，因为它是在插入完所有数据后才重建索引的。该选项只适合 <code>MyISAM</code> 表。</p>
    <li>--extended-insert = true|false
    <p>默认情况下，<code>mysqldump</code> 开启 <code>--complete-insert</code> 模式，因此不想用它的的话，就使用本选项，设定它的值为 <code>false</code> 即可。 </p>
    <li>--hex-blob
    <p>使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 <code>BINARY、VARBINARY、BLOB</code>。</p>
    <li>--lock-all-tables，-x
    <p>在开始导出之前，提交请求锁定所有数据库中的所有表，以保证数据的一致性。这是一个全局读锁，并且自动关闭 <code>--single-transaction</code> 和 <code>--lock-tables</code> 选项。</p>
    <li>--lock-tables
    <p>它和 <code>--lock-all-tables</code> 类似，不过是锁定当前导出的数据表，而不是一下子锁定全部库下的表。本选项只适用于 <code>MyISAM</code> 表，如果是 <code>Innodb</code> 表可以用 <code>--single-transaction</code> 选项。</p>
    <li>--no-create-info，-t
    <p>只导出数据，而不添加 <code>CREATE TABLE</code> 语句。</p>
    <li>--no-data，-d
    <p>不导出任何数据，只导出数据库表结构。</p>
    <li>--opt
    <p>这只是一个快捷选项，等同于同时添加 <code>--add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset</code> 选项。本选项能让 <code>mysqldump</code> 很快的导出数据，并且导出的数据能很快导回。该选项默认开启，但可以用 <code>--skip-opt</code> 禁用。注意，如果运行 <code>mysqldump</code> 没有指定 <code>--quick</code> 或 <code>--opt</code> 选项，则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。</p>
    <li>--quick，-q
    <p>该选项在导出大表时很有用，它强制 <code>mysqldump</code> 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。</p>
    <li>--routines，-R
    <p>导出存储过程以及自定义函数。</p>
    <li>--single-transaction
    <p>该选项在导出数据之前提交一个 <code>BEGIN</code> SQL语句，<code>BEGIN</code> 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表，例如 <code>InnoDB</code> 和 <code>BDB</code>。<br>本选项和 <code>--lock-tables</code> 选项是互斥的，因为 <code>LOCK TABLES</code> 会使任何挂起的事务隐含提交。<br>要想导出大表的话，应结合使用 <code>--quick</code> 选项。 </p>
    <li>--triggers
    <p>同时导出触发器。该选项默认启用，用 <code>--skip-triggers</code> 禁用它。</p>
    </li>
</ul>
<p>其他参数详情请参考手册，我通常使用以下 SQL 来备份 <code>MyISAM</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>Innodb</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>另外，如果想要实现在线备份，还可以使用 <code>--master-data</code> 参数来实现，如下：</p>
<pre>/usr/local/mysql/bin/mysqldump -uyejr -pyejr \
--default-character-set=utf8 --opt --master-data=1 \
--single-transaction --flush-logs db_name &gt; db_name.sql
</pre>
<p>它只是在一开始的瞬间请求锁表，然后就刷新binlog了，而后在导出的文件中加入<code>CHANGE MASTER</code> 语句来指定当前备份的binlog位置，如果要把这个文件恢复到slave里去，就可以采用这种方法来做。 </p>
<h4>1.2 还原</h4>
<p>用 <code>mysqldump</code> 备份出来的文件是一个可以直接倒入的 SQL 脚本，有两种方法可以将数据导入。</p>
<ul type=1>
    <li>直接用 <code>mysql</code> 客户端
    <p>例如：</p>
    <pre>/usr/local/mysql/bin/mysql -uyejr -pyejr db_name &lt; db_name.sql
    </pre>
    <p>&nbsp;</p>
    <li>用 SOURCE 语法
    <p>其实这不是标准的 SQL 语法，而是 <code>mysql</code> 客户端提供的功能，例如：</p>
    <pre>SOURCE /tmp/db_name.sql;
    </pre>
    <p>这里需要指定文件的绝对路径，并且必须是 <code>mysqld</code> 运行用户(例如 nobody)有权限读取的文件。</p>
    </li>
</ul>
<h3>2、 mysqlhotcopy</h3>
<h4>2.1 备份</h4>
<p><code>mysqlhotcopy</code> 是一个 PERL 程序，最初由Tim Bunce编写。它使用 <code>LOCK TABLES、FLUSH TABLES</code> 和 <code>cp</code> 或 <code>scp</code> 来快速备份数据库。它是备份数据库或单个表的最快的途径，但它只能运行在数据库文件（包括数据表定义文件、数据文件、索引文件）所在的机器上。<code>mysqlhotcopy</code> 只能用于备份 <code>MyISAM</code>，并且只能运行在 <code>类Unix</code> 和 <code>NetWare</code> 系统上。</p>
<p><code>mysqlhotcopy</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>mysqlhotcopy</code> 的帮助：</p>
<pre>perldoc /usr/local/mysql/bin/mysqlhotcopy
</pre>
<p>注意，想要使用 <code>mysqlhotcopy</code>，必须要有 <code>SELECT、RELOAD(要执行 FLUSH TABLES)</code> 权限，并且还必须要能够有读取 <tt>datadir/db_name</tt> 目录的权限。 </p>
<h4>2.2 还原</h4>
<p><code>mysqlhotcopy</code> 备份出来的是整个数据库目录，使用时可以直接拷贝到 <code>mysqld</code> 指定的 <tt>datadir</tt> (在这里是 <tt>/usr/local/mysql/data/</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>&nbsp;</p>
<h3>3、 SQL 语法备份</h3>
<h4>3.1 备份</h4>
<p><code>BACKUP TABLE</code> 语法其实和 <code>mysqlhotcopy</code> 的工作原理差不多，都是锁表，然后拷贝数据文件。它能实现在线备份，但是效果不理想，因此不推荐使用。它只拷贝表结构文件和数据文件，不同时拷贝索引文件，因此恢复时比较慢。<br>例子：</p>
<pre>BACK TABLE tbl_name TO '/tmp/db_name/';
</pre>
<p>注意，必须要有 <code>FILE</code> 权限才能执行本SQL，并且目录 <tt>/tmp/db_name/</tt> 必须能被 <code>mysqld</code> 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。 </p>
<p><code>SELECT INTO OUTFILE</code> 则是把数据导出来成为普通的文本文件，可以自定义字段间隔的方式，方便处理这些数据。<br>例子：</p>
<pre>SELECT * INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
</pre>
<p>注意，必须要有 <code>FILE</code> 权限才能执行本SQL，并且文件 <tt>/tmp/db_name/tbl_name.txt</tt> 必须能被 <code>mysqld</code> 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。 </p>
<h4>3.2 恢复</h4>
<p>用 <code>BACKUP TABLE</code> 方法备份出来的文件，可以运行 <code>RESTORE TABLE</code> 语句来恢复数据表。<br>例子：</p>
<pre>RESTORE TABLE FROM '/tmp/db_name/';
</pre>
<p>权限要求类似上面所述。</p>
<p>用 <code>SELECT INTO OUTFILE</code> 方法备份出来的文件，可以运行 <code>LOAD DATA INFILE</code> 语句来恢复数据表。<br>例子：</p>
<pre>LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
</pre>
<p>权限要求类似上面所述。倒入数据之前，数据表要已经存在才行。如果担心数据会发生重复，可以增加 <code>REPLACE</code> 关键字来替换已有记录或者用 <code>IGNORE</code> 关键字来忽略他们。</p>
<h3>4、 启用二进制日志(binlog)</h3>
<p>采用 <code>binlog</code> 的方法相对来说更灵活，省心省力，而且还可以支持增量备份。</p>
<p>启用 <code>binlog</code> 时必须要重启 <code>mysqld</code>。首先，关闭 <code>mysqld</code>，打开 <code>my.cnf</code>，加入以下几行：</p>
<pre>server-id	= 1
log-bin		= binlog
log-bin-index	= binlog.index
</pre>
<p>然后启动 <code>mysqld</code> 就可以了。运行过程中会产生 <code>binlog.000001</code> 以及 <code>binlog.index</code>，前面的文件是 <code>mysqld</code> 记录所有对数据的更新操作，后面的文件则是所有 <code>binlog</code> 的索引，都不能轻易删除。关于 <code>binlog</code> 的信息请查看手册。</p>
<p>需要备份时，可以先执行一下 SQL 语句，让 <code>mysqld</code> 终止对当前 <code>binlog</code> 的写入，就可以把文件直接备份，这样的话就能达到增量备份的目的了：</p>
<pre>FLUSH LOGS;</pre>
<p>如果是备份复制系统中的从服务器，还应该备份 <tt>master.info</tt> 和 <tt>relay-log.info</tt> 文件。 </p>
<p>备份出来的 <code>binlog</code> 文件可以用 MySQL 提供的工具 <code>mysqlbinlog</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>mysqlbinlog</code> 输出的 SQL 语句直接作为输入来执行它。</p>
<p>如果你有空闲的机器，不妨采用这种方式来备份。由于作为 <code>slave</code> 的机器性能要求相对不是那么高，因此成本低，用低成本就能实现增量备份而且还能分担一部分数据查询压力，何乐而不为呢？</p>
<h3>5、 直接备份数据文件</h3>
<p>相较前几种方法，备份数据文件最为直接、快速、方便，缺点是基本上不能实现增量备份。为了保证数据的一致性，需要在靠背文件前，执行以下 SQL 语句：</p>
<pre>FLUSH TABLES WITH READ LOCK;</pre>
<p>也就是把内存中的数据都刷新到磁盘中，同时锁定数据表，以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单，直接拷贝回原来的数据库目录下即可。</p>
<p>注意，对于 <code>Innodb</code> 类型表来说，还需要备份其日志文件，即 <code>ib_logfile*</code> 文件。因为当 <code>Innodb</code> 表损坏时，就可以依靠这些日志文件来恢复。</p>
<h3>6、 备份策略</h3>
<p>对于中等级别业务量的系统来说，备份策略可以这么定：第一次全量备份，每天一次增量备份，每周再做一次全量备份，如此一直重复。而对于重要的且繁忙的系统来说，则可能需要每天一次全量备份，每小时一次增量备份，甚至更频繁。为了不影响线上业务，实现在线备份，并且能增量备份，最好的办法就是采用主从复制机制(<code>replication</code>)，在 <code>slave</code> 机器上做备份。</p>
<h3>7、 数据维护和灾难恢复</h3>
<p>作为一名DBA(我目前还不是，呵呵)，最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此，需要定期维护你的数据表。以下 SQL 语句就很有用：</p>
<pre>CHECK TABLE 或 REPAIR TABLE，检查或维护 MyISAM 表
OPTIMIZE TABLE，优化 MyISAM 表
ANALYZE TABLE，分析 MyISAM 表
</pre>
<p>当然了，上面这些命令起始都可以通过工具 <code>myisamchk</code> 来完成，在这里不作详述。</p>
<p><code>Innodb</code> 表则可以通过执行以下语句来整理碎片，提高索引速度：</p>
<pre>ALTER TABLE tbl_name ENGINE = Innodb;
</pre>
<p>这其实是一个 <code>NULL</code> 操作，表面上看什么也不做，实际上重新整理碎片了。</p>
<p>通常使用的 <code>MyISAM</code> 表可以用上面提到的恢复方法来完成。如果是索引坏了，可以用 <code>myisamchk</code> 工具来重建索引。而对于 <code>Innodb</code> 表来说，就没这么直接了，因为它把所有的表都保存在一个表空间了。不过 <code>Innodb</code> 有一个检查机制叫 <code>模糊检查点</code>，只要保存了日志文件，就能根据日志文件来修复错误。可以在 <tt>my.cnf</tt> 文件中，增加以下参数，让 <code>mysqld</code> 在启动时自动检查日志文件：</p>
<pre>innodb_force_recovery	= 4
</pre>
<p>关于该参数的信息请查看手册。</p>
<h3>8、 总结</h3>
<p>做好数据备份，定只好合适的备份策略，这是一个DBA所做事情的一小部分，万事开头难，就从现在开始吧！</p><img src ="http://www.cnitblog.com/windone0109/aggbug/42055.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-07 11:45 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/07/42055.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用mysql数据库的mysqldump实现自动备份</title><link>http://www.cnitblog.com/windone0109/archive/2008/04/07/42053.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Mon, 07 Apr 2008 03:41:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/04/07/42053.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/42053.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/04/07/42053.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/42053.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/42053.html</trackback:ping><description><![CDATA[<br><br>
<p align=left>使用mysql数据库的mysqldump工具，可以实现数据库的备份功能，如果在linux系统中配置好crontabs,就可以实现自动备份！</p>
<p><font color=#006400><font color=#a52a2a>#!/bin/bash</font><br></font>##配置原数据库连接信息，即正在使用需要备份数据库机器。<br><font color=#a52a2a>SOURCE_USER=-uroot</font><br>##如果就是在本机ip，即SOURCE_HOST=-h127.0.0.1<br><font color=#a52a2a>SOURCE_HOST=-h10.10.10.12<br>SOURCE_PASS=-padministrator</font></p>
<p>##配置备份数据库的连接信息，即用于备份的数据库机器<br><font color=#a52a2a>BAK_USER=-uroot<br></font>##用于备份的数据库机器ip<br><font color=#a52a2a>BAK_HOST=-h10.10.10.22<br>BAK_PASS=-padministrator</font></p>
<p>##从原数据库中导出数据库表的内容，并生成sql的文件，STATION为数据库名，username和files为表名<br><font color=#a52a2a>/var/mysql/bin/mysqldump --add-drop-table --opt $SOURCE_USER $SOURCE_HOST $SOURCE_PASS STATION username &gt;/tmp/username.sql<br>/var/mysql/bin/mysqldump --add-drop-table --opt $SOURCE_USER $SOURCE_HOST $SOURCE_PASS STATION files &gt;/tmp/files.sql</font></p>
<p>##导入到备份的数据库中<br><font color=#a52a2a>/var/mysql/bin/mysql $BAK_USER $BAK_HOST $BAK_PASS STATION &lt;/tmp/username.sql<br></tmp username.sql<br />/var/mysql/bin/mysql $BAK_USER $BAK_HOST $BAK_PASS STATION &lt;/tmp/files.sql</font><font color=#006400></tmp files.sql<font></p>
</font><br><img src ="http://www.cnitblog.com/windone0109/aggbug/42053.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-04-07 11:41 <a href="http://www.cnitblog.com/windone0109/archive/2008/04/07/42053.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下mysql的最常用的操作指令_创建用户、备份和还原数据库</title><link>http://www.cnitblog.com/windone0109/archive/2008/02/22/40035.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Fri, 22 Feb 2008 05:38:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/02/22/40035.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/40035.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/02/22/40035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/40035.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/40035.html</trackback:ping><description><![CDATA[<p>&nbsp;</p>
<p>1]如何创建mysqld数据库的管理用户？</p>
<p>数据库安装好后，我们应该为mysql数据库创建一个管理帐号。要把root用户设置为管理员，我们应该运行下面的命令；<br>[root@linuxsir01 root]# /opt/mysql/bin/mysqladmin -u root password 123456<br>[root@linuxsir01 root]#<br>通过上面的命令，我们可以知道，mysql数据库的管理员是root，密码是123456。</p>
<p><br>2]如何进入mysql数据库？以mysql数据库管理员root，密码为123456为例；</p>
<p>[root@linuxsir01 root]#/opt/mysql/bin/mysql -uroot -p123456<br>输出上面的命令后，出现的是如下的提示；<br>Welcome to the MySQL monitor. Commands end with ; or \g.<br>Your MySQL connection id is 6 to server version: 3.23.58<br>Type 'help;' or '\h' for help. Type '\c' to clear the buffer.<br>mysql&gt;<br>注意：操作这些命令的时候，应该把mysqld服务器打开。这些新手兄弟早就知道了吧</p>
<p><br>3]如何操作一个数据库呢，这个问题就比较多了，建议还是看一下mysql的手册吧。里面的东西太多了。如果操作一个数据库，首先是要指定一个数据库为当前数据库，应该用use命令</p>
<p>mysql&gt;use [数据库];<br>比如我想指定linux这个数据库为当前数据库，应该是<br>mysql&gt; use linux;<br>Database changed<br>mysql&gt;</p>
<p>&nbsp;</p>
<p>4]如何备份数据库？？</p>
<p>比如我们要备份mysql中已经存在的名为linux的数据库，要用到命令mysqldump<br>命令格式如下：<br>[root@linuxsir01 root]# /opt/mysql/bin/mysqldump -uroot -p linux &gt; /root/linux.sql<br>Enter password:在这里输入数据库的密码<br>通过上面的命令，我们要明白两件事，首先备份数据库是要以数据库管理员的身份备份；其次：备份目的地是/root，备份的文件名是linux.sql。其实备份的位置和文件名，根据自己的情况来定。文件名可以自己来取，路径也可以自己来安排；<br>比如我想把linux的数据库备份到/home/beinan，数据库的文件名为linuxsir031130.sql，所以应该输入如下的命令。<br>[root@linuxsir01 root]#/opt/mysql/bin/mysqldump -uroot -p linux &gt; /home/beinan/linuxsir031130.sql<br>Enter password:在这里输入数据库管理员root的数据库密码<br>这样我们到/home/beinan目录下就能发现mysql中名为linux的数据库的备份文件linuxsir031130.sql<br>综上所述，我们学习时要学会变通。</p>
<p>5]如何把把备份的数据库导入到数据库中？</p>
<p>首先我们还是要操作上面几个过程，比如添加数据库管理员(如果您没有添加过mysql数据库管理员的话)，创建数据库等。<br>比如我们要把在/home/beinan这个目录中的linuxsir031130.sql这个备份，导入名为linux的数据库中，应该如下操作；<br>[root@linuxsir01 root]# /opt/mysql/bin/mysql -uroot -p linux &lt; /home/beinan/linuxsir031130.sql<br>Enter password:在这里输入密码<br>如果机器好，数据库比较小，几分钟就好了。</p>
<p><br>6]对mysql数据库常用命令的一点补充；</p>
<p>几个常用的mysql相关的管理命令<br>mysql 命令：基本文本的，显示和使用的mysql数据库。前面已经简单的提过用法；比如登录等。<br>mysqladmin 命令，用来创建和维护mysql数据库的命令，前面已经简单的提过；<br>isamchk 是用来修复、检查和优化.ism后缀的数据库文件；<br>mysqldump 是用于备份数据库，前面已经简单的说明过；<br>myisamchk 用来修复.myi后缀的数据库文件；</p>
<p>比如我们要检查名为linux的数据库.myi数据库表是否存在问题，应该用下面的命令；</p>
<p>要把mysqld服务器停下来<br>[root@linuxsir01 root]# /opt/mysql/share/mysql.server stop</p>
<p>然后执行<br>[root@linuxsir01 root]# /opt/mysql/bin/myisamchk /opt/mysql/var/linux/*.MYI</p>
<p>上面的命令的意思就是检查所有的.myi文件，数据库的目录在/opt/mysql/var/linux/目录中</p>
<p>如果有问题，应该用-r参数来修复<br>[root@linuxsir01 root]# /opt/mysql/bin/myisamchk -r /opt/mysql/var/linux/*.MYI</p>
<p>7]mysqlshow 命令：显示用户选择的数据库和表<br>[root@linuxsir01 root]# /opt/mysql/bin/mysqlshow -uroot -p [数据库名]</p>
<p>比如我要查看名为linux的数据库；应该是：</p>
<p>[root@linuxsir01 root]# /opt/mysql/bin/mysqlshow -uroot -p linux<br></p><img src ="http://www.cnitblog.com/windone0109/aggbug/40035.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-02-22 13:38 <a href="http://www.cnitblog.com/windone0109/archive/2008/02/22/40035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>无法远程登入MySQL的几种解决办法</title><link>http://www.cnitblog.com/windone0109/archive/2008/02/22/40034.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Fri, 22 Feb 2008 05:33:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/02/22/40034.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/40034.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/02/22/40034.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/40034.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/40034.html</trackback:ping><description><![CDATA[<span class=t18>&nbsp;
<p>　　方法一：</p>
<p>　　尝试用MySQL Adminstrator GUI Tool登入MySQL Server，Server却回复错误讯息：Host '60-248-32-13.HINET-IP.hinet.net' is not allowed to connect to this</p>
<p>　　MySQL server</p>
<p>　　这个是因为权限的问题，处理方式如下：</p>
<p>　　shell&gt;mysql --user=root -p</p>
<p>　　输入密码</p>
<p>　　mysql&gt;use mysql</p>
<p>　　mysql&gt;GRANT SELECT,INSERT,UPDATE,DELETE ON [db_name].* TO [username]@[ipadd] identified by '[password]';</p>
<p>　　[username]:远程登入的使用者代码</p>
<p>　　[db_name]:表示欲开放给使用者的数据库称</p>
<p>　　[password]:远程登入的使用者密码</p>
<p>　　[ipadd]:IP地址或者IP反查后的DNS Name，此例的内容需填入'60-248-32-13.HINET-IP.hinet.net' ，包函上引号(')</p>
<p>　　(其实就是在远端服务器上执行，地址填写本地主机的ip地址。)</p>
<p>　　如果希望开放所有权限的话请执行：</p>
<p>　　mysql&gt;update user set select_priv='Y' , Insert_priv='Y', Update_priv='Y', delete_priv='Y', Create_priv='Y', Drop_priv='Y',Reload_priv='Y', shutdown_priv='Y', Process_priv='Y', File_priv='Y', Grant_priv='Y', references_priv='Y',Index_priv='Y', Alter_priv='Y', Show_db_priv='Y', Super_priv='Y',Create_tmp_table_priv='Y',Lock_tables_priv='Y', Execute_priv='Y',Repl_slave_priv='Y',Repl_client_priv='Y' where user='[username]';</p>
<p>　　方法二：</p>
<p>　　如何解决客户端与服务器端的连接(mysql) ：xxx.xxx.xxx.xxx is not allowed to connect to this mysql serv</p>
<p>　　1、进入mysql，创建一个新用户xuys：</p>
<p>　　格式：grant 权限 on 数据库名.表名 用户@登录主机 identified by "用户密码";</p>
<p>　　grant select,update,insert,delete on *.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#120;&#117;&#121;&#115;&#64;&#49;&#57;&#50;&#46;&#49;&#54;&#56;&#46;&#56;&#56;&#46;&#50;&#51;&#52;"><u><font color=#0000ff>xuys@192.168.88.234</font></u></a> identified by "xuys1234";</p>
<p>　　查看结果，执行：</p>
<p>　　use mysql;</p>
<p>　　select host,user,password from user;</p>
<p>　　可以看到在user表中已有刚才创建的xuys用户。host字段表示登录的主机，其值可以用IP，也可用主机名，</p>
<p>　　将host字段的值改为%就表示在任何客户端机器上能以xuys用户登录到mysql服务器，建议在开发时设为%。</p>
<p>3、./mysqld_safe --user-root &amp;</p>
<p>　　记住：对授权表的任何修改都需要重新reload，即执行第3步。</p>
<p>　　如果经过以上3个步骤还是无法从客户端连接，请执行以下操作，在mysql数据库的db表中插入一条记录：</p>
<p>　　use mysql;</p>
<p>　　insert into db values('192.168.88.234','%','xuys','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');</p>
<p>　　update db set host = '%' where user = 'xuys';</p>
<p>　　重复执行上面的第2、3步。</p>
<p>　　方法三：</p>
<p>　　附加fbysss解决phpMyAdmin连接远程用户的方法：</p>
<p>　　1.用root账户登录远程Mysql服务器，</p>
<p>　　grant select,update,insert,delete on *.* to <a href="&#109;&#97;&#105;&#108;&#116;&#111;&#58;&#115;&#115;&#115;&#64;&#49;&#57;&#50;&#46;&#49;&#54;&#56;&#46;&#48;&#46;&#49;&#49;&#52;"><u><font color=#0000ff>sss@192.168.0.114</font></u></a> identified by "sss";</p>
<p>　　update user set host = '%' where user = 'sss';</p>
<p>　　退出mysql,在shell下执行</p>
<p>　　#mysqladmin -u root -p [password] reload</p>
<p>　　#mysqladmin -u root -p [password] shutdown</p>
<p>　　#/etc/rc.d/init.d/mysqld start</p>
<p>　　2.修改phpMyAdmin目录下的config.inc.php文件，找到</p>
<p>　　$cfg['Servers'][$i]['host'] 修改为远程服务器地址</p>
<p>　　$cfg['Servers'][$i]['user'] 修改为sss</p>
<p>　　$cfg['Servers'][$i]['password']修改为sss的密码</p>
<p>　　要注意的是：grant all privilege并不能把&#8220;grant&#8221; 的权限赋给用户，如果要加，可以直接在mysql中使用use mysql;update user set Grant_priv ='Y'来达到要求。</p>
</span><!--正文内容结束--><img src ="http://www.cnitblog.com/windone0109/aggbug/40034.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-02-22 13:33 <a href="http://www.cnitblog.com/windone0109/archive/2008/02/22/40034.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Linux下安装mysql后无法启动的解决方法</title><link>http://www.cnitblog.com/windone0109/archive/2008/01/24/39287.html</link><dc:creator>windone</dc:creator><author>windone</author><pubDate>Thu, 24 Jan 2008 11:17:00 GMT</pubDate><guid>http://www.cnitblog.com/windone0109/archive/2008/01/24/39287.html</guid><wfw:comment>http://www.cnitblog.com/windone0109/comments/39287.html</wfw:comment><comments>http://www.cnitblog.com/windone0109/archive/2008/01/24/39287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/windone0109/comments/commentRss/39287.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/windone0109/services/trackbacks/39287.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在Linux下安装完mysql后，mysql服务无法启动，总是failer。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这个不是因为mysql安装失败，而是因为启动了SELinux。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;进入<span lang=EN-US style="FONT-SIZE: 10.5pt; FONT-FAMILY: Verdana; mso-fareast-font-family: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-bidi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">/etc/selinux/config，修改SELinux的配置文件，设置SELINUX = Disable。保存配置文件后reboot后，mysql可以正常启动了。</span></p><img src ="http://www.cnitblog.com/windone0109/aggbug/39287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/windone0109/" target="_blank">windone</a> 2008-01-24 19:17 <a href="http://www.cnitblog.com/windone0109/archive/2008/01/24/39287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>