正式接触ngnix

[

经过教程的指导,安装完毕了ngnix,初期体会是系统占用很小,反映灵活,

下面的还需要继续使用测试,

起码可以让负载高的机器负载降低下来了

aix 下面mount光驱

[

mount -rv cdrfs /dev/cd0 /mnt/cdrom

Nginx + PHP(FastCGI)转载di

[

  [文章作者:张宴 本文版本:v3.2 最后修改:2008.07.16 转载请注明原文链接:http://blog.s135.com/read.php/351.htm]

 

脚本转载,运行多个mysqld

[

转载 from http://blog.s135.com/

 

写了一个shell脚本,可以在同一台Linux服务器的不同端口,运行多个MySQL服务的情况下,快捷启动、停止、重启、杀死指定端口的MySQL进程。

vi /usr/local/bin/mysql.sh

  输入以下内容(因各服务器的MySQL配置不同,可能需要修改的部分已用红色标注):

#!/bin/sh

mysql_port=$2
mysql_username="root"
mysql_password="123456"

function_start_mysql()
{
   printf "Starting MySQL...\n"
   /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/mysql/${mysql_port}/my.cnf 2>&1 > /dev/null &
}

function_stop_mysql()
{
   printf "Stoping MySQL...\n"
   /usr/local/mysql/bin/mysqladmin -u ${mysql_username} -p${mysql_password} -h localhost -P ${mysql_port} shutdown
}

function_restart_mysql()
{
   printf "Restarting MySQL...\n"
   function_stop_mysql
   function_start_mysql
}

function_kill_mysql()
{
   kill -9 $(ps -ef | grep 'bin/mysqld_safe' | grep ${mysql_port} | awk '{printf $2}')
   kill -9 $(ps -ef | grep 'libexec/mysqld' | grep ${mysql_port} | awk '{printf $2}')
}

if [ "$1" = "start" ]; then
   function_start_mysql
elif [ "$1" = "stop" ]; then
   function_stop_mysql
elif [ "$1" = "restart" ]; then
   function_restart_mysql
elif [ "$1" = "kill" ]; then
   function_kill_mysql
else
   printf “Usage: mysql.sh {start|stop|restart|kill}\n”
fi

  赋予脚本可执行权限:

chmod +x /usr/local/bin/mysql.sh

  脚本执行方法:

mysql.sh start 3306
mysql.sh stop 3306
mysql.sh restart 3306
mysql.sh kill 3306

批量改后缀,以及find用法以及举例

[

rename .log .txt *.log

把本目录下所有的.log后缀都改成.txt后缀

 

·find  path  -option  [  -print ]  [ -exec  -ok  command ]  {} \;
#-print 将查找到的文件输出到标准输出
#-exec  command  {} \;     —–将查到的文件执行command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户

====================================================

-name  filename             #查找名为filename的文件
-perm                       #按执行权限来查找
-user   username            #按文件属主来查找
-group groupname            #按组来查找
-mtime  -n +n               #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime   -n +n              #按文件访问时间来查GIN: 0px”>-perm                        #按执行权限来查找
-user   username            #按文件属主来查找
-group groupname            #按组来查找
-mtime  -n +n               #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime   -n +n              #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-ctime   -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                    #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer  f1 !f2              找文件,-n指n天以内,+n指n天以前
-ctime   -n +n              #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-nogroup                    #查无有效属组的文件,即文件的属组在/etc/groups中不存在
-nouser                     #查无有效属主的文件,即文件的属主在/etc/passwd中不存
-newer  f1 !f2              #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f        #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size     n[c]              #查长度为n块[或n字节]的文件
-depth                      #使查找在进入子目录前先行查找完本目录
-fstype                     #查更改时间比f1新但比f2旧的文件
-type    b/d/c/p/l/f        #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size     n[c]              #查长度为n块[或n字节]的文件
-depth                      #使查找在进入子目录前先行查找完本目录
-fstype                     #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                      #查文件时不跨越文件系统mount点
-follow                     #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                %;     #查位于某一类型文件系统中的文件,这些文件系统类型通常可 在/etc/fstab中找到
-mount                      #查文件时不跨越文件系统mount点
-follow                     #如果遇到符号链接文件,就跟踪链接所指的文件
-cpio                       #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune                      #忽略某个目录

====================================================
$find  ~  -name  “*.txt”  -print    #在$HOME中查.txt文件并显示
$find  .   -name  “*.txt”  -print
$find  .   -name  “[A-Z]*”  -pri26nbsp;   #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune                              #忽略某个目录

=====================================================
$find  ~  -name  “*.txt”  -print    #在$HOME中查.txt文件并显示
$find  .   -name  “*.txt”  -print
$find  .   -name  “[A-Z]*”  -print  #查以大写字母开头的文件
$find  /etc  -name  “host*”  -print #查以host开头的文件
$find  .  -name  “[a-z][a-z][0--9][0--9].txt”   -print  #查以两个小写字母和两个数字开头的txt文件
$find .  -perm  755  -print
$find  .  -perm -007  -exec ls -l {} \;  #查所有用户都可读写执行的文件同-perm 777
$find  . -type d  -print
$find  .  !  -type  d  -print
$find  .  -type l  -print

$find  .  -size  +1000000c  -print       #查长度大于1Mb的文件
$find  .  -size  100c        -print      # 查长度为100c的文件
$find  .  -size  +10  -print             #查长度超过期作废10块的文件(1块=512字节)

$cd /
$find  etc  home  apps   -depth  -print  | cpio  -ivcdC65536  -o  /dev/rmt0
$find  /etc -name “passwd*”  -exec grep  “cnscn”  {}  \;  #看是否存在cnscn用户
$find . -name “yao*”  | xargs file
$find  . -name “yao*”  |  xargs  echo   “” > /tmp/core.log
$find  . -name “yao*”  | xargs  chmod  o-w

======================================================

find  -name april*                      在当前目录下查找以april开始的文件
find  -name  april*  fprint file        在当前目录下查找以april开始的文件,并把结果输出到file中
find  -name ap* -o -name may*  查找以ap或may开头的文件
find  /mnt  -name tom.txt  -ftype vfat  在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find  /mnt  -name t.txt ! -ftype vfat   在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件
find  /tmp  -name wa* -type l           在/tmp下查找名为wa开头且类型为符号链接的文件
find  /home  -mtime  -2                 在/home下查最近两天内改动过的文件
find /home   -atime -1                  查1天之内被存取过的文件
find /home -mmin   +60                  在/home下查60分钟前改动过的文件
find /home  -amin  +30                  查最近30分钟前被存取过的文件
find /home  -newer  tmp.txt             在/home下查更新时间比tmp.txt近的文件或目录
find /home  -anewer  tmp.txt            在/home下查存取时间比tmp.txt近的文件或目录
find  /home  -used  -2                  列出文件或目录被改动过之后,在2日内被存取过的文件或目录
find  /home  -user cnscn                列出/home目录内属于用户cnscn的文件或目录
find  /home  -uid  +501                 列出/home目录内用户的识别码大于501的文件或目录
find  /home  -group  cnscn              列出/home内组为cnscn的文件或目录
find  /home  -gid 501                   列出/home内组id为501的文件或目录
find  /home  -nouser                    列出/home内不属于本地用户的文件或目录
find  /home  -nogroup                   列出/home内不属于本地组的文件或目录
find  /home   -name tmp.txt   -maxdepth  4  列出/home内的tmp.txt 查时深度最多为3层
find  /home  -name tmp.txt  -mindepth  3  从第2层开始查
find  /home  -empty                     查找大小为0的文件或空目录
find  /home  -size  +512k               查大于512k的文件
find  /home  -size  -512k               查小于512k的文件
find  /home  -links  +2                 查硬连接数大于2的文件或目录
find  /home  -perm  0700                查权限为700的文件或目录
find  /tmp  -name tmp.txt  -exec cat {} \;
find  /tmp  -name  tmp.txt  -ok  rm {} \;

find   /  -amin   -10       # 查找在系统中最后10分钟访问的文件
find   /  -atime  -2         # 查找在系统中最后48小时访问的文件
find   /  -empty              # 查找在系统中为空的文件或者文件夹
find   /  -group  cat        # 查找在系统中属于 groupcat的文件
find   /  -mmin  -5         # 查找在系统中最后5分钟里修改过的文件
find   /  -mtime  -1        #查找在系统中最后24小时里修改过的文件
find   /  -nouser             #查找在系统中属于作废用户的文件
find   /  -user   fred       #查找在系统中属于FRED这个用户的文件
 
查当前目录下的所有普通文件
——————————————————————————–

# find . -type f -exec ls -l {} \;
-rw-r–r–    1 root     root        34928 2003-02-25  ./conf/httpd.conf
-rw-r–r–    1 root     root        12959 2003-02-25  ./conf/magic
-rw-r–r–    1 root     root          180 2003-02-25  ./conf.d/README
查当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出

=================================================
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:
$ find logs -type f -mtime +5 -exec  -ok  rm {} \;

=================================================
查询当天修改过的文件
[root@book class]# find  ./  -mtime  -1  -type f  -exec  ls -l  {} \;

=================================================
查询文件并询问是否要显示
[root@book class]# find  ./  -mtime  -1  -type f  -ok  ls -l  {} \; 
< ls … ./classDB.inc.php > ? y
-rw-r–r–    1 cnscn    cnscn       13709  1月 12 12:22 ./classDB.inc.php
[root@book class]# find  ./  -mtime  -1  -type f  -ok  ls -l  {} \; 
< ls … ./classDB.inc.php > ? n
[root@book class]#

=================================================
查询并交给awk去处理
[root@book class]# who  |  awk  ‘{print $1″\t”$2}’
cnscn   pts/0

=================================================
awk—grep—sed

[root@book class]# df  -k |  awk ‘{print $1}’ |  grep  -v  ‘none’ |  sed  s”/\/dev\///g”
文件系统
sda2
sda1
[root@book class]# df  -k |  awk ‘{print $1}’ |  grep  -v  ‘none’
文件系统
/dev/sda2
/dev/sda1
 
 
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR”,最后打印出所有包含”SYSCALL_VECTOR”的文件名

A) find  /tmp  -name  “*.h”  | xargs  -n50  grep SYSCALL_VECTOR
B) grep  SYSCALL_VECTOR  /tmp/*.h | cut   -d’:'  -f1| uniq > filename
C) find  /tmp  -name “*.h”  -exec grep “SYSCALL_VECTOR”  {}  \; -print

2)find / -name filename -exec rm -rf {} \;
   find / -name filename -ok rm -rf {} \;

3)比如要查找磁盘中大于3M的文件:
find . -size +3000k -exec ls -ld {} ;

4)将find出来的东西拷到另一个地方
find *.c -exec cp ‘{}’ /tmp ‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:
find dir -name filename -print | cpio -pdv newdir

6)查找2004-11-30 16:36:37时更改过的文件
# A=`find ./ -name “*php”` |  ls -l –full-time $A 2>/dev/null | grep “2004-11-30 16:36:37″

清除带库中的磁盘数据

[

del vol B00221 discarddata=yes
del vol B00222 discarddata=yes
del vol B00223 discarddata=yes
del vol B00224 discarddata=yes
del vol B00225 discarddata=yes
del vol B00226 discarddata=yes
del vol B00227 discarddata=yes
del vol B00228 discarddata=yes
del vol B00229 discarddata=yes
del vol B00230 discarddata=yes
del vol B00231 discarddata=yes
del vol B00232 discarddata=yes
del vol B00233 discarddata=yes
del vol B00235 discarddata=yes
del vol B00236 discarddata=yes
del vol B00237 discarddata=yes
del vol B00239 discarddata=yes
del vol B00240 discarddata=yes

删除了18盘磁带,并且清空了数据

 

 

label libvolume 3582LIB search=bulk labelsource=barcode checkin=scratch

 

define volume LTODBPOOL2 B00221
define volume LTODBPOOL2 B00222
define volume LTODBPOOL2 B00223
define volume LTODBPOOL2 B00224
define volume LTODBPOOL2 B00225
define volume LTODBPOOL2 B00226
define volume LTODBPOOL2 B00227
define volume LTODBPOOL2 B00228
define volume LTODBPOOL2 B00229
define volume LTODBPOOL2 B00230
define volume LTODBPOOL2 B00231
define volume LTODBPOOL2 B00232
define volume LTODBPOOL2 B00233
define volume LTODBPOOL2 B00234
define volume LTODBPOOL2 B00235
define volume LTODBPOOL2 B00236
define volume LTODBPOOL2 B00237
define volume LTODBPOOL2 B00238
define volume LTODBPOOL2 B00239
define volume LTODBPOOL2 B00240

 

帖点东西给你,下次做磁带库的时候用这些命令应该就够用了(这是我以前总结的别人发的帖子里的东西):

磁带库配置

A、使用tapeutil找到Driver的element值#tapeutil

B、选择“open a device”:/dev/smc0

C、选择“elements Information”,就可以得到Driver和Slots的elements值。

E、定义磁带库,定义一个名为358Xlib的scsi带库,在Automated Libraries中选择
   define library 3584lib libtype=scsi(定义一个名字为autolib的SCSI磁带库)。*/libtype是带库的类型/*

E1、如果是内置磁带库,要设置一个Manual Library
    >define library 4mmlib libtype=manual

F、定义磁带库的PATH(定义TSM SERVER名为TSM所连的接磁带库358Xlib在TSM SERVER中的设备PTAH:/dev/smc0,在Tape Path中定义,Source Name输入名字比如TSM Source Type=Server,Device=/dev/smc0)。*/tsm是tivoli的默认名字,smc0为带库的机械臂/*
   define path server1 3584lib srctype=server desttype=library device=/dev/smc0 online=yes

F1、定义4MM驱动器路径:
    >define path XXXX 4mmdrv srctype=server desttype=drive library=4mmlib device=/dev/mt0(其中XXX换为TSM服务器名)

G、定义磁带机(Driver)(定义磁带库358Xlib中的磁带机,磁带机的名字叫做 driver01)选择Automated Drivers。
  
   define drive 3584lib drive01 element=257 */drive代表磁带机,element号可以在系统看到,lscfg -vpl rmtX /*

   define drive 3582lib drive02 element=257 */此磁带机的element时以256开头,第二个为257/*

G1、定义4MM驱动器
   > DEFINE DRIVE 4MMLIB 4mmdrv ONLINE=YES

H、定义磁带机(Driver)的PATH(定义TSMSERVER名为TSM所连接的磁带库autolib中的磁带机在TSM SERVER中的设备PATH,在Tape Path中定义,Source Name=TSM,Destination_name选择定义的drive,Device=/dev/rmtx)。

   define path server1 drive01 srctype=server desttype=drive library=3584lib device=/dev/rmt0 online=yes

   define path tsm drive02 srctype=server desttype=drive library=358Xlib device=/dev/rmt1 online=yes
  
I、定义设备CLASSES
   define devclass ltotape devtype=lto library=3584lib format=ultriumc mountlimit=drives mountretention=5 estcapacity=200G

I1、定义4MM驱动器类
    define devclass 4mmdcl library=4mmlib devtype=4mm format=drive prefix=ADSM mountwait=60 mountretention=60 mountlimit=drives

*/ltotape是devclass的名称,devtype=lto 是类型为lto /*

J、检查磁带库的相关配置
   query library、query drive、query path、query devclass

K、定义磁带存储池
   define stgpool kkdb1_pool ltotape maxscratch=60(定义ltotape设备类使用的磁带存储池358X_pool)。

K1、定义4MM 磁带机存储池
    > DEFINE STGPOOL 4mmpool 4MMDCL ACCESS=READWRITE
COLLOCATE=NO MAXSCRATCH=1

    定义4MM 磁带库存储池
    >define stgpool tapepool 4mmtape maxscratch=6

菜单操作
          Object view ->Server Storage ->Storage Pools -> Sequential Access Storage Pools ->Operations:
          Define Sequential Access Storage Pool
          Storage Pool Name 358X_pool
          Device Class LTOTAPE
          Description
          Media Access Status READWRITE
          Maximum Size Threshold NOLIMIT
          Next Storage Pool
          High Migration Threshold 90
          Low Migration Threshold 70
          Collocate? YES NO FILESPACE
          Reclamation Threshold 60
          Maximum Scratch Volumes Allowed 18 ( for 3582, 18 media slot )
          Delay Period for Volume Reuse 0
          Reclaim to storage pool
          Migration Delay 0
          Migration Continue YES NO
          Overflow Location

L、对磁带进行标记.
  
   手动导入磁带,import到空槽中。
   #cd /usr/tivoli/tsm/server/bin
   #./dsmlabel -drive=/dev/rmt0,257 -library=/dev/smc0 -search -overwrite

   标记磁带卷
   >label libvolume 3584lib search=yes labelsource=barcode checkin=private overwrite=yes(以上是磁带都有标签的时候做,如果磁带没有标签,则需要手动的一个个定义磁带)
   >label libvolume 3584lib A00000 (磁带名称)
  
   系统显示标记后,行一下步操作。
   #dsmadmc
   checkin libvolume 3584lib search=yes status=private */private为专用带/*
   define volume 3584_pool tape01  */定义带库池中的一个卷为tape01(为磁带条码号)/*
   checkin libvolume 3582lib tape02 status=private */捡入一个磁带到带库中/*

但是这些命令是要挑着用的,不是要全用的,看看后面的注释,以后有项目的时候,做个小小的实验,就知道这些命令的用法了,因为实在最近太忙,没时间整理清楚这个东西,所以还要麻烦你自己整理一下,等以后有时间的时候,整理出来我再贴出来。

TSM如何在只有一个驱动器的情况下,对存储池做回收卷操作

[本周实施一个TSM项目,磁带库为只有一个SCSI接口驱动器的3582磁带库,做完配置后,想开启对存储池的回收卷功能,可大伙都知道,如果想开启此功能,最好的方法是使用两个以上的driver,但客户的带库并不满足这个条件,可在我印像中应该可以将磁盘做为临时存储池来使用,但具体的步骤记不得了。经过查看information center中的administrator guide,解决了这一问题.......

以下是对英文文档的对译,由于是第一次翻译,有错误或不准确的地方希望大家批评指正。
Reclaiming Volumes in a Storage Pool with One Drive
如何在只有一个驱动器的情况下,对存储池做回收卷操作

When a storage pool has only one mount point (that is, just one drive) available to it through the device class, data cannot be reclaimed from one volume to another within that same storage pool.
当一个存储池只有一个挂接点(也就是只有一个驱动器)可用到这个设备类,在同一个存储池里的数据不能被回收从一个卷到另一个卷。
To enable volume reclamation for a storage pool that has only one mount point, you can define a reclamation storage pool for the server to use when reclaiming volumes. When the server reclaims volumes, the server moves the data from volumes in the original storage pool to volumes in the reclamation storage pool. The server always uses the reclamation storage pool when one is defined, even when the mount limit is greater than one.
在存储池只有一个挂接点而想要开启卷回收功能的话,我们可以在这个TSM服务器上定义一个回收存储池来解决这个问题。当TSM服务器进行卷回收操作时,服务器将数据从源存储池移动到指定的回收存储池。当这个回收存储池被定义后,服务器会一直使用它,甚至当源存储池的MOUNT点限制大于一的时候。
If the reclamation storage pool does not have enough space to hold all of the data being reclaimed, the server moves as much of the data as possible into the reclamation storage pool. Any data that could not be moved to volumes in the reclamation storage pool still remains on volumes in the original storage pool.
如果回收存储池没有足够的空间来保存正在回收的数据,TSM服务器可能会移动更多的数据到回收存储池。任何不能被移动到回收存储池所含卷的数据仍然会保留在源存储池的卷中。
The pool identified as the reclamation storage pool must be a primary sequential storage pool. The primary purpose of the reclamation storage pool is for temporary storage of reclaimed data. To ensure that data moved to the reclamation storage pool eventually moves back into the original storage pool, specify the original storage pool as the next pool in the storage hierarchy for the reclamation storage pool. For example, if you have a tape library with one drive, you can define a storage pool to be used for reclamation using a device class with a device type of FILE:
回收存储池的池的类型必须是主顺序存储池。设立回收存储池的主要目的是临时存放被回收的数据。确保数据能移动到回收存储池,最后再回存到源存储池,在存储分层设置中,指定源存储池的下一存储池为回收存储池。例如:如果我们有个只有一个驱动器的磁带库,我们能指定一个设备类型为文件型的存储池做为回存储池来使用,命令如下:
define stgpool reclaimpool fileclass maxscratch=100

Define the storage pool for the tape drive as follows:
为设备类为磁带驱动器的存储池定义回收存储池,命令如下:
define stgpool tapepool1 tapeclass maxscratch=100 reclaimstgpool=reclaimpool

Finally, update the reclamation storage pool so that data migrates back to the tape storage pool:
最后,升级回收存储池,将数据回迁到源磁带类型的存储池:
update stgpool reclaimpool nextstgpool=tapepool1
Note: You can specify multiple concurrent reclamation processes for a primary storage pool with one drive by using the RECLAIMSTGPOOL parameter. If multiple concurrent processing is not desired, specify a value of 1 for the RECLAIMPROCESS parameter on the DEFINE STGPOOL or UPDATE STGPOOL commands.
注意:在只有一个驱动器的情况下,我们使用RECLAIMSTGPOOL参数能为一个主存储池指定多个并发的回收进程,如果不想使用多个并发进程,在使用命令行定义存储池或升级存储池时,将参数RECLAIMPROCESS的值设为1即可。

其实操作起来并不难,但大家做的时候一定要小心,原存储池和回收存储池的关系一定的搞明白,否则会影响到备份的.
支持原创,欢迎转载,请署名shakesky QQ:11980809

MySQL 备份和恢复(MyISAM 和 Innodb)

[

本文讨论 MySQL 的备份和恢复机制,以及如何维护数据表,包括最主要的两种表类型:MyISAMInnodb,文中设计的 MySQL 版本为 5.0.22。

目前 MySQL 支持的免费备份工具有:mysqldump、mysqlhotcopy,还可以用 SQL 语法进行备份:BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者备份二进制日志(binlog),还可以是直接拷贝数据文件和相关的配置文件。MyISAM 表是保存成文件的形式,因此相对比较容易备份,上面提到的几种方法都可以使用。Innodb 所有的表都保存在同一个数据文件 ibdata1 中(也可能是多个文件,或者是独立的表空间文件),相对来说比较不好备份,免费的方案可以是拷贝数据文件备份 binlog,或者用 mysqldump

1、mysqldump

1.1 备份

mysqldump 是采用SQL级别的备份机制,它将数据表导成 SQL 脚本文件,在不同的 MySQL 版本之间升级时相对比较合适,这也是最常用的备份方法。
现在来讲一下 mysqldump 的一些主要参数:

  • –compatible=name

    它告诉 mysqldump,导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用几个值,用逗号将它们隔开。当然了,它并不保证能完全兼容,而是尽量兼容。

  • –complete-insert,-c

    导出的数据采用包含字段名的完整 INSERT 方式,也就是把所有的值都写在一行。这么做能提高插入效率,但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此,需要谨慎使用该参数,至少我不推荐。

  • –default-character-set=charset

    指定导出数据时采用何种字符集,如果数据表不是采用默认的 latin1 字符集的话,那么导出时必须指定该选项,否则再次导入数据后将产生乱码问题。

  • –disable-keys

    告诉 mysqldumpINSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */;/*!40000 ALTER TABLE table ENABLE KEYS */; 语句,这能大大提高插入语句的速度,因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。

  • –extended-insert = true|false

    默认情况下,mysqldump 开启 --complete-insert 模式,因此不想用它的的话,就使用本选项,设定它的值为 false 即可。

  • –hex-blob

    使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB

  • –lock-all-tables,-x

    在开始导出之前,提交请求锁定所有数据库中的所有表,以保证数据的一致性。这是一个全局读锁,并且自动关闭 --single-transaction--lock-tables 选项。

  • –lock-tables

    它和 --lock-all-tables 类似,不过是锁定当前导出的数据表,而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 选项。

  • –no-create-info,-t

    只导出数据,而不添加 CREATE TABLE 语句。

  • –no-data,-d

    不导出任何数据,只导出数据库表结构。

  • –opt

    这只是一个快捷选项,等同于同时添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 选项。本选项能让 mysqldump 很快的导出数据,并且导出的数据能很快导回。该选项默认开启,但可以用 --skip-opt 禁用。注意,如果运行 mysqldump 没有指定 --quick--opt 选项,则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。

  • –quick,-q

    该选项在导出大表时很有用,它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。

  • –routines,-R

    导出存储过程以及自定义函数。

  • –single-transaction

    该选项在导出数据之前提交一个 BEGIN SQL语句,BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表,例如 InnoDBBDB
    本选项和 --lock-tables 选项是互斥的,因为 LOCK TABLES 会使任何挂起的事务隐含提交。
    要想导出大表的话,应结合使用 --quick 选项。

  • –triggers

    同时导出触发器。该选项默认启用,用 --skip-triggers 禁用它。

其他参数详情请参考手册,我通常使用以下 SQL 来备份 MyISAM 表:

/usr/local/mysql/bin/mysqldump -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false /
--triggers -R --hex-blob -x db_name > db_name.sql

使用以下 SQL 来备份 Innodb 表:

/usr/local/mysql/bin/mysqldump -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false /
--triggers -R --hex-blob --single-transaction db_name > db_name.sql

1.2 还原

mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本,有两种方法可以将数据导入。

  • 直接用 mysql 客户端

    例如:

    /usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql
    

  • 用 SOURCE 语法

    其实这不是标准的 SQL 语法,而是 mysql 客户端提供的功能,例如:

    SOURCE /tmp/db_name.sql;
    

    这里需要指定文件的绝对路径,并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。

2、 mysqlhotcopy

2.1 备份

mysqlhotcopy 是一个 PERL 程序,最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLEScpscp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。mysqlhotcopy 只能用于备份 MyISAM,并且只能运行在 类UnixNetWare 系统上。

mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。以下是几个例子:

root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name /tmp (把数据库目录 db_name 拷贝到 /tmp 下)
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

更详细的使用方法请查看手册,或者调用下面的命令来查看 mysqlhotcopy 的帮助:

perldoc /usr/local/mysql/bin/mysqlhotcopy

注意,想要使用 mysqlhotcopy,必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限,并且还必须要能够有读取 datadir/db_name 目录的权限。

2.2 还原

mysqlhotcopy 备份出来的是整个数据库目录,使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可,同时要注意权限的问题,如下例:

root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)

3、 SQL 语法备份

3.1 备份

BACKUP TABLE 语法其实和 mysqlhotcopy 的工作原理差不多,都是锁表,然后拷贝数据文件。它能实现在线备份,但是效果不理想,因此不推荐使用。它只拷贝表结构文件和数据文件,不同时拷贝索引文件,因此恢复时比较慢。
例子:

BACK TABLE tbl_name TO '/tmp/db_name/';

注意,必须要有 FILE 权限才能执行本SQL,并且目录 /tmp/db_name/ 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。

SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件,可以自定义字段间隔的方式,方便处理这些数据。
例子:

SELECT INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;

注意,必须要有 FILE 权限才能执行本SQL,并且文件 /tmp/db_name/tbl_name.txt 必须能被 mysqld 用户可写,导出的文件不能覆盖已经存在的文件,以避免安全问题。

3.2 恢复

BACKUP TABLE 方法备份出来的文件,可以运行 RESTORE TABLE 语句来恢复数据表。
例子:

RESTORE TABLE FROM '/tmp/db_name/';

权限要求类似上面所述。

SELECT INTO OUTFILE 方法备份出来的文件,可以运行 LOAD DATA INFILE 语句来恢复数据表。
例子:

LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;

权限要求类似上面所述。倒入数据之前,数据表要已经存在才行。如果担心数据会发生重复,可以增加 REPLACE 关键字来替换已有记录或者用 IGNORE 关键字来忽略他们。

4、 启用二进制日志(binlog)

采用 binlog 的方法相对来说更灵活,省心省力,而且还可以支持增量备份。

启用 binlog 时必须要重启 mysqld。首先,关闭 mysqld,打开 my.cnf,加入以下几行:

server-id	= 1
log-bin		= binlog
log-bin-index	= binlog.index

然后启动 mysqld 就可以了。运行过程中会产生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 记录所有对数据的更新操作,后面的文件则是所有 binlog 的索引,都不能轻易删除。关于 binlog 的信息请查看手册。

需要备份时,可以先执行一下 SQL 语句,让 mysqld 终止对当前 binlog 的写入,就可以把文件直接备份,这样的话就能达到增量备份的目的了:

FLUSH LOGS;

如果是备份复制系统中的从服务器,还应该备份 master.inforelay-log.info 文件。

备份出来的 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 来查看,如:

/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001

该工具允许你显示指定的数据库下的所有 SQL 语句,并且还可以限定时间范围,相当的方便,详细的请查看手册。

恢复时,可以采用类似以下语句来做到:

/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name

mysqlbinlog 输出的 SQL 语句直接作为输入来执行它。

如果你有空闲的机器,不妨采用这种方式来备份。由于作为 slave 的机器性能要求相对不是那么高,因此成本低,用低成本就能实现增量备份而且还能分担一部分数据查询压力,何乐而不为呢?

5、 直接备份数据文件

相较前几种方法,备份数据文件最为直接、快速、方便,缺点是基本上不能实现增量备份。为了保证数据的一致性,需要在靠背文件前,执行以下 SQL 语句:

FLUSH TABLES WITH READ LOCK;

也就是把内存中的数据都刷新到磁盘中,同时锁定数据表,以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单,直接拷贝回原来的数据库目录下即可。

注意,对于 Innodb 类型表来说,还需要备份其日志文件,即 ib_logfile* 文件。因为当 Innodb 表损坏时,就可以依靠这些日志文件来恢复。

6、 备份策略

对于中等级别业务量的系统来说,备份策略可以这么定:第一次全量备份,每天一次增量备份,每周再做一次全量备份,如此一直重复。而对于重要的且繁忙的系统来说,则可能需要每天一次全量备份,每小时一次增量备份,甚至更频繁。为了不影响线上业务,实现在线备份,并且能增量备份,最好的办法就是采用主从复制机制(replication),在 slave 机器上做备份。

7、 数据维护和灾难恢复

作为一名DBA(我目前还不是,呵呵),最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此,需要定期维护你的数据表。以下 SQL 语句就很有用:

CHECK TABLE 或 REPAIR TABLE,检查或维护 MyISAM 表
OPTIMIZE TABLE,优化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表

当然了,上面这些命令起始都可以通过工具 myisamchk 来完成,在这里不作详述。

Innodb 表则可以通过执行以下语句来整理碎片,提高索引速度:

ALTER TABLE tbl_name ENGINE = Innodb;

这其实是一个 NULL 操作,表面上看什么也不做,实际上重新整理碎片了。

通常使用的 MyISAM 表可以用上面提到的恢复方法来完成。如果是索引坏了,可以用 myisamchk 工具来重建索引。而对于 Innodb 表来说,就没这么直接了,因为它把所有的表都保存在一个表空间了。不过 Innodb 有一个检查机制叫 模糊检查点,只要保存了日志文件,就能根据日志文件来修复错误。可以在 my.cnf 文件中,增加以下参数,让 mysqld 在启动时自动检查日志文件:

innodb_force_recovery	= 4

关于该参数的信息请查看手册。

8、 总结

做好数据备份,定制好合适的备份策略,这是一个DBA所做事情的一小部分,万事开头难,就从现在开始吧

QQ 0.8被甩在后面

[

恩,磨子桥,桥下,红绿灯,前面一个QQ 0.8 黑色的,起步就很肉

我在后面一档跟起的,到百脑汇旁边的时候,自行车那个多啊,人也多,QQ 0.8就更走不动了,眼看QQ前面的车都跑到下个红绿灯了

这样下去咋个得行呢,我转向灯也没打,直接从左边超过去,加速后直接到2档,超越QQ,马上蹬了几下,换三档,汇入自行车流,继续骑。。。。。。。。。。。。。。。。。。。。。。。。。。。。天气热啊,自行车骑起来就是热,QQ 0.8开了空调就跟自行车差不多