背景:如一个IP列表,需要找出这个列表里的重复行重复了多少次,怎么弄?Linux下sort和uniq功能很强大,如按某列排序,如删除重复行,进行统计重复,还可以有更多的功能在:http://jackxiang.com/post/3508/。

不统计台数只去重,用这个:



如果要查出大于两次的统计,这个一次的出不来,容易漏掉,所以还是用上面这个:



uniq [file]
但如果一文本中有重复却不相邻的行则无法删除,需要结合sort命令:
sort [file]|uniq
等效的sort命令是:
sort -u [file]
=========================================
去重复后统计:
sort needsort.txt |uniq |wc

原来的行数:
sort needsort.txt |uniq |wc

重复行和重复多少次:
sort needsort.txt |uniq -c -d

阅读全文
c版的curl_multi为php扩展准备

#include <stdio.h>
#include <string.h>
/* somewhat unix-specific */
#include <sys/time.h>
#include <unistd.h>
/* curl stuff */
#include <curl/curl.h>
/*
* Simply download two HTTP files!
*/
int main(int argc, char **argv)
   {  
     CURL *http_handle;
     CURL *http_handle2;
     CURLM *multi_handle;
     int still_running; /* keep number of running handles */
     http_handle = curl_easy_init();
     http_handle2 = curl_easy_init();
    /* set options */
     curl_easy_setopt(http_handle, CURLOPT_URL, "http://www.sohu.com/");
    /* set options */
    curl_easy_setopt(http_handle2, CURLOPT_URL, "http://www.sina.com.cn/");
     /* init a multi stack */
     multi_handle = curl_multi_init();
    /* add the individual transfers */
     curl_multi_add_handle(multi_handle, http_handle);
     curl_multi_add_handle(multi_handle, http_handle2);
     /* we start some action by calling perform right away */
    while(CURLM_CALL_MULTI_PERFORM == curl_multi_perform(multi_handle, &still_running));
           while(still_running) {
                struct timeval timeout;
                int rc; /* select() return code */
                fd_set fdread;
                fd_set fdwrite;
                fd_set fdexcep;
                int maxfd;
                 FD_ZERO(&fdread);
                FD_ZERO(&fdwrite);
                FD_ZERO(&fdexcep);
                /* set a suitable timeout to play around with */
                timeout.tv_sec = 1;
                timeout.tv_usec = 0;
                /* get file descriptors from the transfers */

              curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd);
            /* In a real-world program you OF COURSE check the return code of the
              function calls, *and* you make sure that maxfd is bigger than -1 so
             that the call to select() below makes sense! */
                rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout);
                switch(rc) {
                            case -1:
                            /* select error */
                            break;
                            case 0:
                            default:
                           /* timeout or readable/writable sockets */
                            while(CURLM_CALL_MULTI_PERFORM ==curl_multi_perform(multi_handle, &still_running));
                            break;
                           }
           }
    curl_multi_cleanup(multi_handle);
    curl_easy_cleanup(http_handle);
    curl_easy_cleanup(http_handle2);
    return 0;
    }


编译的时候会报错


gcc curl_mult.cpp -o aa -lcurl


需要加上


gcc curl_mult.cpp -o aa -lcurl -lstdc++


来源:http://hi.baidu.com/lostdays/blog/item/e5f88a22270e61fad7cae2d0.html
阅读全文
再来看PHP的两种执行方式:ISAPI和FastCGI。
    ISAPI执行方式是以DLL动态库的形式使用,可以在被用户请求后执行,在处理完一个用户请求后不会马上消失,所以需要进行线程安全检查,这样来提高程序的执行效率,所以如果是以ISAPI来执行PHP,建议选择Thread Safe版本;
    而FastCGI执行方式是以单一线程来执行操作,所以不需要进行线程的安全检查,除去线程安全检查的防护反而可以提高执行效率,所以,如果是以FastCGI来执行PHP,建议选择Non Thread Safe版本。


php.ini-development  开发使用的配置文件

php.ini-production   标准的生产环境的配置
阅读全文

show tables like "%Tbl_User%";

show create table from DB like '%User%';
阅读全文

mmap详解

WEB2.0 jackxiang 2010-10-21 15:05

