暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

数据库自动化运维

成为DBA 2021-08-27
1039

自动化运维的意义

对于少量的服务器,可以通过手动去管理运维,若服务器数量很多,并且处理的工作又是定时定期的重复内容,DBA则可能无法应对,此时需要一些脚本来实现某些功能。因此自动化运维可以大大提高dba的效率。自动化运维具有重要意义。

   编写脚本可以通过shell或者Python等多种方式。以下简单介绍一下shell。

Shell介绍

Shell是一个命令解析器编程语言分为低级语言和高级语言低级语言为机器语言和汇编语言,二者都是面向机器的语言高级语言分为静态语言和动态语言。

静态语言:是编译型语言,代码编写完成后,需要编译器将其直接转换成二进制后即可独立运行。

GCClinux平台最常用的编译器。

Shell脚本:linux命令或者语句放在一个文件中,通过这个程序文件执行,这个文件被称为shell脚本或者shell程序。通常以.sh结尾。

#!/bin/bash:指定使用那种shell作为命令解释器,不指定,则以当前shell作为可执行的shell。

Chmod +x test.sh 赋予脚本可执行权限。

执行;若脚本在当前路径,则使用./执行,若脚本不在当前路径,可使用绝对路径执行 bin/test.sh

Shell变量

注意点:

变量名通常是大写字母,也可以是数字、字母、下划线组成。要区分大小写,不能以数字开头;

“=”两边不能有空格出现;

调用变量使用“$”,有时候使用“${}”消除歧义。

例:echo$var4 #打印变量var4的内容

Echo${var4}db.log #打印变量var4并加上db.log  最终为var4db.log。

格式化输出:

Data+”%Y-%M-%d” #打印日期,一般备份数据要用到。

Data +%Y%m%d:显示当天的年月日

Data -d”+1 day”+%Y%m%d:显示明天的日期

Data -d”-1 day”+%Y%m%d:显示天的日期

显示下个月或者下一年 ,将day更换为month、year。

设定设定具体的时间:

Data -s 20180823 设置成20210202形状;

Data -s 01:01:01: 设置具体的时间;

Data -s“2018-05-21 01:01:01”设置日期和时间。

备注:%y年份只显示2位,%Y年份显示4位。

 

案例:echo `date` 反引号作用是把引起来的命令的执行结果交给前一个命令。

Echo $(date) #$()与反引号作用相同。

命令嵌套使用

$($()),先执行里面的在把结果交给外边的。

Shell中单引号和双引号的区别

‘’在单引号中所有的字符包括特殊字符,($、``、\)豆浆解释成字符本身二成为普通字符。

“”在双引号中,除$、``和\以外,所有的字符都解释成字符本身,拥有调用变量、引用命令、转义符的特殊含义。

“\”是转义符,更在这个之后的字符都解释成字符本身,变为普通字符。

单引号之间的内容原封不动赋值给变量,双引号之间的内容除了特殊符号会保留特殊含义。

删除变量

Unset 变量名

环境变量

Env 命令查看所有全局变量

使用export命令把局部变量输出位全局变量

例如:

Export N=alan

Echo $N

输出为alan

建立脚本vim a.sh

#!/bin/bash

Echo $N

执行脚本:bash a.sh    #引用全局变量

输出为alan

 

让全局变量永久生效,可以将变量写入配置文件中

当启动一个ssh连接bash,一定会加载下面四个配置文件。

/etc/profile  全局环境和登录系统的一些配置

/etc/bashrc   shell全局自定配置

/root/.bashrc  单独自定义某个用户的bash

/root/.bash_profile  单独自定义某个环境

Shell位置变量

$0:获取当前执行shell脚本文件的文件名;

$n;获取当前脚本的第n个参数。

特殊变量

$*”用双引号括起来表示输出所有的参数;

$#:传递到脚本的参数个数;

$$:当前进程的PID

$?:显示最后命令的退出状态;0表示没有错误,其他任何值表明有错误;

$!:后台运行的最后一个PID

数学运算

Expr命令

数值、符号、命令之间都需要空格;

输出结果0为假,1为真。

例如:expr 2 \> 5  输出为0,表示假。

Expr 3 \* 5  输出为15

$(())在双括号中,所有变量可以不加入$符号前缀。

