vmstat命令含义

vmstat使用方法
vmstat [-a] [-n] [-S unit] [delay [ count]]
vmstat [-s] [-n] [-S unit]
vmstat [-m] [-n] [delay [ count]]
vmstat [-d] [-n] [delay [ count]]
vmstat [-p disk partition] [-n] [delay [ count]]
vmstat [-f]
vmstat [-V]

-a:显示活跃和非活跃内存
-f:显示从系统启动至今的fork数量 。
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示磁盘相关统计信息。
-p:显示指定磁盘分区统计信息
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。

[root@localhost ~]# vmstat -n 3 3
procs ———–memory———- —swap– —–io—- –system– —–cpu——
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 43608 73448 411300 6380692 0 0 0 6 0 0 0 0 99 0 0
0 0 43608 73448 411300 6380692 0 0 0 53 1025 1281 0 0 100 0 0
0 0 43608 73448 411300 6380692 0 0 0 40 1033 1261 0 0 100 0 0

procs
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
memory
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。
IO
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
system
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
cpu
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比

Procs
r: The number of processes waiting for run time.
b: The number of processes in uninterruptible sleep.

Memory
swpd: the amount of virtual memory used.
free: the amount of idle memory.
buff: the amount of memory used as buffers.
cache: the amount of memory used as cache.
inact: the amount of inactive memory. (-a option)
active: the amount of active memory. (-a option)

Swap
si: Amount of memory swapped in from disk (/s).
so: Amount of memory swapped to disk (/s).

IO
bi: Blocks received from a block device (blocks/s).
bo: Blocks sent to a block device (blocks/s).

System
in: The number of interrupts per second, including the clock.
cs: The number of context switches per second.

CPU
These are percentages of total CPU time.
us: Time spent running non-kernel code. (user time, including nice time)
sy: Time spent running kernel code. (system time)
id: Time spent idle. Prior to Linux 2.5.41, this includes IO-wait time.
wa: Time spent waiting for IO. Prior to Linux 2.5.41, included in idle.
st: Time stolen from a virtual machine. Prior to Linux 2.6.11, unknown.

基于innobackupex的mysql备份脚本

#! /bin/bash
#数据库相关信息
dbuser=root
dbpasswd=password
mycnf=/etc/mysql/my.cnf
#如果bin-log没有指定路径
dir_bin=/opt/mysql/mysqldata/mysqllog

#数据库备份的路径
install_dir=/opt/MySqlBackUp
data_dir=$install_dir/data
temp_dir=$install_dir/temp
log_dir=$install_dir/logs
bin_dir=$install_dir/bin

#接受邮箱
mail=chengfei@srt.com.cn

#备份文件名、日志名、备份日志
sj=`date +\%Y``date +\%m``date +\%d``date +\%H``date +\%M``date +\%S`
datafile=$sj"_data.tar.gz"
log=$sj".log"
binlogfile=$sj"_bin.tar.gz"

#使用mysqldump备份
#是否启动dump功能(0表示不启用,1表示启用)
dump_flag=1
#需要dump出来的数据库名
dumpdb=srtair
#dump文件名
dumpfile=$sj"_"$dumpdb".sql.gz"

#是否备份至远程
#是否启用ftp传输功能
ftp_flag=0
#ftp IP地址
ftp_ip=
#ftp 用户名
ftp_user=
#ftp 密码
ftp_passwd=
#上传ftp 路径
ftp_dir=

#读取my.cnf文件
process_readconfig()
{
echo "-----------开始读my.cnf文件--`date`-------------"
#没有具体路径情况或者有具体路径   
bin_log=`cat $mycnf | grep -i '^log-bin' | awk -F = '{print $2}'|sed s/\ //g`
#数据文件路径
datadir=`cat $mycnf | grep -i '^datadir' | awk -F = '{print $2}'|sed s/\ //g`
#需要判断是否有/,然后决定是否是全路径
#basedir路径
basedir=`cat $mycnf | grep -i '^basedir' | awk -F = '{print $2}'|sed s/\ //g`
}

