Shell变量的作用、类型,及如何利用脚本配合任务计划远程备份mysql数据库

本文涉及的产品
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
简介: Shell变量的作用、类型,及如何利用脚本配合任务计划远程备份mysql数据库

shell变量的作用、类型


(1)变量的作用


  • 为灵活管理Linux系统提供特定参数,有两层意思
  • 变量名:使用固定的名称或由系统预设或者用户定义
  • 变量值:能够根据用户设置或系统环境的变化而变化


(2)变量的类型


  • 自定义变量:由用户自己定义、修改和使用
  • 环境变量:由系统维护,用于设置工作环境(改变系统环境的变量)
  • 位置变量:通过命令行给脚本程序传递参数(可以理解为脚本后面跟的字段)
  • 预定义变量:Bash中内置的一类变量,不能直接修改


一、自定义变量


(1)定义一个新的变量


  • 格式:变量名=变量值
  • 变量名以字母或者下划线开头,区分大小写,建议全大写(小写也不影响)


(2)查看变量的值


  • 格式:echo $变量名
  • 删除变量:unset 变量名


示例:

[root@localhost ~]# A=AAA
[root@localhost ~]# B=BBB
[root@localhost ~]# echo $A
AAA
[root@localhost ~]# echo $A $B
AAA BBB

当变量名称容易和紧跟其后的其他字符混淆时,需要使用 ’ { } ‘ 将变量名称括起来

[root@localhost ~]# echo $Aaaa
[root@localhost ~]# echo $A aaa
AAA aaa
[root@localhost ~]# echo ${A}aaa
AAAaaa

(3) 赋值时使用引号

- 双引号:允许通过$符号引用其他变量值 “ ”
- 单引号:禁止引用其他变量值,$视为普通字符 ' '
- 反撇号:命令替换,提取命令执行后的输出结果,也可以使用 $() 代替,可以处理嵌套命令  ``
($()   一般用的更多一点,比 反撇号更加直观,所以一般直接使用$() ,不过也可以根据个人喜好) 

(4)从键盘输入内容为变量赋值


  • 格式:read [ -p “提示信息” ] 变量名
    示例:
[root@localhost ~]#a=class
[root@localhost ~]#b=36
[root@localhost ~]#echo  $a $b
class 36
[root@localhost ~]#echo $aa
classa
[root@localhost ~]#c=class 36
-bash:  36:未找到命令
[root@localhost ~]#c="class 36"
[root@localhost ~]#echo $c
class 36
[root@localhost ~]#class="class $b"
[root@localhost ~]#echo  $class
class 36    ($b=36)
[root@localhost ~]#class2='class $b'
[root@localhost ~]#echo $class2
class $b    `(单引号不引用变量$视为普通字符)`
[root@localhost ~]#which useradd
/usr/sbin/useradd
[root@localhost ~]#ls -lh `which useradd`   
`(ls -lh $(which useradd) 也是一样的)`
-rexr-xr-x. 1  root root 135k 8月   9  2020 /usr/sbin/useradd
[root@localhost ~]#rpm -qf /usr/sbin/useradd
shadow-utils-4.6-5.e17.x86_64
[root@localhost ~]#rpm -qc shadow-utils-4.6-5.e17.x86_64
/etc/default/useradd
/etc/login.defs
[root@localhost ~]# rpm -qc `rpm -qf `which useradd``  
`(rpm -qc $(rpm -qf $(which useradd))一样的)`
/etc/default/useradd
/etc/login.defs
[root@localhost ~]#read aaa    
`(使用read给变量aaa赋值)`
/opt/backup    (这个是自己输入的,也就是变量aaa的变量值)
[root@localhost ~]#echo $aaa
/opt/backup
[root@localhost ~]# read -p "请指定备份存放目录:" bbb  
`(-p会输出指定的提示信息交互式变量)`
请指定备份存放目录:/opt/backup
[root@localhost ~]#echo $bbb
/opt/backup

(5)设置变量的作用范围


-局部变量与全局变量

局部变量:只在当前shell环境中有效


  • 变量名=变量值
    全局变量:在所有shell环境中有效(有两种全局变量的格式)
    格式一:export 变量名 … (把已经创建好的变量变成全局变量)
    格式二:export 变量名=变量值 … (创建的时候直接创建全局变量)
    ————两种格式可以混合使用————
 [root@localhost ~]# echo  "$A  $B"
 aaa  bbb             `(A=aaa  B=bbb)`
 [root@localhost ~]# export A 
 `(导出A为全局变量)`
 [root@localhost ~]# bash  
 `(换一个shell环境)`
 [root@localhost ~]# echo "$A $B"
 aaa     `(因为A是全局变量B不是,所以只会显示A的变量值)`

