紫悦博客

不进则退,退一步万丈悬崖!

0%

如果你的高负载网站使用PHP-FPM管理FastCGI,也许下面这些技巧对你有用

  1. Compile PHP’s modules as less as possible, the simple the best (fast);

    尽量少安装PHP模块,最简单是最好(快)的

  2. Increas PHP FastCGI child number to 100 and even more. Sometime, 200 is OK! ( On 4GB memory server);

    把你的PHP FastCGI子进程数调到100或以上,在4G内存的服务器上200就可以(建议压力测试来得出自己服务器合理的值)

  3. Using SOCKET PHP FastCGI, and put into /dev/shm on Linux;

    socket连接FastCGI,/dev/shm是内存文件系统,socket放在内存中肯定会快些

  4. Increase Linux “max open files”, using the following command (must be root):

    Linux下增加文件打开数,命令如下:

    1
    2
    3
    4
    5
    6
    cat >> /etc/security/limits.conf <<EOF
    * soft nproc 65535
    * hard nproc 65535
    * soft nofile 65535
    * hard nofile 65535
    EOF
  5. Increase PHP-FPM open file description rlimit:

    增加 PHP-FPM 打开文件描述符的限制:

    1
    2
    vi $php_install_dir/etc/php-fpm.conf
    rlimit_files = 51200
  6. Using PHP code accelerator, e.g eAccelerator, XCache. And set “cache_dir” to /dev/shm on Linux.

    使用php代码加速器,例如 eAccelerator, XCache.在Linux平台上可以把cache_dir指向 /dev/shm

/usr/local/php/etc/php-fpm.conf重要优化参数详解:

1
pm = dynamic

pm参数指定了进程管理方式,有两种可供选择:static dynamic ,从字面意思不难理解,为静态或动态方式。如果是静态方式,那么在php-fpm启动的时候就创建了指定数目的进程,在运行过程中不会再有变化(并不是真的就永远不变);而动态的则在运行过程中动态调整,当然并不是无限制的创建新进程,受pm.max_spare_servers参数影响;**动态适合小内存机器,灵活分配进程,省内存。静态适用于大内存机器,动态创建回收进程对服务器资源也是一种消耗**

  • static模式下创建的子进程数或dynamic模式下同一时刻允许最大的php-fpm子进程数量
1
pm.max_children = 24
  • 动态方式下的起始php-fpm进程数量
1
pm.start_servers = 16
  • 动态方式下服务器空闲时最小php-fpm进程数量
1
pm.min_spare_servers = 12
  • 动态方式下服务器空闲时最大php-fpm进程数量
1
pm.max_spare_servers = 24


一般php-fpm进程占用20~30m左右的内存就按30m算。如果单独跑php-fpm,动态方式起始值可设置物理内存Mem/30M,由于大家一般Nginx、MySQL都在一台机器上,于是预留一半给它们,即php-fpm进程数为$Mem/2/30。

LNMP在一台机器上参数(仅供参考,建议压力测试得出):

1
2
3
4
5
Mem=`free -m | awk '/Mem:/{print $2}'` #我的机器内存是987M
sed -i "s@^pm.max_children.*@pm.max_children = $(($Mem/2/20))@" $php_install_dir/etc/php-fpm.conf
sed -i "s@^pm.start_servers.*@pm.start_servers = $(($Mem/2/30))@" $php_install_dir/etc/php-fpm.conf
sed -i "s@^pm.min_spare_servers.*@pm.min_spare_servers = $(($Mem/2/40))@" $php_install_dir/etc/php-fpm.conf
sed -i "s@^pm.max_spare_servers.*@pm.max_spare_servers = $(($Mem/2/20))@" $php_install_dir/etc/php-fpm.conf

987M内存:

1
2
3
4
5
pm = dynamic
pm.max_children = 24
pm.start_servers = 16
pm.min_spare_servers = 12
pm.max_spare_servers = 24

目录点击这里:每天一个linux命令

mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录。

命令格式

