mysql 数据库运维常用的 shell 脚本
作者:@下一站
- 2022-12-21 陕西
本文字数:12369 字
阅读完需:约 41 分钟
对于自动化运维,诸如备份恢复之类的,DBA 经常需要将 SQL 语句封装到 shell 脚本。本文描述了在 Linux 环境下 mysql 数据库中,shell 脚本下调用 sql 语句的几种方法,供大家参考。对于脚本输出的结果美化,需要进一步完善和调整。以下为具体的示例及其方法。
1、清除日志
apache日志每天进行轮转:
vim /usr/local/apache2/conf/extar/httpd-vhosts.conf
...
ErrorLog "| /usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/error_log-%Y%m%d 86400"
CustomLog "| /usr/local/apache2/bin/rotatelogs -l /usr/local/apache2/logs/access_log-%Y%m%d 86400" common
...
说明:
1. rotatelogs程序是apache自带的一个日志切割工具。 -l参数表示使用本地系统时间为标准切割,而不是GMT时区时间。
2. /usr/local/apache2/logs/access_log-%Y%m%d 86400
用来指定日志文件的位置和名称,其中86400用来指定分割时间默认单位为s,也就是24小时;
log-server上搭建rsync: ip 10.1.1.2
[root@log-server ~]# cat /etc/rsyncd.conf
[web1]
path = /web1/logs
uid = root
gid = root
read only = false
[web2]
path = /web2/logs
uid = root
gid = root
read only = false
echo rsync --daemon >> /etc/rc.local
web服务器上定义清理脚本
#!/bin/bash
#clean log
clean_log(){
remote_log_server=10.1.1.2
server=$1
log_dir=/usr/local/apache2/logs
log_tmp_dir=/tmp/log
host=`ifconfig eth0|sed -n '2p'|awk -F'[ :]+' '{print $4}'`
[ ! -d $log_tmp_dir ] && mkdir -p $log_tmp_dir
cd $log_dir
find ./ -daystart -mtime +3 -exec tar -uf $log_tmp_dir/`echo $host`_$(date +%F).tar {} \;
find ./ -daystart -mtime +3 -delete
cd $log_tmp_dir
rsync -a ./ $remote_log_server::$server && find ./ -daystart -mtime +1 -delete
}
jumper-server:
#!/bin/bash
#jumper-server
#菜单打印
trap '' 1 2 3
menu1(){
cat <<-END
请选择对web1的操作类型:
1. clean_apache_log
2. reload_apache_service
3. test_apache_service
4. remote login
END
}
menu2(){
cat <<-END
欢迎使用Jumper-server,请选择你要操作的主机:
1. DB1-Master
2. DB2-Slave
3. Web1
4. Web2
5. exit
END
}
push_pubkey(){
ip=$1
# 判断公钥文件是否存在,没有则生成公钥
[ ! -f ~/.ssh/id_rsa.pub ] && ssh-keygen -P "" -f ~/.ssh/id_rsa &>/dev/null
# 安装expect程序,与交互式程序对话(自动应答)
sudo rpm -q expect &>/dev/null
test $? -ne 0 && sudo yum -y install expect
#将跳板机上yunwei用户的公钥推送的指定服务器上
/usr/bin/expect<<-EOF
spawn ssh-copy-id -i root@$ip
expect {
"yes/no" { send "yes\r";exp_continue }
"password:" { send "111111\r" }
}
expect eof
EOF
}
while true
do
menu2
#让用户选择相应的操作
read -p "请输入你要操作的主机:" host
case $host in
1)
ssh root@10.1.1.2
;;
2)
ssh root@10.1.1.3
;;
3)
clear
menu1
read -p "请输入你的操作类型:" types
case $types in
1)
ssh root@10.1.1.1 clean_log web1
test $? -eq 0 && echo "日志清理完毕..."
;;
2)
service apache reload
;;
3)
wget http://10.1.1.1 &>/dev/null
test $? -eq 0 && echo "该web服务运行正常..." || echo "该web服务无法访问,请检查..."
;;
4)
ssh root@10.1.1.1
;;
"")
:
;;
esac
;;
5)
exit
;;
*)
clear
echo "输入错误,请重新输入..."
;;
esac
done
复制代码
二、备份策略
# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备
03 01 * * 0 bash /backup/full.sh
03 01 * * 1 bash /backup/incremental1.sh
03 01 * * 2 bash /backup/incremental2.sh
03 01 * * 3 bash /backup/full.sh
03 01 * * 4 bash /backup/incremental1.sh
03 01 * * 5 bash /backup/full.sh
03 01 * * 6 bash /backup/incremental1.sh
复制代码
三、mysql 数据库备份全量
#!/bin/bash
# Name: xtra_back_mysql.sh
# Desc:该脚本使用xtrabackup工具对mysql数据库进行增量备份,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./xtra_back_mysql.sh
# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备
#变量定义
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
conf_file=/usr/local/mysql/my.cnf
xtra_full_dir=/mydb3307/back_full
xtra_increment_dir=/mydb3307/back_increment
xtr_full_log=/mydb3307/log/full_$(date +%F).log
xtr_increment_log=/mydb3307/log/increment_$(date +%F).log
#全量备份
full_back()
{
#备份
/usr/bin/innobackupex --user=admin --password=123 $xtra_full_dir &> $xtr_full_log
full_name=$(ls -d $xtra_full_dir/$(date +%F)_*)
echo $full_name > $xtra_full_dir/full.txt
#应用日志
echo "++++++++++++++++++++++++我是分割符++++++++++++++++++++++++++" >> $xtr_full_log
/usr/bin/innobackupex --apply-log --redo-only $full_name &>> $xtr_full_log
}
full_back && find $xtra_full_dir -daystart -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null
复制代码
四、mysql 数据库增量备份之 xtrabackup1
#!/bin/bash
# Name: xtra_increment1_mysql.sh
# Desc:该脚本使用xtrabackup工具对mysql数据库进行第1次增量备份,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./xtra_increment1_mysql.sh
# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备
#变量定义
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
conf_file=/usr/local/mysql/my.cnf
xtra_full_dir=/mydb3307/back_full
xtra_increment_dir=/mydb3307/back_increment
xtr_full_log=/mydb3307/log/full_$(date +%F).log
xtr_increment_log=/mydb3307/log/increment_$(date +%F).log
#增量备份1
increment1_back()
{
#备份
full_name=`cat $xtra_full_dir/full.txt`
/usr/bin/innobackupex --user=admin --password=123 --incremental $xtra_increment_dir --incremental-basedir=$full_name &> $xtr_increment_log
increment1_dir=$(ls -d $xtra_increment_dir/$(date +%F)_*)
echo $increment1_dir > $xtra_increment_dir/increment1.txt
#应用日志
echo "++++++++++++++++++++++++我是分割符++++++++++++++++++++++++++" >> $xtr_increment_log
/usr/bin/innobackupex --apply-log --redo-only $full_name --incremental_dir=$increment1_dir &>> $xtr_increment_log
}
increment1_back && find $xtra_increment_dir -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null
复制代码
五、mysql 数据库增量备份之 xtrabackup2
#!/bin/bash
# Name: xtra_increment2_mysql.sh
# Desc:该脚本使用xtrabackup工具对mysql数据库进行第2次增量备份,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./xtra_increment2_mysql.sh
# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备
#变量定义
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
conf_file=/usr/local/mysql/my.cnf
xtra_full_dir=/mydb3307/back_full
xtra_increment_dir=/mydb3307/back_increment
xtr_full_log=/mydb3307/log/full_$(date +%F).log
xtr_increment_log=/mydb3307/log/increment_$(date +%F).log
#增量备份2
increment2_back()
{
#备份
full_name=`cat $xtra_full_dir/full.txt`
increment1_dir=`cat $xtra_increment_dir/increment1.txt`
/usr/bin/innobackupex --user=admin --password=123 --incremental $xtra_increment_dir --incremental-basedir=$increment1_dir &> $xtr_increment_log
increment2_dir=$(ls -d $xtra_increment_dir/$(date +%F)_*)
echo $increment2_dir > $xtra_increment_dir/increment2.txt
#应用日志
echo "+++++++++++++++++++++我是分割符++++++++++++++++" >> $xtr_increment_log
/usr/bin/innobackupex --apply-log $full_name --incremental_dir=$increment2_dir &>> $xtr_increment_log
}
increment2_back
复制代码
六、安装包方式安装 mysql
#!/bin/bash
##########################################################
# Script Name:install_mysql.sh #
# Describe:This Is Install From Source Mysql software. #
##########################################################
#
#=================================分割线==============================================
#
## mysql变量配置部分;
## 可根据需求修改变量选择网络自动安装或者本地源码包安装。
## 定制你的mysql;更改变量而无需更改脚本,不修改则使用默认配置。
#
# 是否已经下载源码包,随便写,只要这里有值就会直接找源码包而不是从网络自动下载
mysql_source_tar=
# 使用source_dir变量定义mysql源码包的存放位置;
source_dir=/root/tar
# 使用mysql_link变量定义mysql网络源码下载,下载的网站要写在 "" 中否则shell会认为这是一个文件或者目录;
mysql_link="wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.41.tar.gz"
# 使用mysql_version变量定义mysql版本信息;
mysql_version=mysql-5.6.41
# 使用mysql_to变量定义mysql的解压路径;
mysql_to=/usr/src/
# 使用mysql_boot变量定义mysql启动时的启动命令(默认启动命令service mysqld start);
mysql_boot=mysqld
# 使用mysql_dir变量定义mysql的安装路径;
mysql_dir=/usr/local/$mysql_version
# 使用mysql_port变量定义mysql的端口号;
mysql_port=3307
# 使用mysql_passwd变量设置mysql密码;此密码只可用于第一次登陆mysql;务必更改!
mysql_passwd=123.com
# 使用rm_anonymous变量设置是否移除匿名用户;y移除/n不移除;默认y移除;
rm_anonymous=yes
# 使用rm_remotely变量设置是否移除root用户远程登录;y移除/n不移除;默认y移除;
rm_remotely=yes
# 使用rm_test变量设置是否移除test测试表;y移除/n不移除;默认y移除;
rm_test=yes
# 是否开启防火墙;y开启/n不开启;默认y开启;
mysql_iptables=y
# 使用network变量定义对外网卡的名称;
network=eth0
# 使用mysql_tar变量定义mysql源码包名称(支持gz、bz、bz2、xz压缩方式的源码包);
mysql_tar=$mysql_version.tar.gz
# 使用mysql_data变量定义mysql数据文件(表、库等)的存储路径;
mysql_data=$mysql_dir/data
# 使用mysql_sock变量定义mysql启动时产生的.sock的文件存放位置;
mysql_sock=$mysql_data/mysql.sock
# 使用mysql_cnf变量定义mysql启动时产生的my.cnf
mysql_cnf=$mysql_dir/my.cnf
# 使用log_err变量来指定mysql的错误日志路径;
log_error=$mysql_data/mysql.log.err
# 使用log_bin变量来指定mysql的binlog日志存放路径;
log_bin=$mysql_data/mybinlog
# 使用relay_log变量来指定relaylog日志存放路径;
relay_log=$mysql_data/relay_log
# 使用install_mysql_log变量定义安装mysql的配置信息存放位置;
install_mysql_log=$source_dir/logs/
# 使用 mysql_file_log变量定义安装mysql的配置导入的文件名称;
mysql_file_log=install_mysql_log
# 安装完成自动登录mysql,有值则自动登录,无值则不自动登录;
log_mysql=y
#
#====================================分割线===========================================
#
## 函数部分;
rely_on(){
clear
echo "正在安装开发工具依赖包,请稍等 ······"
yum groupinstall -y "Development tools" &> /dev/null
if [ $? -eq 0 ];then
echo "已成功安装开发工具包 !!"
else
echo "安装开发工具依赖包失败,请检查yum源。或者手动安装 "Development tools" 包组 * *"
exit 2
fi
echo "正在安装相关依赖包,请稍等 ······"
yum install -y wget &> /dev/null
if [ $? -eq 0 ];then
echo "已成功安装 wget 包!!"
else
echo "安装依赖包 wget 失败,请检查yum源。或者手动安装 "wget" 包"
exit 2
fi
yum install -y cmake &> /dev/null
if [ $? -eq 0 ];then
echo "已成功安装 cmake 包!!"
else
echo "安装依赖包 cmake 失败,请检查yum源。或者手动安装 "cmake" 包"
exit 2
fi
yum install -y ncurses-devel &> /dev/null
if [ $? -eq 0 ];then
echo "已成功安装 ncurses-devel 包!!"
else
echo "安装依赖包 ncurses-devel 失败,请检查yum源。或者手动安装 "ncurses-devel" 包"
exit 2
fi
yum install -y pcre-devel &> /dev/null
if [ $? -eq 0 ];then
echo "已成功安装 pcre-devel 包!!"
else
echo "安装依赖包 pcre-devel 失败,请检查yum源。或者手动安装 "pcre-devel" 包"
exit 2
fi
yum install -y libcurl-devel &> /dev/null
if [ $? -eq 0 ];then
echo "已成功安装 libcurl-devel 包!!"
else
echo "安装依赖包 libcurl-devel 失败,请检查yum源。或者手动安装 "libcurl-devel" 包"
exit 2
fi
}
to_source(){
#rm -rf $mysql_to$mysql_version
#rm -rf $mysql_dir$mysql_version
rm -rf /etc/init.d$mysql_boot
useradd mysql -s /sbin/nologin -M &> /dev/null
mkdir $source_dir -p
mkdir $install_mysql_log/logs -p
cd $source_dir
}
link_source(){
if [ -n "$mysql_source_tar" ];then
echo "正在解压 mysql 源码包 !!"
cd $source_dir
tar xf $mysql_tar -C $mysql_to &> /dev/null
# rm -rf $mysql_tar
if [ $? -ne 0 ];then
clear
echo "==未检测到你的本地源码包=="
echo "《《请将源码包放在 $source_dir 目录下》》"
echo "!! 注意:如果源码包的版本不是 $mysql_version 请修改脚本变量 mysql_version 。"
echo "或者修改脚本变量 mysql_source_tar 。"
echo "或者这个源码包不可使用或者名字冲突···"
exit
fi
echo "解压完成!!"
fi
if [ -z "$mysql_source_tar" ];then
ping -c 1 -W 3 www.baidu.com &>/dev/null
if [ $? -eq 0 ];then
echo "正在下载 $mysql_version 源码包···"
cd $source_dir
rm -rf $mysql_tar
$mysql_link
if [ $? -eq 0 ];then
echo "下载 $mysql_version 源码包完成!!"
else
echo "下载 $mysql_version 源码包失败**"
exit
fi
echo "正在解压 mysql 源码包 !!"
cd $source_dir
tar xf $mysql_tar -C $mysql_to &> /dev/null
# rm -rf $mysql_tar
if [ $? -eq 0 ];then
echo "解压完成!!"
else
echo "解压失败!!"
exit
fi
#echo "已删除 mysql 源码包!"
else
clear
echo "==检测到您的网络未连接;这将使用本地源码包=="
echo "《《请将源码包放在 $source_dir 目录下》》"
echo "!! 注意:如果源码包的版本不是 $mysql_version 请修改脚本变量 mysql_version 。"
exit 2
fi
fi
}
configure(){
mkdir $mysql_dir -p
cd $mysql_to/$mysql_version
echo "正在配置mysql!!"
cmake . \
-DCMAKE_INSTALL_PREFIX=$mysql_dir/ \
-DMYSQL_DATADIR=$mysql_data \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DSYSCONFDIR=$mysql_dir/etc \
-DMYSQL_UNIX_ADDR=$mysql_sock \
-DSYSCONFDIR=$mysql_cnf \
-DMYSQL_TCP_PORT=$mysql_port \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DMYSQL_USER=mysql
if [ $? -eq 0 ];then
echo "配置mysql完成!!"
else
echo "配置mysql失败!!"
echo "这可能是缺少依赖包,或者环境出现问题,也有可能是包未成功下载,请检查···"
exit
fi
echo "即将配置编译安装 mysql;这需要一段时间,请准备咖啡,稍等片刻······"
make
if [ $? -eq 0 ];then
clear
echo "编译mysql完成!!"
echo "正在安装mysql!!"
else
echo "编译mysql失败!!"
echo "未知的错误,这可能是环境出现了问题···"
exit
fi
make install
}
my_conf(){
rm -rf /tmp/my.cnf
rm -rf /etc/my.cnf
rm -rf $mysql_dir/support-files/my.cnf
cat > $mysql_dir/support-files/my.cnf <<EOF
[mysqld]
log_bin = $log_bin
relay-log = $relay_log
basedir = $mysql_dir
datadir = $mysql_data
log-error = $log_error
socket = $mysql_sock
port = $mysql_port
#server_id = 10
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
cat > /tmp/my.cnf <<EOF
[mysqld]
log_bin = $log_bin
relay-log = $relay_log
basedir = $mysql_dir
datadir = $mysql_data
socket = $mysql_sock
port = $mysql_port
#server_id = 10
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
EOF
}
initial(){
chown -R mysql. $mysql_dir
cd $mysql_dir
scripts/mysql_install_db --user=mysql --basedir=$mysql_dir --datadir=$mysql_data
}
follow(){
cat /etc/profile | grep "PATH=$mysql_dir/bin:\$PATH"
[ $? -ne 0 ] && echo "PATH=$mysql_dir/bin:\$PATH" >> /etc/profile
source /etc/profile
cp $mysql_dir/support-files/mysql.server /etc/init.d/$mysql_boot
chmod +x /etc/init.d/$mysql_boot
cat ~/.bashrc | grep "alias mysql='mysql -S $mysql_sock'"
[ $? -ne 0 ] && echo "alias mysql='mysql -S $mysql_sock'" >> ~/.bashrc
source ~/.bashrc
chkconfig --add --level 35 $mysql_boot
service $mysql_boot start
cd $mysql_dir/bin/
source /etc/profile
source ~/.bashrc
}
secure_mysql(){
mysqladmin password "$mysql_passwd"
{
mysql_anonymous=yes
if [ $rm_anonymous = yes ];then
mysql -uroot -p$mysql_passwd -e "delete from mysql.user where user=''"
mysql_anonymous=no
fi
mysql_remotely=yes
if [ $rm_remotely = yes];then
mysql -uroot -p$mysql_passwd -e "delete from mysql.user where host='%'"
mysql_remotely=no
fi
mysql_test=yes
if [ $rm_test = yes ];then
mysql -uroot -p$mysql_passwd -e "drop database test"
mysql_test=no
fi
mysql -uroot -p$mysql_passwd -e "flush privileges"
} &> /dev/null
}
mysql_iptables(){
v1=
v2=
v3=
sed -i 's/enforcing/disable/' /etc/selinux/config
setenforce 0
v1=`uname -r | awk -F. '{print $4}'`
v2=`test $v1 = el6 &>/dev/null && echo "C6" || echo "C7"`
[ "$v2" = 'C6' ] && v3='Centos 6'
[ "$v2" = 'C7' ] && v3='Centos 7'
if [ "$mysql_iptables" = 'y' ];then
if [ "$v2" = 'C6' ];then
iptables -A INPUT -p TCP -i $network --dport $mysql_port --sport 1024:65534 -j ACCEPT # mysql
/etc/init.d/iptables save &> /dev/null
[ $? -eq 0 ] && echo "mysql 防火墙规则已经保存!!"
service iptables restart &> /dev/null
[ $? -eq 0 ] && echo "重启 iptables 成功!!"
fi
if [ $v2 = 'C7' ];then
yum -y remove firewalld &>/dev/null
[ $? -eq 0 ] && echo "已将firewalld防火墙卸载!"
yum -y install iptables-services &>/dev/null
[ $? -eq 0 ] && echo "安装iptables防火墙,成功!!"
systemctl enable iptables
[ $? -eq 0 ] && echo "已将iptables防火墙设置为开机自启动!"
iptables -A INPUT -p TCP -i $network --dport $mysql_port --sport 1024:65534 -j ACCEPT # mysql
service iptables save &>/dev/null
[ $? -eq 0 ] && echo "mysql 防火墙规则已经保存!!"
service iptables restart &> /dev/null
[ $? -eq 0 ] && echo "重启 iptables 成功!!"
sleep 1
fi
fi
if [ "$mysql_iptables" = 'n' ];then
if [ "$v2" = 'C6' ];then
service iptables stop &>/dev/null
chkconfig iptables off
echo "已永久关闭iptables防火墙!"
fi
if [ "$v2" = 'C7' ];then
yum -y remove firewalld &>/dev/null
[ $? -eq 0 ] && echo "已将firewalld防火墙卸载!"
fi
fi
}
ok_help(){
clear
echo "==========================================="
echo "= you are install software mysql [OK] !! ="
echo "==========================================="
echo "注意:"
echo " > 1.您的数据库密码被设置为 $mysql_passwd ; 默认密码被记录在 $install_mysql_log$mysql_file_log 文件中;"
echo " > 2.默认密码是十分不安全的!请使用命令 mysqladmin -uroot -p$mysql_passwd password 进行修改密码"
echo " > 3.您的 sock 的文件被指定在$mysql_sock 目录下。"
echo " > 4.您的mysql端口为$mysql_port;已为你添加防火墙规则!默认使用iptables防火墙并且会将您的selinux永久关闭!"
echo " > 5.已为你启动mysql;mysql的启动命令为 service $mysql_boot start 。"
echo " > 6.您的mysql安装配置信息已被导入到 $install_mysql_log$mysql_file_log 中。"
}
install_log(){
soft_date=`date -r $mysql_data | gawk -F' ' '{print $1,$2,$3,$5}' | sed 's/ //g'`
cat > $install_mysql_log$mysql_file_log <<-EOF
《《 You are install software MYSQL and configure message 》》
|
| > 您的系统版本为:$v3
|
| > 软件名称:MySql
|
| > 安装方式:编译安装
|
| > 软件版本:$mysql_version
|
| > 端口号:$mysql_port
|
| > 软件包解压路径:$mysql_to
|
| > 软件的安装路径:$mysql_dir
|
| > 数据的存储路径:$mysql_data
|
| > 软件的启动方式:service $mysql_boot start
|
| > .sock文件存放路径:$mysql_sock
|
| > 错误日志存储路径:$log_error
|
| > binlog存储路径:$log_bin
|
| > relaylog存储路径:$relay_log
|
| > 添加的防火墙规则:iptables -A INPUT -p TCP -i $network --dport $mysql_port --sport 1024:65534 -j ACCEPT # mysql
|
| > 配置文件路径:$mysql_cnf
|
| > 允许匿名用户登录:$mysql_anonymous
|
| > 允许mysql root 用户远程登录:$mysql_remotely
|
| > 是否存在test表:$mysql_test
|
| > 默认密码:$mysql_passwd
|
| > 软件的安装时间:$soft_date
|
|
EOF
}
#
#==================================分割线=====================================
#
## 脚本部分
# 安装依赖包
rely_on
# 安装源码包前的环境清理&&准备
to_source
# 网络下载|解压|清理源码包
link_source
# 进入mysql解压目录;配置、编译、安装;
configure
# 清理系统自带my.cnf文件导入自定义my.cnf配置
my_conf
# 更改目录属主属组;初始化 mysql 数据库
initial
# 添加mysql环境变量;添加mysql启动脚本;使用别名方式指定启动mysql的sock的文件;添加mysql自启动;启动mysql;进入mysql_secure_installation文件的目录;
follow
# 配置mysql密码;经过判断是否移除匿名用;禁止root远程登录;删除test表;刷新权限
secure_mysql
# 增加防火墙规则
mysql_iptables
# 安装完成后提示的信息
ok_help
# 导出安装 mysql 的配置信息
install_log
source /etc/profile
source ~/.bashrc
if [ -n "$log_mysql" ];then
mysql -p123.com
fi
复制代码
七、二进制方式安装 mysql
#!/bin/bash
# Name: install_mysql_glibc.sh
# Desc:该脚本用于通用的二进制包mysql的安装,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./install_mysql_glibc.sh
#变量定义
MySQLPro="mysql-5.6.35-linux-glibc2.5-x86_64"
package_name=${MySQLPro}.tar.gz
install_path=/usr/local/mysql/
soft_path=/soft/mysql
tmp_dir=/usr/src
#mysql用户检查
user_fun()
{
echo "###############mysql用户检查,请稍等片刻###############"
username=`grep -w mysql /etc/passwd|cut -d: -f1`
if [ $username = "mysql" ];then
echo "mysql用户已经存在."
return 5
else
echo "mysql用户不存在,马上帮您添加用户."
useradd -s /sbin/nologin mysql
return 6
fi
}
#判断mysql是否安装(rpm、source)
package_fun()
{
rpm1_name=`rpm -aq |grep mysql-server`
rpm2_name=`rpm -aq|grep MySQL-server`
rpm3_name=`rpm -aq|grep mysql-community-server`
if [ -z "$rpm1_name" -a -z "$rpm2_name" -a -z "$rpm3_name" ];then
echo "开始检测源码包是否安装,请小憩一会......"
if [ -d $install_path ];then
read -p "源码包默认路径:$install_path目录已存在,是否清空该目录?[yes/no]:" choice1
if [ $choice1 = yes ];then
pkill -9 mysqld
rm -rf $install_path/*
install_fun
else
exit 0
fi
else
echo "本机可以默认安装mysql程序,将为您开始安装$package_name.请稍等......"
install_fun
fi
else
package1=`echo $rpm1_name`
package2=`echo $rpm2_name`
package3=`echo $rpm3_name`
for i in $package1 $package2 $package3
do
test -n "$i" && name=`echo $i`
done
echo $name
read -p "rpm版本mysql已经安装,是否卸载?[yes/no]" choice2
if [ $choice2 = yes ];then
rpm -e $name --nodeps
rm -f /var/log/mysqld.log
package_fun
else
exit 0
fi
fi
}
#安装MySQL数据库
install_fun()
{
mkdir -p $install_path &>/dev/null
cd $soft_path
echo "正在解压软件包,请稍等......"
tar xf $package_name -C $tmp_dir/
echo "正在拷贝文件到安装位置,请稍等...."
cp -a $tmp_dir/$MySQLPro/* $install_path/
chown -R mysql:mysql $install_path
#数据库初始化
cd $install_path
echo "正在初始化数据库,请稍等...."
./scripts/mysql_install_db --datadir=/usr/local/mysql/data --user=mysql
#修改配置文件,这里只是简单举个例子,根据实际情况添加相应配置
cat >> $install_path/my.cnf <<EOF
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3307
socket = /usr/local/mysql/mysql.sock
EOF
#ServerID=`cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep "IPADDR" | awk -F '.' '{print $4}'`
#echo "server_id=${ServerID}" >> ./my.cnf
#复制启动脚本到/etc/init.d/下
cp support-files/mysql.server /etc/init.d/
chkconfig --add mysql.server
#启动数据库并且开机自启动
chkconfig mysql.server on
service mysql.server start
}
main_install()
{
echo "#***********************************#"
echo "#*******欢迎使用mysql安装脚本*******#"
echo "#*******如有问题请联系管理员********#"
echo "#***********************************#"
sleep 2
#开始执行,调用检测函数
user_fun
test $? -eq 5 && package_fun || package_fun
}
main_install
#环境变量设置
echo "export PATH=/usr/local/mysql/bin:$PATH" >>/etc/profile
source /etc/profile
source /etc/profile
#设置密码
mysqladmin -uroot password '123456' &>/dev/null
echo "数据库管理员root初始密码为:123456,请及时修改密码。"
exit 0
复制代码
八、用 xtrabackup 工具对 mysql 增量备份
#!/bin/bash
# Name: xtra_back_mysql.sh
# Desc:该脚本使用xtrabackup工具对mysql数据库进行增量备份,根据自己需求可以自行修改
# Path:课堂笔记目录里
# Usage:./xtra_back_mysql.sh
# 备份策略:周3、周5、周日全备,周1,周2,周4,周6增备
#变量定义
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
conf_file= $basedir/my.cnf
xtra_full_dir = /mydb3307/back_full
xtra_increment_dir = /mydb3307/back_increment
xtr_full_log = /mydb3307/log/full_`$date '+%F %T'`.log
xtr_increment_log = /mydb3307/log/increment_`$date '+%F %T'`.log
#全量备份
full_back()
{
#备份
/usr/bin/innobackupex --user=admin --password=123 $xtra_full_dir &> $xtr_full_log
full_name=$(ls -d $xtra_full_dir/$(date +%F)_*)
echo $full_name > $xtra_full_dir/full.txt
#应用日志
echo "++++++++++++++++++++++++我是分割符++++++++++++++++++++++++++" >> $xtr_full_log
/usr/bin/innobackupex --apply-log --redo-only $full_name &>> $xtr_full_log
}
#增量备份1
increment1_back()
{
#备份
full_name=`cat $xtra_full_dir/full.txt`
/usr/bin/innobackupex --user=admin --password=123 --incremental $xtra_increment_dir --incremental-basedir=$full_name &> $xtr_increment_log
increment1_dir=$(ls -d $xtra_increment_dir/$(date +%F)_*)
echo $increment1_dir > $xtra_increment_dir/increment1.txt
#应用日志
echo "++++++++++++++++++++++++我是分割符++++++++++++++++++++++++++" >> $xtr_increment_log
/usr/bin/innobackupex --apply-log --redo-only $full_name --incremental_dir=$increment1_dir &>> $xtr_increment_log
}
#增量备份2
increment2_back()
{
#备份
full_name=`cat $xtra_full_dir/full.txt`
increment1_dir=`cat $xtra_increment_dir/increment1.txt`
/usr/bin/innobackupex --user=admin --password=123 --incremental $xtra_increment_dir --incremental-basedir=$increment1_dir &> $xtr_increment_log
increment2_dir=$(ls -d $xtra_increment_dir/$(date +%F)_*)
echo $increment2_dir > $xtra_increment_dir/increment2.txt
#应用日志
echo "+++++++++++++++++++++我是分割符++++++++++++++++" >> $xtr_increment_log
/usr/bin/innobackupex --apply-log $full_name --incremental_dir=$increment2_dir &>> $xtr_increment_log
}
system_time=`date +%A`
if [ '$system_time' = 'Sunday' -o '$system_time' = 'Wednesday' -o '$system_time' = 'Friday' ];then
full_back && find $xtra_full_dir -daystart -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null
sleep 86400
elif [ '$system_time' = 'Thursday' -o '$system_time' = 'Saturday' -o '$system_time' = 'Monday'];then
increment1_back && find $xtra_increment_dir -type d -mtime +1 -exec rm -rf {} \; 2>/dev/null
sleep 86400
else
increment2_back
sleep 86400
fi
复制代码
划线
评论
复制
发布于: 2022-12-21阅读数: 16
版权声明: 本文为 InfoQ 作者【@下一站】的原创文章。
原文链接:【http://xie.infoq.cn/article/4893d48dc9341062b5feda189】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
@下一站
关注
懒人 2020-11-22 加入
都是黄泉预约客,何必难为每一天,执念太强,无法豁然。
评论