mmap函数是unix/linux下的系统调用,来看《Unix Netword programming》卷二12.2节有详细介绍。
mmap系统调用并不是完全为了用于共享内存而设计的。它本身提供了不同于一般对普通文件的访问方式,进程可以像读写内存一样对普通文件的操作。而Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。
          mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问普通内存一样对文件进行访问,不必再调用read(),write()等操作。mmap并不分配空间, 只是将文件映射到调用进程的地址空间里, 然后你就可以用memcpy等操作写文件, 而不用write()了.写完后用msync()同步一下, 你所写的内容就保存到文件里了. 不过这种方式没办法增加文件的长度, 因为要映射的长度在调用mmap()的时候就决定了.

简单说就是把一个文件的内容在内存里面做一个映像,内存比磁盘快些。
基本上它是把一个档案对应到你的virtual memory 中的一段,并传回一个指针。

以后对这段 memory 做存取时,其实就是对那个档做存取。
它就是一种快速 file I/O 的东东,而且使用上和存取 memory 一样方便,只不过会占掉你的 virutal memory。
#include <sys/types.h>
#include <sys/stat.h> //文件状态结构
#include <unistd.h>
#include <sys/mman.h> //mmap头文件

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

mmap开启记忆体对映。
start指定记忆体位置,通常都是用NULL。offset指定档案要在那里开始对映,通常都是用0。

int munmap(void *start, size_t length);

int msync(const void *start, size_t length, int flags);
如果开启记忆体对映是希望写入档案中,那麽修改过的记忆体会在一段时间内与档案稍稍有点不同。如果您希望立即将资料写入档案中,可使用msync。

start为记忆体开始位置,length为长度。

flags则有三个:
MS_ASYNC : 请Kernel快将资料写入。
MS_SYNC : 在msync结束返回前,将资料写入。
MS_INVALIDATE : 让核心自行决定是否写入,仅在特殊状况下使用

例子:
if( (fp = open("./data.bin",O_RDONLY) ) < 0 )
{
cout<<" Can not open !"<<endl;
exit(0);
}
if( (fstat(fp,&stat_data) ) < 0 )
{
cout<<" fstat error !";
exit(0);
}
if( ( start_fp = mmap(NULL,stat_data.st_size,
PROT_READ,MAP_SHARED,fd_denseindex,0 )) == (void *)-1)
{
cout<<" mmap error !"<<endl;
exit(0);
}
这样便能从start_fp开始读取数据啦!
来源:http://hi.baidu.com/yoursguang/blog/item/81f77f387720022296ddd814.html
Linux中/proc目录下文件详解阅读全文
想要在echo语句中使用$(( ))来计算i+1的值的写法,注意是两个点,不是三个点:


for i in 输出连续IP和PingN次的一行脚本写法:




倒序-1输出:



一)shell for循环打印1到100的数字:
for i in {1..100} ;do time curl http://mp.i*v.XX.com/; done


二)解决shell脚本for i in {0..10}输出{0..10}的问题:


输出的却是{0..10}就这么一个字符串。
解决方案:
你执行这段文件用的不是bash,  是debian自己实现的dash(debian系的/bin/sh默认指向/bin/dash)
你可以直接
/bin/bash  example.sh
或者让sha-bang生效
chmod +x example.sh
./example.sh
参考:https://www.oschina.net/question/1047640_156390
https://www.cnblogs.com/xxiong1031/articles/6884381.html
用/bin/sh是不行的,得用/bin/bash,而 FreeBSD里位置不一样,但也行:
/home/irdcops/shell/forinport.jackxiang.com/forinportredis.sh

#./forinportredis.sh    
mkdir /data/redis/6379
mkdir /data/redis/6380
mkdir /data/redis/6381
mkdir /data/redis/6382
mkdir /data/redis/6383
mkdir /data/redis/6384
mkdir /data/redis/6385
chown -R redis /data/redis/6379
chown -R redis /data/redis/6380
chown -R redis /data/redis/6381
chown -R redis /data/redis/6382
chown -R redis /data/redis/6383
chown -R redis /data/redis/6384
chown -R redis /data/redis/6385
/sbin/chkconfig --add redis
/sbin/chkconfig --add redis6380
/sbin/chkconfig --add redis6381
/sbin/chkconfig --add redis6382
/sbin/chkconfig --add redis6383
/sbin/chkconfig --add redis6384
/sbin/chkconfig --add redis6385
/sbin/chkconfig redis on
/sbin/chkconfig redis6380 on
/sbin/chkconfig redis6381 on
/sbin/chkconfig redis6382 on
/sbin/chkconfig redis6383 on
/sbin/chkconfig redis6384 on
/sbin/chkconfig redis6385 on