1
mv [选项] 源文件或目录 目标文件或目录

命令功能

视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。

命令参数

-b :若需覆盖文件,则覆盖前先行备份。
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
-u :若目标文件已经存在,且 source 比较新,才会更新(update)
-t : –target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定mv的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。

命令实例

实例一:文件改名

命令:

1
mv test.log test1.txt

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost test]# ll
总计 20drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 10-25 17:46 test3
drwxr-xr-x 2 root root 4096 10-25 17:56 test4
drwxr-xr-x 3 root root 4096 10-25 17:56 test5
-rw-r--r-- 1 root root 16 10-28 06:04 test.log
[root@localhost test]# mv test.log test1.txt
[root@localhost test]# ll
总计 20drwxr-xr-x 6 root root 4096 10-27 01:58 scf
-rw-r--r-- 1 root root 16 10-28 06:04 test1.txt
drwxrwxrwx 2 root root 4096 10-25 17:46 test3
drwxr-xr-x 2 root root 4096 10-25 17:56 test4
drwxr-xr-x 3 root root 4096 10-25 17:56 test5

说明:

将文件test.log重命名为test1.txt

实例二:移动文件

命令:

1
mv test1.txt test3

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost test]# ll
总计 20drwxr-xr-x 6 root root 4096 10-27 01:58 scf
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxrwxrwx 2 root root 4096 10-25 17:46 test3
drwxr-xr-x 2 root root 4096 10-25 17:56 test4
drwxr-xr-x 3 root root 4096 10-25 17:56 test5
[root@localhost test]# mv test1.txt test3
[root@localhost test]# ll
总计 16drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 2 root root 4096 10-28 06:09 test3
drwxr-xr-x 2 root root 4096 10-25 17:56 test4
drwxr-xr-x 3 root root 4096 10-25 17:56 test5
[root@localhost test]# cd test3
[root@localhost test3]# ll
总计 4
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
[root@localhost test3]#

说明:

将test1.txt文件移到目录test3中

实例三:将文件log1.txt,log2.txt,log3.txt移动到目录test3中。

命令:

1
2
mv log1.txt log2.txt log3.txt test3
mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost test]# ll
总计 28
-rw-r--r-- 1 root root 8 10-28 06:15 log1.txt
-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
drwxrwxrwx 2 root root 4096 10-28 06:09 test3
[root@localhost test]# mv log1.txt log2.txt log3.txt test3
[root@localhost test]# ll
总计 16drwxrwxrwx 2 root root 4096 10-28 06:18 test3
[root@localhost test]# cd test3/
[root@localhost test3]# ll
总计 16
-rw-r--r-- 1 root root 8 10-28 06:15 log1.txt
-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
[root@localhost test3]#
[root@localhost test3]# ll
总计 20
-rw-r--r-- 1 root root 8 10-28 06:15 log1.txt
-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
drwxr-xr-x 2 root root 4096 10-28 06:21 logs
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
[root@localhost test3]# mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt
[root@localhost test3]# cd ..
[root@localhost test]# cd test4/
[root@localhost test4]# ll
总计 12
-rw-r--r-- 1 root root 8 10-28 06:15 log1.txt
-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
[root@localhost test4]#

说明:

mv log1.txt log2.txt log3.txt test3 命令将log1.txt ,log2.txt, log3.txt 三个文件移到 test3目录中去,mv -t /opt/soft/test/test4/ log1.txt log2.txt log3.txt 命令又将三个文件移动到test4目录中去

实例四:将文件file1改名为file2,如果file2已经存在,则询问是否覆盖

命令:

1
mv -i log1.txt log2.txt

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost test4]# ll
总计 12
-rw-r--r-- 1 root root 8 10-28 06:15 log1.txt
-rw-r--r-- 1 root root 12 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
[root@localhost test4]# cat log1.txt
odfdfs
[root@localhost test4]# cat log2.txt
ererwerwer
[root@localhost test4]# mv -i log1.txt log2.txt
mv:是否覆盖“log2.txt”? y
[root@localhost test4]# cat log2.txt
odfdfs
[root@localhost test4]#