#日志处理
process_binlog()
{
echo "……………………………开始备份日志文件--`date`………………………………">>"$log_dir/$log"
echo "……………………………开始备份日志文件--`date`………………………………"
echo "需要备份二进制日志列表……">>"$log_dir/$log"
ls -tl "$bin_log."[0-9]* >>"$log_dir/$log"
echo "开始备份二进制日志文件……"`date`>>"$log_dir/$log"
tar czvfP "$data_dir/$binlogfile" "$bin_log".[0-9]*
echo "结束备份二进制日志文件……"`date`>>"$log_dir/$log"

#删除一天以前的日志文件
echo "删除过期二进制日志文件……"`date`>>"$log_dir/$log"
echo "删除过期二进制日志列表……">>"$log_dir/$log"
find $dir_bin -type f -mtime +1>>"$log_dir/$log"
find $dir_bin -type f -mtime +1 -exec rm -f {} \;
echo "删除过期二进制日志文件结束……"`date`>>"$log_dir/$log"
echo "…………………………备份日志文件结束--`date`……………………………………">>"$log_dir/$log"
echo "…………………………备份日志文件结束--`date`……………………………………"
}

#数据备份
process_backup()
{
process_readconfig
#备份数据库
echo "……………………………开始备份数据文件--`date`………………………………"
echo "……………………………开始备份数据文件--`date`………………………………">>"$log_dir/$log"
source /root/.bash_profile
$bin_dir/innobackupex --user="$dbuser" --password="$dbpasswd" --defaults-file="$mycnf" --stream=tar "$temp_dir" 2>"$temp_dir/$sj"_tmp.log | gzip>"$data_dir/$datafile"
echo "……………………………备份数据文件结束--`date`………………………………">>"$log_dir/$log"
echo "……………………………备份数据文件结束--`date`………………………………"

cat "$temp_dir/$sj"_tmp.log>>"$log_dir/$log"
#删除7天以前备份数据和信息
echo "清理7天前备份数据与相关信息……"`date`>>"$log_dir/$log"
find $data_dir -type f -mtime +7>>"$log_dir/$log"
find $data_dir -type f -mtime +7 -exec rm -f {} \;

#mysqldump操作
if [ "$dump_flag" == 1 ]; then
echo "……………… mysqldump操作开始--`date`……………"
echo "……………… mysqldump操作开始--`date`………">>"$log_dir/$log"
 exp_sql
echo "……………… mysqldump操作结束--`date`…………">>"$log_dir/$log"
echo "……………… mysqldump操作结束--`date`……………………………"
fi

#登录mysql,切换日志
$basedir/bin/mysql -u$dbuser -p$dbpasswd<<XFF
flush logs;
exit
XFF
#备份日志文件
process_binlog

#ftp(没有写是否上传失败,成功)
if [ "$ftp_flag" == 1 ]; then
echo "……………… ftp操作开始--`date`……………"
echo "……………… ftp操作开始--`date`…………">>"$log_dir/$log"
 exec_ftp
echo "……………… ftp操作结束--`date`…………">>"$log_dir/$log"
echo "……………… ftp操作结束--`date`……………………………"
fi

#发送邮件 
process_send
}

