Shell脚本操作数据库:
安装
Yum list all | grep mariadb查看yum源中是否有mariadb包
则通过yum进行安装,否则进行其他方式的安装
Yum install mariadb mariadb-server mariadb-libs -y
配置
Systemctl status mariadb
Systemctl start mariadb
可以看到running 配置文件路径和数据文件路径
使用
Select version();查看版本
Show databases;
Use 数据库
Create insert select drop alter delete update等操作
Create database school default charset=utf8;
Select school < school.sql使用脚本插入制定的数据库中
以下是对数据库对其他用户设置权限
grant all on school.* to dbuser@’%’ identified by ‘123456’
Grant 哪些权限,比如select on 那个数据库的哪些表 to 用户名@主机ip地址 identified by 用户密码
Mysql命令参数详解:
-u 用户名
-p 用户密码
-h 服务器ip地址
-D 连姐姐的数据库
-N 不输出列的信息
-B 使用tab键代替默认的交互分隔符
-e 执行SQL语句
其他的选项
-E 垂直输出
-H 以HTML格式输出
-X 以XML格式输出
举例:
需求1:写一个脚本,该脚本可以接收二个参数,参数为需要执行的SQL语句
例如: bash operate_mysql.sh “select * from student;”
Operate_mysql.sh如下所示:
#!/bin/bash
#
user='dbuser'
password='123456'
host='127.0.0.1'
sql="$2"
db="$1"
mysql -u"$user" -p"$password" -h"$host" -D"$db" -B -e "$sql"
需求2:将文本中格式化的数据导入到MYSQL数据库中
文本文件的data.txt的内容如下:
[root@ansible script]# cat data.txt
101 xiaoming mail
102 xiaohua femail
104 xiaofang mail
脚本内容insert.sh
#!/bin/bash
#
user="dbuser"
password="123456"
host="127.0.0.1"
mysql_conn="mysql -u"$user" -p"$password" -h"$host""
cat data.txt | while read id name age
do
$mysql_conn -e "insert into school.student values('$id','$name','$age')"
done
~
///以上的写法中,mysql_conn尽量不要以变量的形式写在脚本中,容易出错//
///注意单双引号的用法,如果变量双引号,在执行的时候,会进行赋值操作,变量就不起作用了,所以引用变量的地方进行用单引号//
执行结果
[root@ansible script]# bash operate_mysql.sh school "select * from student;"
id name age
102 xiaohua femail
104 xiaofang mail
[root@ansible script]#
需求3:将以下文本格式的数据导入到MYSQL数据库中
文本格式的内容如下data1.txt
[root@ansible script]# cat data1.txt
105|fangqiming|mail
106|xiaomingming|mail
107|xiaohua|femail
以上数据的分割符号是“|”
脚本文件
#!/bin/bash
#
user="dbuser"
password="123456"
host="127.0.0.1"
#mysql_conn="mysql -u"$user" -p"$password" -h"$host""不能这么写,出错!
IFS="|"
cat data1.txt | while read id name age
do
if [ $id -gt 105 ];then
mysql -u"$user" -p"$password" -h"$host" -e "insert into school.student values('$id','$name','$age')"
fi
done
~
执行结果是:
[root@ansible script]# bash operate_mysql.sh school "select * from student;"
id name age
106 xiaomingming mail
107 xiaohua femail
[root@ansible script]#
备份数据
备份MYSQL数据库或者表
mysqldump
常用参数详解
-u 用户名
-p 密码
-h 服务器ip地址
-d 等价于—no-data 指导处表结构
-t 等价于—no-create-info 只导出数据,不导出建表语句
-A 等价于—all-databases
-B 等价于—databases 导出一个或者多个数据库
FTP常用指令:
Open 与FTP服务器建立连接,例如 open 192.168.10.104
User 有权限登录FTP服务器的用户名与密码,例如: user
需求1: 将school中的student表备份,并且将备份数据通过FTP传输到192.168.10.104的/data/backup目录下
mysqldump -udbuser -p123456 -h127.0.0.1 -B school > test1.sql
FTP安装和使用命令详解:
Centos7系统安装,yum install vsftpd
配置:
/etc/vsftpd/Vsftpd.conf
添加userlist_deny=NO作用是当userlist_enable=YES时候user_list表中添加的用户名允许登录,当userlist_deny=YES 则相反。
注意的是:配置是控制着对端主机的。
受控端设置local_root=/var/ftp默认上传的路径。
chmod 777 –r /vars/ftp设置读写权限。
启动:
service vsftpd restart service vsftpd status可以看到running则正常
验证:
[root@ansible vsftpd]# ftp 192.168.10.104
Connected to 192.168.10.104 (192.168.10.104).
220 (vsFTPd 3.0.2)
Name (192.168.10.104:root): root
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> pwd
257 "/var/ftp"
FTP使用前提:
主控端和受控端都安装vsftpd协议
服务运行状态
在受控端有授权的用户
3、创建宿主用户
在受控端依次执行如下
# 创建用户 ftpuser 指定 `/home/vsftpd` 目录
useradd -g root -M -d /home/vsftpd -s /sbin/nologin ftpuser
# 设置用户 ftpuser 的密码
passwd ftpuser
# 把 /home/vsftpd 的所有权给ftpuser.root
chown -R ftpuser.root /etc/vsftpd
此时可以看到,如下已经有授权的用户了,用户名密码我设置的ftpuser,tarena
[root@clone-node vsftpd]# cat /etc/passwd | grep ftpuser
ftpuser:x:1009:0::/home/vsftpd:/sbin/nologin
[root@clone-node vsftpd]#
注意把 /home/vsftpd 的所有权所给的用户密码是控制访问的用户,而访问者要输入的用户名和密码是被访问系统的用户名和密码
比如
系统A 当前系统root tarena ---------------------------- 系统B,当前系统root tarena
Username: ftpuser username:fangqiming
Password:tarena password: tarena
[fangqiming@ansible vsftpd]$ ----------à-username:root,password:tarena
username:root,password:tarena-<--------- [root@clone-node xiaoming]#
有关useradd更多的参数说明和vsftpd的参数说明和配置见下面的网址
参考网址: https://www.cnblogs.com/lei0213/p/8657039.html
参考网址: https://www.cnblogs.com/craftor/p/3811612.html
需求1实现
mysqldump -udbuser -p123456 -h127.0.0.1 -B school > test1.sql
指定的数据库school备份出来后,通过以下的脚本,将备份的文件发送到192.168.10.104服务器上
=============================================
[root@ansible script]# vim ftp.sh #设置脚本内容,将下面
[root@ansible script]# bash ftp.sh #执行脚本
Connected to 192.168.10.104 (192.168.10.104).
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
250 Directory successfully changed.
local: test1.sql remote: test1.sql
227 Entering Passive Mode (192,168,10,104,56,62).
150 Ok to send data.
226 Transfer complete.
2188 bytes sent in 9.7e-05 secs (22556.70 Kbytes/sec)
221 Goodbye.
[root@ansible script]#
================================================
[root@ansible script]# vim ftp.sh
#!/bin/bash
#
ftp -inv << EOF
open 192.168.10.104
user root tarena
cd /tmp
put test1.sql
bye
EOF
执行结果:
在受控端 192.168.10.106 /tmp中查看,已传递成功!
[root@clone-node tmp]# ll test1.sql
-rw-r--r--. 1 root root 2188 Apr 18 14:19 test1.sql
[root@clone-node tmp]#
较完整的代码如下:
=====================================
功能:
备份数据库到文件
将备份数据传输到远端服务器
设置定时备份并传输任
======================================
#!/bin/bash
#
db_user="dbuser"
db_password="123456"
db_host="127.0.0.1"
db_file_time="`date +%Y%m%d%H%M%S`"
sql_name="school_student_${db_file_time}.sql"
ftp_password="tarena"
ftp_user="root"
ftp_host="192.168.10.104"
dest_path="/root/data/backup"
function auto_ftp
{
ftp -niv << EOF
open "$ftp_host"
user $ftp_user $ftp_password
cd $dest_path
put $1
bye
EOF
}
mysqldump -u"$db_user" -p"$db_password" -h"$db_host" school student > $sql_name && auto_ftp $sql_name