实例五:将文件file1改名为file2,即使file2存在,也是直接覆盖掉。

命令:

1
mv -f log3.txt log2.txt

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost test4]# ll
总计 8
-rw-r--r-- 1 root root 8 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
[root@localhost test4]# cat log2.txt
odfdfs
[root@localhost test4]# cat log3
cat: log3: 没有那个文件或目录
[root@localhost test4]# ll
总计 8
-rw-r--r-- 1 root root 8 10-28 06:15 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log3.txt
[root@localhost test4]# cat log2.txt
odfdfs
[root@localhost test4]# cat log3.txt
dfosdfsdfdss
[root@localhost test4]# mv -f log3.txt log2.txt
[root@localhost test4]# cat log2.txt
dfosdfsdfdss
[root@localhost test4]# ll
总计 4
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
[root@localhost test4]#

说明:

log3.txt的内容直接覆盖了log2.txt内容,-f 这是个危险的选项,使用的时候一定要保持头脑清晰,一般情况下最好不用加上它。

实例六:目录的移动

命令:

1
mv dir1 dir2 

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost test4]# ll
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
[root@localhost test4]# ll
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
[root@localhost test4]# cd ..
[root@localhost test]# ll
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 3 root root 4096 10-28 06:24 test3
drwxr-xr-x 2 root root 4096 10-28 06:48 test4
drwxr-xr-x 3 root root 4096 10-25 17:56 test5
[root@localhost test]# cd test3
[root@localhost test3]# ll
drwxr-xr-x 2 root root 4096 10-28 06:21 logs
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
[root@localhost test3]# cd ..
[root@localhost test]# mv test4 test3
[root@localhost test]# ll
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 4 root root 4096 10-28 06:54 test3
drwxr-xr-x 3 root root 4096 10-25 17:56 test5
[root@localhost test]# cd test3/
[root@localhost test3]# ll
drwxr-xr-x 2 root root 4096 10-28 06:21 logs
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxr-xr-x 2 root root 4096 10-28 06:48 test4
[root@localhost test3]#

说明:

如果目录dir2不存在,将目录dir1改名为dir2;否则,将dir1移动到dir2中。

实例7:移动当前文件夹下的所有文件到上一级目录

命令:

1
mv * ../

输出:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost test4]# ll
-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
[root@localhost test4]# mv * ../
[root@localhost test4]# ll
[root@localhost test4]# cd ..
[root@localhost test3]# ll
-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
drwxr-xr-x 2 root root 4096 10-28 06:21 logs
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxr-xr-x 2 root root 4096 10-28 07:02 test4

实例八:把当前目录的一个子目录里的文件移动到另一个子目录里

命令:

1
mv test3/*.txt test5

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost test]# ll
drwxr-xr-x 6 root root 4096 10-27 01:58 scf
drwxrwxrwx 4 root root 4096 10-28 07:02 test3
drwxr-xr-x 3 root root 4096 10-25 17:56 test5
[root@localhost test]# cd test3
[root@localhost test3]# ll
-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
drwxr-xr-x 2 root root 4096 10-28 06:21 logs
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxr-xr-x 2 root root 4096 10-28 07:02 test4
[root@localhost test3]# cd ..
[root@localhost test]# mv test3/*.txt test5
[root@localhost test]# cd test5
[root@localhost test5]# ll
-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1
[root@localhost test5]# cd ..
[root@localhost test]# cd test3/
[root@localhost test3]# ll
drwxr-xr-x 2 root root 4096 10-28 06:21 logs
drwxr-xr-x 2 root root 4096 10-28 07:02 test4
[root@localhost test3]#

实例九:文件被覆盖前做简单备份,前面加参数-b

命令:

1
mv log1.txt -b log2.txt

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost test5]# ll
-rw-r--r-- 1 root root 25 10-28 07:02 log1.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1
[root@localhost test5]# mv log1.txt -b log2.txt
mv:是否覆盖“log2.txt”? y
[root@localhost test5]# ll
-rw-r--r-- 1 root root 25 10-28 07:02 log2.txt
-rw-r--r-- 1 root root 13 10-28 06:16 log2.txt~
-rw-r--r-- 1 root root 29 10-28 06:05 test1.txt
drwxr-xr-x 2 root root 4096 10-25 17:56 test5-1
[root@localhost test5]#

说明:

-b 不接受参数,mv会去读取环境变量VERSION_CONTROL来作为备份策略。
--backup该选项指定如果目标文件存在时的动作,共有四种备份策略:

  1. CONTROL=none或off : 不备份。
  2. CONTROL=numbered或t:数字编号的备份
  3. CONTROL=existing或nil:如果存在以数字编号的备份,则继续编号备份m+1…n:执行mv操作前已存在以数字编号的文件log2.txt.1,那么再次执行将产生log2.txt2,以次类推。如果之前没有以数字编号的文件,则使用下面讲到的简单备份。
  4. CONTROL=simple或never:使用简单备份:在被覆盖前进行了简单备份,简单备份只能有一份,再次被覆盖时,简单备份也会被覆盖。

相关知识

  1. 默认地,标准的输入为键盘,但是也可以来自文件或管道(pipe |)。
  2. 默认地,标准的输出为终端(terminal),但是也可以重定向到文件,管道或后引号(backquotes `)。
  3. 默认地,标准的错误输出到终端,但是也可以重定向到文件。
  4. 标准的输入,输出和错误输出分别表示为STDIN,STDOUT,STDERR,也可以用0,1,2来表示。
  5. 其实除了以上常用的3中文件描述符,还有39也可以作为文件描述符。39你可以认为是执行某个地方的文件描述符,常被用来作为临时的中间描述符。

实例

  1. command 2>errfile : command的错误重定向到文件errfile。
  2. command 2>&1 | ...: command的错误重定向到标准输出,错误和标准输出都通过管道传给下个命令。
  3. var=`command 2>&1`: command的错误重定向到标准输出,错误和标准输出都赋值给var。
  4. command 3>&2 2>&1 1>&3 | ...:实现标准输出和错误输出的交换。
  5. var=`command 3>&2 2>&1 1>&3`:实现标准输出和错误输出的交换。
  6. command 2>&1 1>&2 | ... (wrong…) :这个不能实现标准输出和错误输出的交换。因为shell从左到右执行命令,当执行完2>&1后,错误输出已经和标准输出一样的,再执行 1>&2也没有意义。

“2>&1 file”和 “> file 2>&1”区别

  1. cat food 2>&1 >file :错误输出到终端,标准输出被重定向到文件file。
  2. cat food >file 2>&1 :标准输出被重定向到文件file,然后错误输出也重定向到和标准输出一样,所以也错误输出到文件file。

注意

通 常打开的文件在进程推出的时候自动的关闭,但是更好的办法是当你使用完以后立即关闭。用m<&-来关闭输入文件描述符m,用 m>&-来关闭输出文件描述符m。如果你需要关闭标准输入用<&-; >&- 被用来关闭标准输出。

同时输出到终端和文件 copy source dest | tee.exe copyerror.txt

参考

1)http://docstore.mik.ua/orelly/unix/upt/ch45_21.htm
2)http://www.unix.com/shell-programming-scripting/34011-meaning-dev-null-2-1-a.html
3)http://docstore.mik.ua/orelly/unix/upt/ch08_13.htm

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
#backup app
#
#newsnow liulipeng

gzipbin=/usr/bin
rmbin=/bin
egrepbin=/bin
echobin=/bin
chmodbin=/bin
rsyncbin=/usr/bin

backupDir=/www/app_backup

backupPath="/www/backup"

backupName="backup"

weekDayNow=`date +%d`

$chmodbin/chmod -R 755 $backupDir

echo Start App Backup`date "+%F %T"` >> $backupDir/backup.log


backupAppDir=$backupDir/$weekDayNow
#echo $backupAppDir
if [ ! -e $backupAppDir ]
then
mkdir -p $backupAppDir
fi

$rsyncbin/rsync -au $backupPath $backupAppDir

#liulipeng add为了提高备份速度减轻服务器压力,暂时先不压缩,硬盘空间需要优化时再开启压缩功能
cd $backupAppDir
tar -zcf $backupName.tar.gz $backupName
$rmbin/rm -rf $backupAppDir/$backupName


$chmodbin/chmod -R 0000 $backupDir
echo End App Backup`date "+%F %T"` >> $backupDir/backup.log

配置crontab

1
01 1 * * *  /bin/sh /usr/sbin/app_backup

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/sh

# check_mysql_slave status

# author www.izyue.com

export LANG=en_US.UTF-8

ip=eth0 #网卡名称

mysql_binfile=/usr/local/mysql/bin/mysql

mysql_user=root #MySQL数据库账号

mysql_pass='xxxxxx' #密码

mysql_sockfile=/tmp/mysql.sock

datetime=`date +"%Y-%m-%d/%H:%M:%S"` #获取当前时间

mysql_slave_logfile=/var/log/check_mysql_slave.log #日志文件路径,必须提前创建好

slave_ip=`ifconfig $ip|sed -n 2p | awk '{ print $2 }' | awk -F : '{ print $2 }'`

mail='xxxxxx@icloud.com'

array=($($mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "show slave status\G" | grep -i "running" | awk -F ': ' '{print $2}' | sed 's/ /---/g'))

if [ "${array[0]}" == "Yes" ] && [ "${array[1]}" == "Yes" ]
then
echo "slave is OK"
else
error=$(echo "${array[2]}" | sed 's/---/ /g')
echo -e "$datetime $slave_ip Slave is not running! \nSlave_SQL_Running_State: $error" >> $mysql_slave_logfile
echo -e "时间:$datetime IP:$slave_ip Slave is not running! \n\nSlave_SQL_Running_State: $error" | mail -s "$datetime $slave_ip Slave is not running!(紧急)" $mail

#$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "stop slave;"
#$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;"
#$mysql_binfile -u$mysql_user -p$mysql_pass -S $mysql_sockfile -e "start slave;"
fi

配置crontab

1
*/15 * * * * /bin/bash /usr/sbin/check_mysql_slave.sh >/dev/null 2>&1