process_send()
{
  #查找错误
  grep "Error" "$temp_dir/$sj"_tmp.log > "$temp_dir/$sj".err
  IP=`/sbin/ifconfig ${eth} | grep 'inet addr:'| awk '{print $2}' | awk -F : '{print $2}'`
  IP=`echo $IP|awk '{print $1}'`
  echo `grep "innobackupex: completed OK\!" "$temp_dir/$sj"_tmp.log | awk -F : '{print $4}'|sed s/\ //g`>"$temp_dir/$sj".good
  GOOD_COUNT=`cat "$temp_dir/$sj".good |wc -l`
  ERROR_COUNT=`cat  "$temp_dir/$sj".err |wc -l`
  if [ "$ERROR_COUNT" == 0 -a "$GOOD_COUNT" == 1 ]; then
     
     echo "`date`-----MySql备份成功-----">>"$log_dir"/result.log
     echo "-----------------------------------">>"$log_dir"/result.log
     echo "……………………………开始发送邮件--`date`………………………………"
     echo "……………………………开始发送邮件--`date`………………………………">>"$log_dir/$log"
     echo "MySql_Backup_Succeed" | mutt -s "$IP"_MySql_Backup_Succeed -a "$log_dir/$log" ${mail}
  else
     echo "`date`-----MySql备份失败,请检查$temp_dir"/"$sj"_tmp.log>>"$log_dir"/result.log
     echo "-----------------------------------">>"$log_dir"/result.log
     echo "……………………………开始发送邮件--`date`………………………………"
     echo "……………………………开始发送邮件--`date`……………………………">>"$log_dir/$log"
     cat "$temp_dir/$sj".err  | mutt -s "$IP"_MySql_Backup_Fail -a "$temp_dir/$sj"_tmp.log ${mail}
  fi 
   #删除7天前的日志文件
   find $temp_dir -type f -mtime +7 -exec rm -f {} \;
   echo "……………………………发送邮件结束--`date`………………………………">>"$log_dir/$log" 
   echo "……………………………发送邮件结束--`date`………………………………"  
}

#导出sql语句
exp_sql()
{
  mysqldump -u "$dbuser" -p"$dbpasswd"   --single-transaction --allow-keywords --add-locks   --add-drop-table  -F -q "$dumpdb" |gzip 1>"$data_dir/$dumpfile"
}

#ftp操作
exec_ftp()
{
  echo "#!/bin/bash">"$temp_dir/$sj"_ftp.sh
  echo "ftp -n $ftp_ip <<XFF">>"$temp_dir/$sj"_ftp.sh
  echo "user $ftp_user $ftp_passwd">>"$temp_dir/$sj"_ftp.sh
  echo "bin">>"$temp_dir/$sj"_ftp.sh
  echo "cd $ftp_dir">>"$temp_dir/$sj"_ftp.sh
  echo "lcd $data_dir">>"$temp_dir/$sj"_ftp.sh
  echo "put $datafile">>"$temp_dir/$sj"_ftp.sh
  echo "put $dumpfile">>"$temp_dir/$sj"_ftp.sh
  echo "put $binlogfile">>"$temp_dir/$sj"_ftp.sh
  echo "lcd $log_dir">>"$temp_dir/$sj"_ftp.sh
  echo "put $log">>"$temp_dir/$sj"_ftp.sh
  echo "close">>"$temp_dir/$sj"_ftp.sh
  echo "bye" >>"$temp_dir/$sj"_ftp.sh
  echo "XFF">>"$temp_dir/$sj"_ftp.sh
  chmod 777 "$temp_dir/$sj"_ftp.sh
  sh  "$temp_dir/$sj"_ftp.sh
}

#执行备份
process_backup

mysql_backup.sh程序安装说明