特殊变量

$0 这个程式的执行名字$n 这个程式的第n个参数值,n=1..9$* 这个程式的所有参数,此选项参数可超过9个。$# 这个程式的参数个数$$ 这个程式的PID(脚本运行的当前进程ID)$! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID)

 $? 执行上一个指令的返回值

条件测试语句和流程控制语句if的使用

Read命令用于从键盘读取变量的值,用于shell脚本与用户进行交互的场合。

Read 变量名   在键盘标准输入。

赋值多个变量 变量名以及变量值之间空格隔开。

当赋值的数量大于变量名的时候,超出来的值全部赋值给最后一个变量。 若赋值数量小于变量名,则没有赋值的全部为空。

其他用法:

Read -s passwd

将标椎输入的内容隐藏起来传递给参数。

Read -p  #给出提示

Read -t 2 time #超过两秒没有输入直接退出

Read -n 2 test #最多能输入2个字符。

 

流程控制语句if

单分支if语句

 

If 条件

Then

  Commands   #执行命令的主体

Fi

 

双分支语句

If command ;then

 

   Commands  #if 为真时候执行

Else 

  Commands  #if为假的时候执行

Fi

多分支if语句

If 条件测试操作 1 then

Commands            #如果条件1满足,则执行

Elif 条件测试操作 2 then

Commands                #如果条件2满足,则执行

……

Else

 

Commands    #如果以上条件都无法满足,则执行命令主体

 

Fi

 

Test测试命令及数值比较

Shell中的test命令用于检查某个条件是否成立,可以比较数值、字符和文件。

格式:test 测试条件

数值比较

-eq  等于则为真     例如$a”  -eq “$b”

-ne  不等于则为真   例如 $a” -nq “$b”

-gt  大于则为真   例如 $a” -gt “$b”

-ge  大于等于则为真   例如 $a” -ge “$b”

-lt 小于则为真   例如 $a”  -lt “$b”

-le  小于等于则为真   例如 $a” -le “$b”

字符串比较

 

参数

说明

事例

=

等于则为真

$a”  =“$b”

!=

不相等则为真

$a” !=“$b”

-z 字符串

字符串长度为0则为真

-z “$b”

-n 字符串

字符串的长度不为空则为真

-n “$a”

Str1>str2

Str1大于str2为真

Str1 \>str2

Str1<str2

Str1小于str2为真

Str1 \<str2

流程控制过程中和shell中的通配符

&& 逻辑与 -a

|| 逻辑或 -o

[[...]]和[...]的区别。

[[...]]运算符是[...]运算符的扩充;[[...]]能够支持*,<、>等符号且不需要转义符。

if[[ $USER =r* ]] ; then echo "hello,$USER" ;else echo $USER not ; fi

注意:$USER=r*,对比时,r*表示以r开头的任意长度字符串,这样就包括 root。

当只有一个[ ]时。

if[$USER=r*];then echo "hello,$USER" ;else echo $USER not ; fi

#对比[[r*]],这里的[r*]仅用来表示两个字符r*。所以字符*并没有被当做通配符来执行。

 

Shell中的通配符

*  匹配0个或多个字符

匹配任意一个字符  

[list]  a[xyz]b:a与b之间必须且只能有一个字符,只能是list中的任意单一字符如axb、ayb、azb

[!list] 匹配除list中任意单一字符

[c1-c2] 匹配[c1-c2]中任意单一字符 [0-9]

{string1string2…} 匹配这个中其一的字符串。

 

For ((expr1; expr2; expr3))

expr1:指定初始条件;

expr2:判断什么时候退出循环;

expr3:修改expr1的变量值。

例如:for ((i=1; i<=10; i++))

流程控制语句

Case语句

流程控制语句来实现对流程的选择、循环、转向和返回等。Case语句是控制语句的一个组成部分。

Case  变量或表达式  in

        变量或表达式1)

             命令序列1

          ;;

        变量或表达式2)

            命令序列2

          ;;

....

*)

    默认命令序列

Esac

 

变量或者表达式的值与变量或者表达式1的值比较,若相同,则执行命令序列1,遇到双分号则跳转到esac结束,不同则变量与表达式与变量或表达式2比较以此类推,若都不同则执行*后面的默认命令序列。