source ~/.bashrc
alias cforinport='cd /home/irdcops/shell/forinport.jackxiang.com'

三)用cat和awk输出行号:
最简单的用:nl ,nl命令可以用来给文件添加行号,然后再通过重定向将结果保存到一个新的文件中:
在nl命令中,默认情况下,行号与正文行之间是通过制表符(tab)进行分隔的。
在nl命令中使用-s选项来指定行号与正文行之间的分隔符。例如,如果你想要使用空格作为分隔符,可以这样使用:
通过-s选项,我们将分隔符从默认的制表符更改为了空格:   nl -s' ' input.txt

1package main

2import (
3  "flag"
4  "os

cat用 cat -n xxx.txt,就能输出行号。
AWK打印行号的实现:
cat /etc/resolv.conf|awk '{print NR $0}'
cat /etc/resolv.conf|awk 'BEGIN{i=1}{print i$0;i++}'
awk给shell赋值:
#!/bin/sh
var=$(awk '{print $1}' tmp.txt)
echo $var
注意:var= 后面没有空格;
注意下面: i=$(($i+1)),和awk一样的赋值方式!


i=1
while(( $i<100 ))
do
echo $i
i=$(($i+1))
done


AWK的NR用法,打印0-->999的行号,注意:NR-1了,否则是:1--》1000:
cat anta_Tbl_User.txt |awk '{print $0NR-1" "$0NR-1}'  > anta_Tbl_User_**.sql


for 2:

for i in `seq 100`
do
if((i%3==0))
then
echo $i
continue
fi
done


for 3:
for(( i=1;i<100;i++ ))
do
if((i%3==0))
then
echo $i
continue
fi
done


输出行号:
  1、免费,是世界上最贵的东西。

  免费是个很诱人的东西,最显着的例子就是马云和马化腾。看看开始,QQ和淘宝就知道了:先让你不花钱也能感到比花了钱还爽,不花钱就能开店。当我们恍然大悟的时候--你已经离不开它,你身边的所有人都在用QQ,从七岁到七十岁,无一例外。再看看淘宝:从BB到古稀老人都热充网上购物,最热门的话题就是--相约于淘宝。淘宝现在是值钱的“旺铺”。

  2、要假设你融不到一分钱的情况去做事业。

  什么叫没钱?不是说你吃饭都没钱,如果真是那样,还不如去领取救济金的实在。如果你创业只想融资,那就也要假设一个融不到资的情况,毕竟你身边的的兄弟都以你的马首是瞻,你自己爬不好摔死了是你活该,但是砸死一堆兄弟就是你不对了。融资的途径很多,但能融到资的毕竟不多。不要眼高手低,踏实做事的人才有收获。

  3、花时间去学习别人成功的经验,也花时间去学习别人失败的经验

  看了《赢再中国》这节目收获很多,很多精彩的评论的。我认为,等你什么时候能看别人惨败的经验,看得一身冷汗,你就离成功不远了。如今反映成功的例子和书越来越多,创业者也读到了。非常期待马云的《阿里巴巴的10001个错误》,肯定是惊世之作!

  4、营销最佳的语言是自己的语言,而不是套用别人的话

  能打动用户的,只有你自己最真实的东西。套话谁都在说,特别是名言,大家都套用,你说的不烦人家听的都烦了,营销需要的是一个人,一个聪明的人,而不是一台的复读机。

  5、每个创业者都要有使命感,但必须要有能做到的使命感!

  很多人认为使命感是大企业的事情,甚至可有可无,这是非常错误的思想。很多世界大企业都拥有强烈的使命感,我没要向别人学习,但就不能张口说大话,这样会让人觉得你浮夸,不实际。

  6、最优秀的创业一定是简单的!优秀的公司一定是简单的!

  很多创业者认为成功要走多元化业务,其实最优秀的公司是最简单的。

  这里的简单并不是指平凡,而是代表:专注。最优秀的创业者,世界最优秀的公司一直只做一件事。

  7、如果你的公司目前只有两个人,你就在名片上把自己的称呼放低一点儿,这样会赢得尊重!

  很多刚创业者,明明只有个人,非得告诉说人是CEO,这是COO,这是CFO,身兼数职。可能吗?别人还会相信你?不会,这样的企业是不值得相信的。

  8、成功的企业一定要搞清楚为什么成功

  成功的企业是创业者的学习对象,为什么成功?学习,不是模仿,切忌不是模仿别人的做法,别人的成功是模仿不来的。
写入到: /root/.bash_profile 文件即可,这个是首选:
或者:/root/.bashrc


ipL=`/sbin/ifconfig eth1|grep "inet addr:"|cut -d: -f 2|cut -d" " -f1`
export PS1="\u@$ipL:\w# "
PHP经常被与开源数据库MySQL配合使用来开发Web应用,它们在开源开发工具组合LAMP中是非常重要的一部分。在PHP 5.3中增加了一个名为MySQLInd的新功能,取代了以前的libmysql库,用来连接PHP和MySQL,并拥有优化MySQL性能和内存利用率的可能。
Alshanetsky表示,“当说到数据库时,多数情况下主要的瓶颈并非数据库接口的速度,而是数据库的操作。使用MySQLInd来取代标准的libmysql,肯定会带来速度的改善,不过我不认为它会让所有应用都提高运行速度。换句话说,使用高度调优MySQL应用的人将会看到新版PHP中更快速、更专用的接口所带来的速度提升。”
总体来说,Alshanetsky预计,通过从目前的PHP5.2转向PHP 5.3,用户应该会看到多数工作流程的性能将提高5%到15%,某些特定工作流程甚至可能看到更高的收益。
http://www.phpchina.com/resource/manual/smarty/language.function.insert.html

Insert 函数类似欲 inluce 函数,不同之处是 insert 所包含的内容不会被缓存,每次调用该模板都会重新执行该函数.

Let's say you have a template with a banner slot at the top of the page. The banner can contain any mixture of HTML, images, flash, etc. so we can't just use a static link here, and we don't want this contents cached with the page. In comes the insert tag: the template knows #banner_location_id# and #site_id# values (gathered from a config file), and needs to call a function to get the banner contents.

例如你在页面上端使用一个带有广告条位置的模板,广告条可以包含任何HTML、图象、FLASH等混合信息. 因此这里不能使用一个静态的链接,同时我们也不希望该广告条被缓存. 这就需要在 insert 函数指定:#banner_location_id# 和 #site_id# 值(从配置文件中取),同时需要一个函数取广告条的内容信息.

Example 7-10. function insert
例 7-10. insert 函数演示

{* example of fetching a banner *}
{insert name="getBanner" lid=#banner_location_id# sid=#site_id#}

In this example, we are using the name "getBanner" and passing the parameters #banner_location_id# and #site_id#. Smarty will look for a function named insert_getBanner() in your PHP application, passing the values of #banner_location_id# and #site_id# as the first argument in an associative array. All insert function names in your application must be prepended with "insert_" to remedy possible function name-space conflicts. Your insert_getBanner() function should do something with the passed values and return the results. These results are then displayed in the template in place of the insert tag. In this example, Smarty would call this function: insert_getBanner(array("lid" => "12345","sid" => "67890")); and display the returned results in place of the insert tag.

在此例中,我们使用了 getBanner 作为 name 属性,同时传递了 #banner_location_id# 和 #site_id# 两个参数. 接下来 Smarty 在你的 php 程序中搜索名为 insert_getBanner() 的函数,#banner_location_id# 和 #site_id# 的值被组合成一个数组作为函数的第一个参数传递给该函数. 为了避免函数命名混乱,所有的 insert 函数都必须以 insert_ 开头. 你的 insert_getBanner() 函数根据传递的参数执行并返回执行的结果. 这些结果就显示在模板中调用该函数的位置. 在此例中 Smarty 调用该函数类似insert_getBanner(array("lid"=>"12345","sid"=>67890"));并将返回的结果显示在调用的位置.

If you supply the "assign" attribute, the output of the insert tag will be assigned to this template variable instead of being output to the template. NOTE: assigning the output to a template variable isn't too useful with caching enabled.

如果设置了 assign 属性,该属性对应的变量名用于保存待包含函数的输出,这样待包含函数的输出就不会直接显示了.注意:赋给模板变量的输出信息在缓存的时候同样无效.

If you supply the "script" attribute, this php script will be included (only once) before the insert function is executed. This is the case where the insert function may not exist yet, and a php script must be included first to make it work. The path can be either absolute, or relative to $trusted_dir. When security is enabled, the script must reside in $trusted_dir.

如果指定了 script 属性,在调用函数并执行前将先包含(只包含一次)script指定的 php 脚本. 这是为了防止被调用的函数不存在,先调用包含该函数的 php 脚本将避免该情况.

The Smarty object is passed as the second argument. This way you can reference and modify information in the Smarty object from within the insert function.

Smart 对象作为函数的第二个参数被传递,在待包含函数中可以通过 $this 访问并修改 smarty 对象信息.

    Technical Note: It is possible to have portions of the template not cached. If you have caching turned on, insert tags will not be cached. They will run dynamically every time the page is created, even within cached pages. This works good for things like banners, polls, live weather, search results, user feedback areas, etc.

    技术要点: 使模板的一部分不被缓存. 如果打开了缓存, insert 函数却不会被缓存,每次调用页面它们都会被动态加载,即使是在缓存页面中. 该特性可以广泛应用于广告条、投票、实时天气预报、搜索结果、反馈信息等区域.
[~/shell]# xxd -g 1 concat.sh

-g 1,2:1和2的区别就是:1 2分别是:66  6669  明白了吧,呵呵!
主要用途:可以用来查看PHP在windows下的utf8记事本编码的bom,会导致session,cookie,输出图片出现异常的bom,大名鼎鼎啊,ef bb bf 就是utf-8 bom,如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。
如,注意efbb这个就是bom啦:

[~/shell]# hexdump bom.txt -C        

00000000  ef bb bf 64 66 64 66 64  0a                       |...dfdfd.|

---------------------------------------------------------------------------------------------------------------------------------------------

[~/shell]# xxd -g 2 bom.txt        

0000000: efbb bf64 6664 6664 0a                   ...dfdfd.
---------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------

vi在linux下查看16进制文件的方法。
xxd
Creates a hex dump of the given file; it can also do the
reverse, so it can be used for binary patching
用法很简单:
在vi的命令状态下
:%!xxd               ——将当前文本转换为16进制格式。(实践OK,但在windows下还是wxHexEditor界面打开好用)
:%!xxd -r            ——将当前文件转换回文本格式。
于是乎:
将当前文本转换为16进制格式,Vi命令行模式,输入:
:%!xxd

将当前文件转换回文本格式,Vi命令行模式,输入:
:%!xxd -r

哈哈,就在这一转16进制后又转回来的时候,你就发现bom,露出了原型,0000000: efbb bfef bbbf 6466 6466 640a            ......dfdfd.到转回来后出现<feff>dfdfd,哈哈哈哈,原形毕露了吧!
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||


[~/shell]# xxd -g 1 test.sh  
0000000: 66 69 6c 65 6e 61 6d 65 3d 24 31 0a 73 74 72 69  filename=$1.stri
0000010: 6e 67 31 3d 65 78 69 73 74 0a 73 74 72 69 6e 67  ng1=exist.string
0000020: 32 3d 78 69 0a 63 6f 6d 6d 61 6e 64 3d 22 63 61  2=xi.command="ca
0000030: 74 20 24 66 69 6c 65 6e 61 6d 65 20 7c 20 67 72  t $filename | gr
0000040: 65 70 20 24 73 74 72 69 6e 67 31 20 7c 20 67 72  ep $string1 | gr
0000050: 65 70 20 24 73 74 72 69 6e 67 32 22 0a 65 76 61  ep $string2".eva
0000060: 6c 20 24 63 6f 6d 6d 61 6e 64 0a                 l $command.

---------------------------------------------------------------------------------------------------------------------------------------------
[~/shell]# xxd -g 2 test.sh  

0000000: 6669 6c65 6e61 6d65 3d24 310a 7374 7269  filename=$1.stri
0000010: 6e67 313d 6578 6973 740a 7374 7269 6e67  ng1=exist.string
0000020: 323d 7869 0a63 6f6d 6d61 6e64 3d22 6361  2=xi.command="ca
0000030: 7420 2466 696c 656e 616d 6520 7c20 6772  t $filename | gr
0000040: 6570 2024 7374 7269 6e67 3120 7c20 6772  ep $string1 | gr
0000050: 6570 2024 7374 7269 6e67 3222 0a65 7661  ep $string2".eva
0000060: 6c20 2463 6f6d 6d61 6e64 0a              l $command.

---------------------------------------------------------------------------------------------------------------------------------------------
当然你也可以这样:
[~/shell]# hexdump test.sh -C            

00000000  66 69 6c 65 6e 61 6d 65  3d 24 31 0a 73 74 72 69  |filename=$1.stri|
00000010  6e 67 31 3d 65 78 69 73  74 0a 73 74 72 69 6e 67  |ng1=exist.string|
00000020  32 3d 78 69 0a 63 6f 6d  6d 61 6e 64 3d 22 63 61  |2=xi.command="ca|
00000030  74 20 24 66 69 6c 65 6e  61 6d 65 20 7c 20 67 72  |t $filename | gr|
00000040  65 70 20 24 73 74 72 69  6e 67 31 20 7c 20 67 72  |ep $string1 | gr|
00000050  65 70 20 24 73 74 72 69  6e 67 32 22 0a 65 76 61  |ep $string2".eva|
00000060  6c 20 24 63 6f 6d 6d 61  6e 64 0a                 |l $command.|
0000006b
Iframe刷新页面:

parent.window.location.reload();
div层刷行页面:

window.location.reload();
建立table表:
CREATE TABLE `table` (
  `ID` tinyint(4) NOT NULL,
  `FQQ` varchar(12) NOT NULL,
  `FTime` varchar(21) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8


插入如下数据:
    ID   FQQ   FTime
   1   372647693   2100-11-11
   2   372647693   2100-11-11
   1   372647694   2100-11-12
   2   37264764   2100-11-15

查询如下:

SELECT * , count( DISTINCT FQQ )
FROM `table`
GROUP BY FQQ
LIMIT 0 , 30

查询结果:

ID   FQQ   FTime   count(distinct FQQ)
2   37264764   2100-11-15   1
1   372647693   2100-11-11   1
1   372647694   2100-11-12   1



退化为:

SELECT 641009005 , FQQ, FTime
FROM `table`
GROUP BY FQQ
LIMIT 0 , 30



641009005   FQQ   FTime

641009005   37264764   2100-11-15
641009005   372647693   2100-11-11
641009005   372647694   2100-11-12

shell操作mysql

WEB2.0 jackxiang 2010-10-18 16:28
   在shell开发中,很多时候我们需要操作mysql数据库(比如:查询数据、导出数据等),但是我们又无法进入mysql命令行的环境,就需要在shell环境中模拟mysql的环境,使用mysql相关命令,本文总结几种shell操作mysql的方法,供大家参考。

方案1
  
view plaincopy to clipboardprint?
01.mysql -uuser -ppasswd -e"insert LogTable values(...)"  
mysql -uuser -ppasswd -e"insert LogTable values(...)"
优点:语句简单
缺点:支持的sql相对简单

方案2
准备一个sql脚本,名字为update.sql,例如:
view plaincopy to clipboardprint?
01.CREATE TABLE `user` (  
02.  `id` varchar(36) NOT NULL COMMENT '主键',  
03.  `username` varchar(50) NOT NULL COMMENT '用户名',  
04.  `password` varchar(50) NOT NULL COMMENT '用户密码',  
05.  `createdate` date NOT NULL COMMENT '创建时间',  
06.  `age` int(11) NOT NULL COMMENT '年龄',  
07.  PRIMARY KEY  (`id`)  
08.) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';  
09.DROP TABLE IF EXISTS `visit_log`;  
10.CREATE TABLE `visit_log` (  
11.  `id` varchar(36) character set utf8 NOT NULL,  
12.  `type` int(11) NOT NULL,  
13.  `content` text character set utf8 NOT NULL,  
14.  `createdate` date NOT NULL,  
15.  PRIMARY KEY  (`id`)  
16.) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='访问日志';  
CREATE TABLE `user` (
  `id` varchar(36) NOT NULL COMMENT '主键',
  `username` varchar(50) NOT NULL COMMENT '用户名',
  `password` varchar(50) NOT NULL COMMENT '用户密码',
  `createdate` date NOT NULL COMMENT '创建时间',
  `age` int(11) NOT NULL COMMENT '年龄',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';
DROP TABLE IF EXISTS `visit_log`;
CREATE TABLE `visit_log` (
  `id` varchar(36) character set utf8 NOT NULL,
  `type` int(11) NOT NULL,
  `content` text character set utf8 NOT NULL,
  `createdate` date NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='访问日志';
新建一个update_mysql.sh,内容如下:
view plaincopy to clipboardprint?
01.use chbdb;  
02.source update.sql  
use chbdb;
source update.sql

然后执行如下命令:
view plaincopy to clipboardprint?
01.cat update_mysql.sh | mysql --user=root -ppassword  
cat update_mysql.sh | mysql --user=root -ppassword
优点:支持复杂的sql脚本
缺点:
1> 需要两个文件:update.sql和update_mysql.sh
2> 一旦中间出错,之后脚本就不会执行,例如:
如果第一张表已经存在,则会报出如下异常:
ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists
然后脚本退出,第二张表也就无法创建。
方案3
    新建一个shell脚本,格式如下:
view plaincopy to clipboardprint?
01.#!/bin/bash  
02.mysql -u* -h* -p* <<EOF  
03.    Your SQL script.  
04.EOF  
#!/bin/bash
mysql -u* -h* -p* <<EOF
    Your SQL script.
EOF
例如:
view plaincopy to clipboardprint?
01.#!/bin/bash  
02.mysql -uroot  -ppassword <<EOF  
03.   use chbdb;  
04.    CREATE TABLE user (  
05.  id varchar(36) NOT NULL COMMENT '主键',  
06.  username varchar(50) NOT NULL COMMENT '用户名',  
07.  password varchar(50) NOT NULL COMMENT '用户密码',  
08.  createdate date NOT NULL COMMENT '创建时间',  
09.  age int(11) NOT NULL COMMENT '年龄',  
10.  PRIMARY KEY  (`id`)  
11.) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';  
#!/bin/bash
mysql -uroot  -ppassword <<EOF
   use chbdb;
    CREATE TABLE user (
  id varchar(36) NOT NULL COMMENT '主键',
  username varchar(50) NOT NULL COMMENT '用户名',
  password varchar(50) NOT NULL COMMENT '用户密码',
  createdate date NOT NULL COMMENT '创建时间',
  age int(11) NOT NULL COMMENT '年龄',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户信息表';
优点:
1>支持复杂的sql脚本
2>无需其它额外文件
缺点:
1> 表名、字段不能使用单引号,需要修改原有sql语句
2> 一旦中间出错,之后脚本就不会执行,例如:
如果第一张表已经存在,则会报出如下异常:
ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists
然后脚本退出,第二张表也就无法创建。
方案4
准备一个sql脚本,如update.sql,然后执行如下命令:
view plaincopy to clipboardprint?
01.mysql -uroot -ppassword < update.sql  
mysql -uroot -ppassword < update.sql
优点:支持复杂的sql脚本
缺点:
1> 一旦中间出错,之后脚本就不会执行,例如:
如果第一张表已经存在,则会报出如下异常:
ERROR 1050 (42S01) at line 1 in file: 'update.sql': Table 'user' already exists
然后脚本退出,第二张表也就无法创建。


    大家知道在mysql命令行中使用source命令,即使中间出错,后续脚本也会继续执行,但是如上几种方式,均无法解决该问题,如果大家有好的建议,请回复,谢谢!

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/hbcui1984/archive/2010/01/03/5125387.aspx
分页: 141/272 第一页 上页 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 下页 最后页 [ 显示模式: 摘要 | 列表 ]