Archive for the ‘MySQL’ Category

Mysql备份脚本 带压缩 显示压缩率 日志

Friday, March 21st, 2008

#!/bin/sh
#
# Copyright (C), 2007 bug All Rights Reserved

# Title       : Database Backup Script
# Author      : BUG
# File        : db_bak.sh
# Version     : 1.1.0
# Date        : 2008-03-21
# Email       : efbbb27115@homtail.com
# License     : General Public License (GPL) v2
# Description : Database Backup Script
#

initial() {

    echo -en “\33[2J”

    echo -en “\33[0;0H”

    echo -en “\33[32m”

    echo “————————————————————”

    echo “—                Database Backup Script                —”

    echo “————————————————————”

    echo -en “\33[37m”

    stty -echo

    umask 077

    mysqln=`echo ’show databases;’ | /usr/local/mysql/bin/mysql -psjldafhkg | sed -n ‘3,$p’`

    mysqlu=“root”

    mysqlp=“********”

    binpath=“/usr/local/mysql/bin”

    dstpath=“/pri/bak/sql_bak/”

    runuser=`ps aux | grep $$ | sed -n “1p” | awk ‘{ print $1 }’`

    mkdir -p $dstpath/`date +%y%m%d`

    exec 3>>$dstpath/`date +%y%m%d`/db_bak.log

}initialecho -e “\n[`date +%y/%m/%d\ %H:%M:%S`] Database Backup Script start by $runuser PID:$$” >&3if [ -f “$dstpath/`date +%y%m%d`/lock” ]

then

    echo -e “\33[33mIt’s has completed by `cat $dstpath/\`date +%y%m%d\`/lock`!!!\33[37m”

    echo “[`date +%y/%m/%d\ %H:%M:%S`] It’s has completed by `cat $dstpath/\`date +%y%m%d\`/lock`!!!” >&3

else

    echo -e “Database\tExport\tCompress\tSql\tTgz\tRate”

    echo -e “\33[32m————————————————————\33[37m”

    cd $dstpath/`date +%y%m%d`

    for db in $mysqln

    do

    echo -n “$db”

    $binpath/mysqldump --opt -u$mysqlu -p$mysqlp $db > $dstpath/`date +%y%m%d`/$db.sql 2> /dev/null

    RETVAL1=$?

    if [ $RETVAL1 -eq 0 ]

    then

    sqlsize=`du -k $db.sql | cut -f1`

    echo -n “[`date +%y/%m/%d\ %H:%M:%S`]” >&3

    echo -n “$db” | awk ‘{printf ” %-17s”, $1}’ >&3

    echo -n “OK  ” >&3

    echo -en “\r\t\t  \33[32mOK\33[37m\t”

    tar -czvf $db.tgz $db.sql > /dev/null 2>&1

        RETVAL2=$?

        if [ $RETVAL2 -eq 0 ]

        then

        tgzsize=`du -k $db.tgz | cut -f1`

        echo “OK” >&3

        rm -f $dstpath/`date +%y%m%d`/$db.sql

        echo -en “   \33[32mOK\33[37m”

        echo -en “\33[33m”

        echo -en “$sqlsize” | awk ‘{printf “%12dKB”, $1}’

        echo -en “$tgzsize” | awk ‘{printf “%6sKB”, $1}’

        echo “$sqlsize $tgzsize” | awk ‘{printf “%8.0f%”,$2/$1*100}’

        echo -e “\33[37m”

        else

        echo “Compress fail return $RETVAL2″ >&3

        echo -e “  \33[31mfail\33[37m”

        fi

    else

    echo -n “[`date +%y/%m/%d\ %H:%M:%S`]” >&3

    echo -n “$db” | awk ‘{printf ” %-17s “, $1}’ >&3

    echo “Export fail return $RETVAL1″ >&3

    echo -en “\r\t\t   \33[31mfail\33[37m”

    fi

    done

    echo “`date +%H:%M:%S`”>$dstpath/`date +%y%m%d`/lock

fi

Mysql磁盘限额脚本 后期准备加入到主机系统内

Wednesday, March 5th, 2008

mysql用户限额的实现

原理:
由于每个用户的数据库都是以目录的形式存在于 ar /mysql或者其他目录下。
一个目录就是一个数据库。所以可以通过检测目录的大小得到数据库大小,判断
容量是否超过限额,如果超过限额就取消该用户的insert,create,update,create temp table
权限,允许select,delete等其他权限。

实现的脚本如下:
su-2.05b# cat quotamysql.sh
#!/bin/sh
#hmy-2004-8-19 v-0.1
mysqldir=/usr /mysql
infofiledir=/root/hmywork
limitfile=limitmysql
userfile=user_mysql
#定义初始变量
while [ 1 ];
do
sleep 10
#每隔10秒检查一次

for i in `cat ${infofiledir}/${userfile}`
do
now=`du ${mysqldir}/$i |tail -n 1 |awk ‘{print $1}’`
#取得当前目录大小
limit=`grep $i  ${infofiledir}/${limitfile}|awk ‘{print $2}’`
#取得限额大小
if [ “$now” -gt “$limit” ];
#如果大于限额就执行下面的mysql语句
then
mysql –user=MySql@AdminU_ser –password=***********<<EOF
use mysql
update db set insert_priv=’N’ ,update_priv=’N', create_priv=’N',Create_tmp_table_priv=’N'  where db=’$i’;
flush privileges ;
EOF
echo $i database full! `date`>;>;fulluser
sed /`echo $i`/d $userfile >;tempfile
fi
done
cp tempfile $userfile

Mysql安全优化

Thursday, September 27th, 2007

前段时间登陆了一台别人的服务器无意发现在运行中的MYSQL服务居然没有占用任何端口,且网站运行正常。了解后原来这是是Mysql的另一个连接方式,当在配置文件中my.cnf的[mysqld]字段加入skip-networking选项后,服务会不占用任何端口,而是采用文件mysql.sock的形式进行连接。

在启用该选项后,程序连接本机数据库时必须使用localhost的主机名进行连接。

由于此连接方式采用非TCP/IP的连接,可以杜绝从外来主机对数据库的攻击,建议开启

hibernate不支持此方式的连接

MySQL备份脚本

Thursday, August 30th, 2007

#!/bin/sh
#
# Copyright (C), 2007 bug All Rights Reserved
# Author     : BUG
# Version    : 1.0
# Date       : 2007-03-31
# Email      : efbbb27115@homtail.com
# License    : General Public License (GPL) v2
# Description: Database Backup Script
#
# mysqln    : mysql database name default is all-databases
# mysqlu    : mysql database user default is root
# mysqlp    : mysql database password default is null
# srcpath   : mysql bin path
# dstpath   : backup destination path
# logfile   : logfile name
# loghead   : logfile date info
# runuser   : current script running by users

mysqln=”mysql”
mysqlu=root
mysqlp=******
srcpath=/usr/local/mysql/var/
dstpath=”/mnt/bak/”
logfile=/mnt/bak/log/`date +%y%m%d`.log
loghead=[`date +%y/%m/%d\ %H:%M:%S`]
runuser=`ps aux | grep $$ | sed -n “1p” | awk ‘{ print $1 }’`

echo -en “\33[2J”
echo -en “\33[0;0H”
echo -en “\33[32m”
echo “$loghead Database Backup Script start by $runuser PID:$$” >> $logfile
echo “————————————————–”
echo “—        Database Backup Script Start        —”
echo “————————————————–”
echo -en “\33[37m”

rm -rf “$dstpath$(date +%y%m%d -d’-3 day’)”
mkdir -p “$dstpath$(date +%y%m%d)”

for file in $mysqln
do
/usr/local/mysql/bin/mysqldump –opt -u$mysqlu -p$mysqlp $file > $dstpath$(date +%y%m%d)/$file`date +%y$m%d`.sql 2> /dev/null
re1=$?
if [ “$re1″ -eq 0 ]
then
echo -n “$loghead” >> $logfile
echo -n “$file” | awk ‘{printf ” %-17s”, $1}’ >> $logfile
echo -n “database Export OK  ” >> $logfile
  echo -en “$file” | awk ‘{printf “%-17s  “, $1}’
echo -en “database Export \33[32mOK\33[37m  ”
tar -czvf “$dstpath$(date +%y%m%d)/$file`date +%y$m%d`.tgz” -P “$dstpath$(date +%y%m%d)/$file`date +%y$m%d`.sql” > /dev/null 2>&1
re2=$?
if [ “$re2″ -eq 0 ]
then
echo “tgz OK” >> $logfile
rm -f “$dstpath$(date +%y%m%d)/$file`date +%y$m%d`.sql”
echo -e “tgz \33[32mOK\33[37m”
else
echo “tgz file fail return $re2″ >> $logfile
echo -e “tgz \33[31mfail\33[37m”
fi
else
echo -n “$loghead” >> $logfile
echo -n “$file” | awk ‘{printf ” %-17s”, $1}’ >> $logfile
echo “database Export fail return $re1″ >> $logfile
echo -en “$file” | awk ‘{printf “%-17s  “, $1}’
echo -e “database Export \33[31mfail\33[37m”
fi
done
echo “” >> $logfile

从源代码编译安装MySQL

Wednesday, August 29th, 2007

groupadd -g 2000 mysql
useradd -u 2000 -g 2000 -M -s /sbin/nologin mysql 

 #./configure \
–prefix=/usr/local/mysql \
–without-debug \
–without-man \
–without-docs \
–without-bench \
–with-charset=utf8 \
–with-extra-charsets=gbk,big5,gb2312 \
–enable-thread-safe-client
–sharedstatedir=/var/lib/mysql \
–sysconfdir=/usr/local/etc \

#make
#make install
#/usr/local/mysql/bin/mysql_install_db
#chown mysql.mysql /usr/local/mysql/var

#cp mysql-5.0.45/support-files/my-medium.cnf /usr/local/etc/my.cnf
#cp mysql.server /etc/init.d/mysql
#chmod 755 /etc/init.d/mysql
#chkconfig –add mysql
#service mysql start

修复 Table ‘xxx’ is marked as crashed and should be repaired!!

Wednesday, August 29th, 2007

  今天在用自己写的脚本导出SQL的时候发生了错误,提示Table XXX is marked as crashed and should be repaired when using LOCK TABLES,应该是数据表结构或内容损坏,使用命令myisamchk修复数据库的MYI文件即可

myisamchk -c -r *.MYI