Mysql备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#!/bin/bash
#dump mysql databases
#
#liulipeng

mysqlbin=/usr/local/mysql/bin
mysqldata=/www/mysql
dumpdir=/www/mysql_backup
sockfile=/tmp/mysql.sock
mysqlUser=root
mysqlPassword=123456

#dumpdbname="liu_emlog printonline_stat"
dumpdbname=`/bin/echo show databases | $mysqlbin/mysql -u$mysqlUser -p$mysqlPassword 2>/dev/null | /bin/egrep -wv "Database|information_schema|test"`
weekdaynow=`date +%m%d`
chmod -R 755 $dumpdir
cd $mysqldata
echo `date "+%F %T"` backup start >> $dumpdir/backup.log
for getdumpdbname in $dumpdbname
do

if [ ! -e $dumpdir/$getdumpdbname.$weekdaynow ]
then
mkdir $dumpdir/$getdumpdbname.$weekdaynow
chown mysql.mysql $dumpdir/$getdumpdbname.$weekdaynow
fi

dumptablename=`/bin/echo show tables | $mysqlbin/mysql -u$mysqlUser -p$mysqlPassword -D $getdumpdbname 2>/dev/null | grep -v "Tables_in_"`
#echo "/bin/echo show tables | $mysqlbin/mysql -S $sockfile -D $getdumpdbname"