1、安装mysqlbackup程序
上传mysqlbackup到服务器/tmp目录
cd /tmp
unzip mysqlbackup.zip
cp /tmp/mysqlbackup/* /opt/mysql/product/5.1/bin
mkdir -p /opt/MySqlBackUp/bin
mkdir -p /opt/MySqlBackUp/data
mkdir -p /opt/MySqlBackUp/logs
mkdir -p /opt/MySqlBackUp/temp
ln -s /opt/mysql/product/5.1/bin/innobackupex /opt/MySqlBackUp/bin/innobackupex

对innobackupex进行授权
cd /opt/mysql/product/5.1/bin/
chmod +x innobackupex*
chmod +x xtrabackup*
chmod +x tar4ibd

cp /tmp/mysqlbackup/mysql_backup.sh /opt/MySqlBackUp/bin/
chmod 775 /opt/MySqlBackUp/bin/mysql_backup.sh

2、修改mysql_backup.sh中的相关数据
dbuser
dbpasswd
mail
dumpdb

3、配置mysql环境变量到root中
export MYSQL_BASE=/opt/mysql
export BASEDIR=$MYSQL_BASE/product/5.1
export DATADIR=$MYSQL_BASE/mysqldata
export LD_LIBRARY_PATH=$BASEDIR/lib:/lib:/usr/lib:/usr/local/lib
export TMPDIR=/tmp
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export PATH=${PATH}:$BASEDIR/bin:$MYSQL_BASE:$BASEDIR:$LD_LIBRARY_PATH

添加到/root/.bash_profile文件中

4、测试备份
cd /opt/MySqlBackUp/bin
./mysql_backup.sh

5、查看备份是否成功
cat /opt/MySqlBackUp/logs/result.log
如果提示备份成功,则表示程序安装成功,可能不熟到crontab中

6、部署crontab
0 1 * * * (cd /opt/MySqlBackUp/bin;sh ./mysql_backup.sh)

说明:参数配置,均是基于按照mysql安装路径配置

删除data guard归档日志

Oracle Data Guard 是通过归档文件来进行数据同步的。 主库的归档文件,我们可以在RMAN 备份的时候进行删除,但是备库的归档文件无法自动删除,需要写脚本来定时删除。

#!/bin/bash
export ORACLE_HOME=/opt/oracle/product/10.2.0/db_1
export ORACLE_SID=zjch
export ARCHIVE_DIR=/opt/oracle/oradata/zjch/archive
export LOG_FILE=/home/oracle/logs/del_archive.log

echo "开始删除归档日志:`date`……">>$LOG_FILE
if [ `whoami` != 'oracle' ]
then
echo "Error: You must be oracle to execute.">>$LOG_FILE
exit 99
fi

del_seq=`ls -tr $ARCHIVE_DIR/|grep -v stdarch | head -1|cut -f2 -d_`
$ORACLE_HOME/bin/sqlplus -silent "/ as sysdba" <<XFF>tmp.log
set pagesize 0 feedback off verify off heading off echo off
select max(sequence#) from v\$ARCHIVED_LOG where APPLIED='YES';
exit;
XFF
max_sn=`cat tmp.log`
rm tmp.log
max_sn=$(( $max_sn - 20 ))
#我这里是保留最近的20个归档文件,这个具体情况自己决定

while [[ ${del_seq} -lt ${max_sn} ]]
do
  echo "${ARCHIVE_DIR}/1_${del_seq}_681145105.dbf">>$LOG_FILE
  rm ${ARCHIVE_DIR}/1_${del_seq}_681145105.dbf
  #这里是我定义归档文件的格式,具体根据自己的归档文件格式来匹配,关键是匹配日志的sequence no。
  del_seq=$(( $del_seq + 1 ))
done
echo "删除归档日志结束:`date`……">>$LOG_FILE

#清楚controlfile中信息
$ORACLE_HOME/bin/rman target / <<XIFENFEI>>$LOG_FILE
crosscheck archivelog all;
delete expired archivelog all;
YES
exit;
XIFENFEI

echo "………………………………………………………………………………………………………………………">>$LOG_FILE

重点是在读取现在存在的归档日志文件中sequence最小值时,
使用了ls -tr $ARCHIVE_DIR/|grep -v stdarch | head -1|cut -f2 -d_

shell常见使用技巧

1、正则表达式判断(bash shell)

if [[ $PARTITION_NAME =~ '^P_((20[0-9]{4})|MAX)$' ]] ; then
echo 'yes'
else
echo 'no'
fi

重点:=~[[]]

2、shell编程读取文件中的行,并循环处理

cat PARTITION_NAME.cnf | while read P_LINE
do
PARTITION_NAME=`echo $P_LINE|awk  '{print $1}'`
echo $PARTITION_NAME
:
do

重点:while read

3.kill每个关键字进程

ps -ef|grep xifenfei|grep -v grep|awk '{print $2}'|xargs kill -9

重点:awk和xargs使用

4.删除几天前文件

find ./ -type f -name "*.txt" -mtime +1|xargs rm -rf
find ./ -type f -name "*.log" -mtime +1 -exec rm -fr {} \;

重点:find/mtime/xargs(exec )