实例:

编写一个启动apache的服务脚本

 

Vim case1.sh

#!Bin/bash

Case $1 in

     Start)

           Systemctl $1 httpd

           Ps aux| grep httpd

          Echo httpd start

;;

    Stop)

            Systemctl $1 httpd

           Ps aux| grep httpd

          Echo httpd stop

;;

   Status)

            Systemctl $1 httpd

;;

     Restart)

         Systemctl $1 httpd

        Echo httpd restart

;;

*)

       Echo usage:$0 start|stop|restart

Esac

 

 

For循环语句

语法结构:

For var in list

do

 Commands

done

Var:变量

in:取值

List:取值列表

Commands:执行命令的主体

取值列表的值赋给变量,而后在命令处执行,当取值列表中的值赋值结束时,循环停止。

示例:

Vim test2.sh

#!/bin/bash

For var in a1 b1 c1 d1

do

Echo the text is $var

Done

 

自定义shell分隔符

指定单个字符作为分隔符,IFS=: 表示以“:”作为分隔符;

指定多个分隔符 IFS=\n:;

 

While循环语句和嵌套语句

重复测试语句中的条件,只要条件成立就执行循环体对应的命令操作,知道条件不成立时停止循环。

语法

While 条件

Do

命令

Done

 

示例

#!/bin/bash

Var=10

Var while [ $var -gt 0 ]

Do

Echo $var

Var=$[$var-1]

Done

 

跳出循环

有时需要在未达到循环结束时强制跳出循环,shell提供两个命令来实现该功能,break、continue。

Break:跳出整个循环;

执行循环体之后的语句,默认是break1 break3表示跳出第三层循环。

Continue:进入下一个循环,如果后面加数字2,则表示跳出后面的2次循环。

$(命令)等同于$ ‘命令

 

Shift参数左移命令

Shift命令用于对参数进行移动。每执行一次,参数序列顺序左移一个位置,$#的值减1,用于分别处理每个参数,移出去的参数不再可用。

函数使用

函数是一个代码块,可以自定义,可以在shell任何位置使用,只要使用函数的函数名就可以。使用函数的好处是模块化、代码可读性强。

创建函数:

Function name{

                Commands

}

或者name(){

            Commands

           }

如果一个脚本中定义了重复的函数名,以最后一个为准。

返回值

也称为状态码。返回值范围0~255,只有9表示执行成功剩下表示失败。

Exit 数字和return 数字区别。

Exit:整个脚本直接退出,返回数字。

Return:只是在函数最后一行添加,然后返回数字,只能让函数后面的的命令不执行。

默认情况下在脚本中定义的变量都是全局变量,在函数外面定义的变量函数内也可以使用。

 

示例:

Mysql自动化备份脚本

脚本编写思路如下。

(1)检查一下运行环境:目录是否存在;时间;权限;用户。

(2)运行要执行的命令:备份、导出数据。

(3)把命令执行过程中没有用的文件删除。

(4)弹出命令运行成功的消息。

BAKDIR=/data/backup/mysql/’date+%Y-%m-%d’

Mysqldb=alan   #定义mysql数据库

Mysqlusr=root  #定义mysql登录用户

Mysqlpw=123456  #定义mysql登录密码

###检查使用root用户运行

If [$UID -ne 0 ];then

Echo this script must use the root user

Sleep 2

Exit 0

Fi

###判断目录是否存在,不存在则创建

If 

[ !-d $bakdir];then

Mkdir -p $bakdir

Else  

Echo this is $ bakdir exists

Exit

Fi

###使用MySQLdump备份数据库

/usr/bin/mysqldump -u$mysqlpw $mysqldb>$bakdir/${mysqldb}_db.sql

Cd $bakdir;tar -cvf ${mysqldb}_db.tar.gz*.sql

###查看备份目录下以.sql结尾的文件并删除

Find $bakdir -type f -name*.sql -exec rm -rf {} \;

###如果数据库备份成功,则打印成功,并删除备份目录下面的30天以前的目录

[$? -eq 0]&& echo “this ‘date+%Y-%m-%d’mysql backup is success”

Cd /data/backup/mysql/ && find. -type d -mtime+30|xargs rm -rf

Echo “the mysql backup successfully”

 


文章转载自成为DBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论