/bin/rm -rf $dumpdir/$getdumpdbname.$weekdaynow/*

for getdumptablename in $dumptablename
do
$mysqlbin/mysqldump --skip-lock-tables --default-character-set=utf8 $getdumpdbname $getdumptablename > $dumpdir/$getdumpdbname.$weekdaynow/$getdumptablename.dump.`date +%w`
done

/bin/gzip $dumpdir/"$getdumpdbname.$weekdaynow"/*

done
echo `date "+%F %T"` backup end >> $dumpdir/backup.log
chmod -R 000 $dumpdir

配置crontab

1
01 23 * * * /bin/bash /usr/sbin/mysql_backup >/root/dump.log

目录点击这里:每天一个linux命令

今天学习一下linux中命令: rmdir命令。rmdir是常用的命令,该命令的功能是删除空目录,一个目录被删除之前必须是空的。(注意,rm - r dir命令可代替rmdir,但是有很大危险性。)删除某目录时也必须具有对父目录的写权限。

命令格式

1
rmdir [选项]... 目录...

命令功能

该命令从一个目录中删除一个或多个子目录项,删除某目录时也必须具有对父目录的写权限。

命令参数

  • - p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。
  • -v, --verbose 显示指令执行过程

命令实例

实例一:rmdir 不能删除非空目录

命令:

1
rmdir doc

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@localhost scf]# tree
.
|-- bin
|-- doc
| |-- info
| `-- product
|-- lib
|-- logs
| |-- info
| `-- product
`-- service
`-- deploy
|-- info
`-- product

12 directories, 0 files
[root@localhost scf]# rmdir doc
rmdir: doc: 目录非空
[root@localhost scf]# rmdir doc/info
[root@localhost scf]# rmdir doc/product
[root@localhost scf]# tree
.
|-- bin
|-- doc
|-- lib
|-- logs
| |-- info
| `-- product
`-- service
`-- deploy
|-- info
`-- product

10 directories, 0 files

说明:

rmdir 目录名 命令不能直接删除非空目录

实例2:rmdir -p 当子目录被删除后使它也成为空目录的话,则顺便一并删除

命令:

1
rmdir -p logs

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[root@localhost scf]# tree
.
|-- bin
|-- doc
|-- lib
|-- logs
| `-- product
`-- service
`-- deploy
|-- info
`-- product

10 directories, 0 files
[root@localhost scf]# rmdir -p logs
rmdir: logs: 目录非空
[root@localhost scf]# tree
.
|-- bin
|-- doc
|-- lib
|-- logs
| `-- product
`-- service
`-- deploy
|-- info
`-- product

9 directories, 0 files
[root@localhost scf]# rmdir -p logs/product
[root@localhost scf]# tree
.
|-- bin
|-- doc
|-- lib
`-- service
`-- deploy
|-- info
`-- product

7 directories, 0 files

怎么安装mysql数据库,这里不说了,只说它的主从复制,步骤如下:

主从服务器分别作以下操作

  1. 版本一致
  2. 初始化表,并在后台启动mysql
  3. 修改root的密码

修改主服务器master

vi /etc/my.cnf

1
2
3
[mysqld]
log-bin=mysql-bin //[必须]启用二进制日志
server-id=222 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

修改从服务器slave

vi /etc/my.cnf

1
2
3
[mysqld]
log-bin=mysql-bin //[不是必须]启用二进制日志
server-id=226 //[必须]服务器唯一ID,默认是1,一般取IP最后一段

重启两台服务器的mysql

1
/etc/init.d/mysql restart

在主服务器上建立帐户并授权slave

1
2
/usr/local/mysql/bin/mysql -uroot -pmttang   
mysql>GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'; //一般不用root帐号,"%"表示所有客户端都可能连,只要帐号,密码正确,此处可用具体客户端IP代替,如192.168.145.226,加强安全。

登录主服务器的mysql,查询master的状态

1
2
3
4
5
6
7
mysql>show master status;
+------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+------------------+----------+--------------+------------------+
| mysql-bin.000004 | 308 | | |
+------------------+----------+--------------+------------------+
1 row in set (0.00 sec)

注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

配置从服务器Slave

1
mysql>change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',master_log_file='mysql-bin.000004',master_log_pos=308;   //注意不要断开,308数字前后无单引号。

Mysql>start slave; //启动从服务器复制功能

检查从服务器复制功能状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mysql> show slave status\G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.222 //主服务器地址
Master_User: mysync //授权帐户名,尽量避免使用root
Master_Port: 3306 //数据库端口,部分版本没有此行
Connect_Retry: 60
Master_Log_File: mysql-bin.000004
Read_Master_Log_Pos: 600 //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Relay_Log_File: ddte-relay-bin.000003
Relay_Log_Pos: 251
Relay_Master_Log_File: mysql-bin.000004
Slave_IO_Running: Yes //此状态必须YES
Slave_SQL_Running: Yes //此状态必须YES
......

注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)。

以上操作过程,主从服务器配置完成。

主从服务器测试

主服务器Mysql,建立数据库,并在这个库中建表插入一条数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
mysql> create database hi_db;
Query OK, 1 row affected (0.00 sec)

mysql> use hi_db;
Database changed

mysql> create table hi_tb(id int(3),name char(10));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into hi_tb values(001,'bobu');
Query OK, 1 row affected (0.00 sec)

mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db |
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)

从服务器Mysql查询:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
mysql> show databases;

+--------------------+
| Database |
+--------------------+
| information_schema |
| hi_db | //I'M here,大家看到了吧
| mysql |
| test |
+--------------------+
4 rows in set (0.00 sec)

mysql> use hi_db
Database changed
mysql> select * from hi_tb; //查看主服务器上新增的具体数据
+------+------+
| id | name |
+------+------+
| 1 | bobu |
+------+------+
1 row in set (0.00 sec)

完成

编写一shell脚本,用nagios监控slave的两个yes(Slave_IO及Slave_SQL进程),如发现只有一个或零个yes,就表明主从有问题了,发短信警报吧。

主从常用命令

主服务器

  1. 重置master

    1
    reset master;
  2. 查询master的状态

    1
    show master status;

从服务器

  1. 启动slave

    1
    start slave;
  2. 停止slave

    1
    stop slave;
  3. 重置slave

    1
    reset slave;
  4. 查询slave的状态

    1
    show slave status;

Mysql 锁表于解锁

  1. 锁表

    1
    mysql> flush tables with read lock; 
  2. 解锁

    1
    mysql> unlock tables;

本文出自 “系统网络运维” 博客,请务必保留此出处http://369369.blog.51cto.com/319630/790921

锁表

将mysql的数据库锁表,仅仅允许读,以保证数据的一致性

1
mysql> flush tables with read lock;   

解锁

1
mysql> unlock tables;

参照 http://www.yiiframework.com/doc-2.0/yii-validators-validator.html#$builtInValidators-detail

验证器是所有验证程序的基类。

子类应该覆盖validatevalue()和/或validateattribute()方法提供执行数据验证的实际逻辑。子类也可以覆盖clientvalidateattribute()提供客户端验证支持。
验证器是一套 [[builtInValidators|built-in validators] 可以参考使用短名称。它们被列为如下:

  • boolean: yii\validators\BooleanValidator
  • captcha: yii\captcha\CaptchaValidator
  • compare: yii\validators\CompareValidator
  • date: yii\validators\DateValidator
  • default: yii\validators\DefaultValueValidator
  • double: yii\validators\NumberValidator
  • each: yii\validators\EachValidator
  • email: yii\validators\EmailValidator
  • exist: yii\validators\ExistValidator
  • file: yii\validators\FileValidator
  • filter: yii\validators\FilterValidator
  • image: yii\validators\ImageValidator
  • in: yii\validators\RangeValidator
  • integer: yii\validators\NumberValidator
  • match: yii\validators\RegularExpressionValidator
  • required: yii\validators\RequiredValidator
  • safe: yii\validators\SafeValidator
  • string: yii\validators\StringValidator
  • trim: yii\validators\FilterValidator
  • unique: yii\validators\UniqueValidator
  • url: yii\validators\UrlValidator
  • ip: yii\validators\IpValidator