(6)整数变量的运算


  • 格式:expr 变量1 运算符 变量2 运算符 变量3 …


(7)常用运算符


  • 加法运算: +
  • 减法运算: -
  • 乘法运算: *
  • 除法运算: /
  • 求模(取余)运算: %
  • 命令嵌套: $()
  • 解决变量名混淆问题: ${}
  • 实现整数的混合运算: $(())


变量运算示例

[root@localhost ~]# x=3
[root@localhost ~]# echo $x
3
[root@localhost ~]# y=4
[root@localhost ~]# expr $x + $y
7
[root@localhost ~]# expr $x % $y
3
[root@localhost ~]# expr $y % $x
1
[root@aaa ~]# B="$(expr $A + 1 )" 
`(可以这样去定义变量的算数,中间有空格)`
[root@aaa ~]# A=0
[root@aaa ~]# echo "$(expr $A + $B )"
1

二、特殊的shell变量


(1)环境变量


  • 由系统提前创建,用来设置用户的工作环境
  • 配置文件: /etc/profile 、 ~/.bash_profile (家目录下的)
    查看当前环境变量
    env


(2)常见的环境变量


  • PWD 、 PATH
  • USER、SHELL、HOME
[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:
/usr/bin:/root/bin
[root@localhost ~]# PATH="$PATH:/root"   
`(改变系统变量)`
[root@localhost ~]# echo $PATH
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:
/usr/bin:/root/bin:/root
`(在末尾加了:root)`


示例:制作用户登录的欢迎脚本

[root@localhost ~]# vim /opt/welcome.sh
#!/bin/bash
echo "用户 $USER 
 您好!欢迎你登录!"
[root@localhost ~]# chmod +x /opt/welcome.sh 
[root@localhost ~]# vim /etc/profile
在文件末尾添加
source /opt/welcome.sh   (每次登录时执行脚本)
[root@localhost ~]# su - ly
上一次登录:一 7月  1 11:19:51 CST 2019pts/0 上
用户 ly 
 您好!欢迎你登录!
[ly@localhost ~]$ 

(2)位置变量


表示为 $n ,n 为 1 ~ 9之间的数字

[root@localhost ~]# ./myprog.sh one two three four five six

$1,第1个位置参数 (如one 就是第一个位置参数)

$2,第2个位置参数 (如two就是第二个位置参数)

$6,第6个位置参数 (如six就是第六个位置参数)

$0 为当前脚本的位置,即当前脚本


(3)预定义变量


$#:命令行中位置变量的个数 (即脚本后面跟的位置变量的总和)

$*:所有位置变量的内容 (即脚本后面跟的所有的位置变量的名称)

$@:所以位置变量的内容 (每个参数当作单个个体,利用for循环可以查看,需要使用""括起来)

$?:上一条命令执行后返回的状态,当返回状态值为0时表示执行正常,非0值表示执行异常或出错 (一般都输出1)

$0:当前执行的进程/程序名 (即当前脚本名)

$$:显示当前shell脚本执行的pid

$!:显示最后shell脚本执行的pid (利用shell嵌套使用,显示的pid是被嵌套的脚本)


预定义变量与特殊变量的结合示例

[root@localhost ~]# vim mybak.sh
#!/bin/bash
A=beifen-$(date +%F).tgz
tar zcf $A $* &> /dev/null        (tar zcf 使用归档)
echo "已执行 $0 脚本,"
echo "共完成 $# 个对象的备份"
echo “具体内容包括: $*” 
[root@localhost ~]# ./mybak.sh  /etc/passwd  /etc/shadow 
已执行 ./mybak.sh 脚本,
共完成 2 个对象的备份
具体包括:/etc/passwd /etc/shadow
[root@localhost ~]#vim myprog.sh
#!/bin/bash
# 这是一个显示位置变量和预定义变量的脚本
# 计算求和
A=$(expr $1 + $2 + $3 + $4 )
echo "命令行中位置变量的个数: $#"
echo "所有位置变量的内容:$*"
echo "第2个位置变量为:$2 "
echo "当前脚本的名称:$0"
echo "这4个数字的和为:$A"
[root@localhost ~]# chmod +x myprog.sh   (给可执行权限)
[root@localhost ~]#./myprog.sh 10 20 30 40    
[root@localhost ~]#./myprog.sh 10 20 30 
[root@localhost ~]#./myprog.sh 10 20 30 40 50

20201129162534776.png20201129162541711.png20201129162546569.png

(发现当脚本后的位置变量不够或者多的话,有些是无法计算,或者无法显示的)


shell脚本与计划任务


一、脚本应用思路


(1)确定命令操作(设计并执行任务)

mysql数据库服务器 192.168.10.1


(得先安装mysql 数据库,或者mairadb也可以,mysql用源码包,mairadb用本地光盘yum源就可以)

[root@localhost ~]# netstat -anput | grep 3306  
`(看一下mysql是否开启)`
[root@localhost ~]# mysql -uroot -p123    
`(登录mysql,这里使用-p123密码登录,先设置一下密码在登陆)`
mysql> create database test1;
mysql> create database test2;    `创建两个库一个test1,一个test2`
mysql> create table test1.student(id int not null,name varchar(8));    
mysql> create table test2.student(id int not null,name varchar(8));  `分别在两个库里写下表`
mysql> grant all on test1.* to 'test1'@'192.168.10.%' identified by '123';
mysql> grant all on test2.* to 'test2'@'192.168.10.%' identified by '123';    `分别赋权给两个库相应的mysql用户`
mysql> flush privileges;  `更新数据库的用户数据与权限`
mysql> exit

客户机 192.168.10.2 (直接安装mariadb)

[root@localhost ~]# yum -y install mariadb     
[root@localhost ~]# mysql -utest1 -p123 -h 192.168.10.1
先远程登录服务器看能不能登录
[root@localhost ~]# mysqldump -utest1 -p123 -h 192.168.10.1 test1 > test1.sql
远程数据库进行备份
[root@localhost ~]# ll test1.sql 
[root@localhost ~]# cat test1.sql 
查看是否备份成功


利用shell脚本进行远程备份


(1)使用不同用户对数据库 test1、test2进行远程备份

(2)每天 2:30执行备份
(3)每个库备份为独立的sql文件,压缩为“.tar.gz”格式的文件,文件中嵌套执行备份时的日期和时间


  • tar zcf *.tar.gz 源文件名称
  • date +%F-%H:%M (时间变量)


20201129165115603.png


  • mysqldump -u用户名 -p密码 -h 目标主机 --databases 数据库名称 > *.sql
  • /usr/bin/tar zcf bf-$(date +%F-%H:%M:%S).tar.gz test1.sql
    制作脚本
[root@localhost opt]# vim ly.sh 
#!/bin/bash
`用户名`
user1="test1"
user2="test2"
`密码`
pass1="123"
pass2="123"
`数据库服务器主机ip`
data_host="192.168.10.1"
`数据库名称`
data1="test1"
data2="test2"
`备份名称`
dumpfile1="${data1}.sql"
dumpfile2="${data2}.sql"
`归档名称`
file1="${data1}-$(date +%F-%H-%M-%S).tar.gz"
file2="${data2}-$(date +%F-%H-%M-%S).tar.gz"
`备份时各参数连接`
conn_name1="-u$user1 -p$pass1 -h$data_host --databases $data1"
conn_name2="-u$user2 -p$pass2 -h$data_host --databases $data2"
` 备份数据库`
/usr/bin/mysqldump $conn_name1 > $dumpfile1
/usr/bin/mysqldump $conn_name2  > $dumpfile2
`归档`
/usr/bin/tar zcf /opt/$file1  $dumpfile1
/usr/bin/tar zcf /opt/$file2  $dumpfile2


设值计划任务(控制时间,调用任务脚本)


[root@localhost ~]# crontab -e    (进入计划任务)
30 2 * * *   source   /opt/ly.sh   `(每天的两点半执行脚本)`


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
6月前
|
存储 Shell Linux
八、Linux Shell 脚本:变量与字符串
Shell脚本里的变量就像一个个贴着标签的“箱子”。装东西(赋值)时,=两边千万不能有空格。用单引号''装进去的东西会原封不动,用双引号""则会让里面的$变量先“变身”再装箱。默认箱子只能在当前“房间”(Shell进程)用,想让隔壁房间(子进程)也能看到,就得给箱子盖个export的“出口”戳。此外,Shell还自带了$?(上条命令的成绩单)和$1(别人递进来的第一个包裹)等许多特殊箱子,非常有用。
565 2
|
7月前
|
存储 关系型数据库 MySQL
在CentOS 8.x上安装Percona Xtrabackup工具备份MySQL数据步骤。
以上就是在CentOS8.x上通过Perconaxtabbackup工具对Mysql进行高效率、高可靠性、无锁定影响地实现在线快速全量及增加式数据库资料保存与恢复流程。通过以上流程可以有效地将Mysql相关资料按需求完成定期或不定期地保存与灾难恢复需求。
555 10
|
9月前
|
存储 关系型数据库 MySQL
【赵渝强老师】使用select...into outfile语句备份MySQL
本文介绍了MySQL中使用`SELECT...INTO OUTFILE`语句将表数据导出为文本文件的方法。通过示例演示了如何备份员工表(emp)的数据,包括创建存储目录、设置权限、配置参数`secure_file_priv`以及解决相关错误的过程。字段分隔符和行终止符可自定义,确保数据格式符合需求。最后展示了备份文件的内容,验证操作成功。
591 36
|
9月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mysqldump备份MySQL
本文介绍了 MySQL 自带的逻辑备份工具 mysqldump 的使用方法。通过 mysqldump,可以将数据库中的数据转换为对应的 SQL 插入语句,便于备份和还原。文章详细说明了如何备份所有数据库、指定数据库及特定表,排除某些表不备份的操作,以及删除数据库后如何通过备份文件恢复数据。同时提供了视频讲解和具体命令示例,帮助用户更好地理解和应用该工具。
911 5
|
9月前
|
存储 SQL 关系型数据库
【赵渝强老师】使用mydumper备份MySQL
本文介绍了使用mydumper工具进行MySQL数据库备份与恢复的操作方法。相比单线程工作的mysqldump,mydumper支持多线程,速度提升可达10倍。其功能包括事务性表快照、快速压缩、导出binlog等,并提供详细的参数说明和操作步骤。文章通过实例演示了安装mydumper、创建存储目录、全库备份、指定数据库及表备份、删除数据库以及使用myloader恢复数据的完整流程,并附带视频讲解,帮助用户更好地理解和应用该工具。
645 0
|
11月前
|
存储 关系型数据库 MySQL
利用Cron表达式实现MySQL数据库的定时备份
以上就是如何使用Cron表达式和mysqldump命令实现MySQL数据库的定时备份。这种方法的优点是简单易用,而且可以根据需要定制备份的时间和频率。但是,它也有一些限制,例如,它不能备份MySQL服务器的配置文件和用户账户信息,也不能实现增量备份。如果需要更复杂的备份策略,可能需要使用专门的备份工具或服务。
303 15
|
11月前
|
SQL Oracle 关系型数据库
在MySQL Shell里 重启MySQL 8.4实例
在MySQL Shell里 重启MySQL 8.4实例
393 2
|
6月前
|
存储 安全 Unix
七、Linux Shell 与脚本基础
别再一遍遍地敲重复的命令了,把它们写进Shell脚本,就能一键搞定。脚本本质上就是个存着一堆命令的文本文件,但要让它“活”起来,有几个关键点:文件开头最好用#!/usr/bin/env bash来指定解释器,并用chmod +x给它执行权限。执行时也有讲究:./script.sh是在一个新“房间”(子Shell)里跑,不影响你;而source script.sh是在当前“房间”里跑,适合用来加载环境变量和配置文件。
569 9
|
9月前
|
Shell
Shell脚本循环控制:shift、continue、break、exit指令
使用这些命令可以让你的Shell脚本像有生命一样动起来。正确使用它们,你的脚本就能像一场精心编排的舞蹈剧目,既有旋律的起伏,也有节奏的跳跃,最终以一场惊艳的表演结束。每一个动作、每一个转折点,都准确、优雅地完成所需要表达的逻辑。如此,你的脚本不只是冰冷的代码,它透过终端的界面,跳着有节奏的舞蹈,走进观众——使用者的心中。
338 60
|
12月前
|
关系型数据库 MySQL Shell
MySQL 备份 Shell 脚本:支持远程同步与阿里云 OSS 备份
一款自动化 MySQL 备份 Shell 脚本,支持本地存储、远程服务器同步(SSH+rsync)、阿里云 OSS 备份,并自动清理过期备份。适用于数据库管理员和开发者,帮助确保数据安全。

推荐镜像

更多