1 mysql登录(tcp/sock)
#以tcp方式连接
#这是登录本地MySQL,默认地址是localhost -u+用户 是指以某个用户登录 -p后面接密码,建议不要直接输在屏幕上
[root@test data]# mysql -uroot -p
#远程登录需要加-h指定远程地址
[root@test data]# mysql -h10.28.88.199 -uroot -p
#以sock方式连接
首先查出你的sock位置(一般都会在配置文件里面定义好,默认在/tmp/mysql.sock)
[root@test data]# cat /etc/my.cnf | grep sock #我的在/data/mydata/目录下
socket = /data/mydata/mysql.sock
#访问本机就不用加-h了,访问远程mysql就得加-h+主机名 -S 后面加sock,表示调用sock
[root@test data]# mysql -uroot -p -S /data/mydata/mysql.sock
注:mysql连接默认是以tcp连接为主,并且默认端口是3306,如果你的端口修改了,得用-P加端口才行
# 对数据库的操作
温馨提示:
在MySQL里面的进行的任何操作都以;结尾,但是\G结尾的不用加;,默认就已经加了。
2 数据库相关操作
2.1查询数据库
# show是显示的意思 database是数据库 但是用show进行查询的时候一定要多加个s,至于为啥我也不知道。
MariaDB [(none)]> show databases;
2.2 创建数据库
语法 :create database [if not exists] da_name 前面2个是固定的,[ 可选 ] 数据库名,
其中if not exists是一个判断语句,如果存在就不创建,不存在就创建
MariaDB [(none)]> create database if not exists ac;
2.3 查看数据库的创建过程
语法:show create database db_name 前面3个是固定的 db_name是你刚刚创建的数据库名
MariaDB [(none)]> show create database ac;
+----------+-------------------------------------------------------------+
| Database | Create Database |
+----------+-------------------------------------------------------------+
| ac | CREATE DATABASE `ac` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+----------+-------------------------------------------------------------+
2.4 删除数据库
语法:drop database [if exists] db_name 前面2个是固定的 [ 可选 ] 数据库名,建议加上if exists
MariaDB [(none)]> drop database if exists ac;
2.5 切换库
MariaDB [(none)]> use test; #use db_name
2.6 数据库字符集
2.61 创建库时指定字符集
#语法: crate database 库民 character set 字符集,
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_bin;
MariaDB [(none)]> create database zabbix character set utf8 collate utf8_general_ci; #默认情况先下使用此语句
MariaDB [(none)]> create database zabbix character set utf8;
# utf8_bin 与 utf8_general_ci 区别:
ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;
bin 是二进制, a 和 A 会别区别对待.
例如你运行:SELECT * FROM table WHERE txt = 'a'那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.
2.62 查询已建库的字符集
MySQL [ecology]> select * from information_schema.schemata; #固定方法
2.63 修改已建库字符集
#语法:alter database 库名 default character 字符集
MySQL [ecology]> alter database ecology_e10 default character set utf8 collate utf8_general_ci;
3 对表的操作
3.1 创建表
语法:create table [if not exists] 表明(字段1 类型,字段2 类型); 创建表的时候,至少需要一个字段,不然会报错的
MariaDB [abc]> create table if not exists abd(id int,name varchar(30));
3.2 查看表的创建过程
语法 show create table 表名 前面3个是固定的(通过此命令可以可以了解整个表的创建流程,有了此命令你能对表更了解)
MariaDB [abc]> show create table abd;
+-------+--------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+--------------------------------------------------------------------------------------------------------------------------+
| abd | CREATE TABLE `abd` (
`id` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+--------------------------------------------------------------------------------------------------------------------------+
3.3 查看当前库下有哪些表
MariaDB [abc]> show tables;
3.4 查看表结构
语法:desc 表名; (不加库名,默认是查询当前库下的表结构)
MariaDB [abc]> desc abd;
+-------+-------------+------ +-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------ +-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(30) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
注:通过查看表结构,你可以清楚了解表有几个字段(竖排是字段)及表的类型(横排的类型)
#实现跨库查询(但是你得精准定位那个表在哪个库) 语法:desc 库名.表名;
MariaDB [mysql]> desc abc.abd;
#使用explain也可以进行表结构查询,用法跟desc一样
MariaDB [mysql]> explain abc.abd;
3.5 删除表
语法:drop table [if exists] 表名 其中:前2项是必写 [可选] 表名(你需要删除的),这个命令得谨慎啊,确认无误的情况在进行操作。
MariaDB [abc]> drop table if exists abd;
3.6 对表或者库的属性进行重新定义 alter
修改库的属性,语法:alter database db-name default character set 字符集;
MariaDB [zabbix]> alter database zabbix default character set utf8 collate utf8_bin;
语法:alter table 表名 关键字 修改属性。 关键字还是蛮多的
#rename(关键字) 重命名 目的:对表进行重命名。
MariaDB [abc]> alter table abc2 rename abc;
#modify(关键字) 对某个字段进行修改 目的:修改字段属性
MariaDB [abc]> alter table abc modify id int(60);
#change(关键字) 将某个字段重命令并且修改属性 用法:change 原字段 新字段 字段类型 目的:修改字段名称和字段类型
MariaDB [abc]> alter table abc change id id1 int(30);
#add(关键字) 新增某个字段 用法:add 字段名 字段属性 目的:新增表结构
MariaDB [abc]> alter table abc add sex enum("男","女");
#还是add的用法,但是在最后面加了个first,意思新增一个字段并且放在最前面,默认是放在最后面的。
#用法:add 字段名 字段属性 first
MariaDB [abc]> alter table abc add uuid int first;
#还是add用法,但是在添加了一个参数 after 是将某个新增字段放在哪个字段的后面
#用法:add (新增)字段名 字段属性 after 字段名(已存在的)
MariaDB [abc]> alter table abc add address varchar(50) alter id1;
# drop(关键字) 用法:drop 字段名 目的:干掉哪个字段
MariaDB [abc]> alter table abc drop id1;
http://dev.mysql.com/doc/refman/5.5/en/alter-table.html 更多的细致的用法可以参考这个文档
3.7 对表插入数据 insert
语法:insert into 表名 values (字段值1,字段值2,字段值3......) 作用:新增记录
MariaDB [abc]> insert into abc values(1,"cs","ahuang","男");
MariaDB [abc]> insert into abc values(2,"xt","啊中","男"),(3,"湖北","方阙","女"),(4,"beij","mit","女");
MariaDB [abc]> insert into abc values(null,"sc","中下","男"); #可以增加空值的
3.8 表查询
语法:select [option] 字段名 from 表名 作用:查看记录
# * 是所有
MariaDB [abc]> select * from abc;
#查看单个字段,只要加上你要的字段名即可
MariaDB [abc]> select id from abc;
#查看多个字段的内容,字段在2个及以上,中间用,号隔开
MariaDB [abc]> select id,name from abc;
#distinct(选项) 指的是去除重复
MariaDB [abc]> select distinct id,name from abc;
#where判断语句 一般接后面后面的判断语句一起使用。
# 逻辑运算符:and 且 or 或 not 非
# 算术运算符:<> !=(前面这2个都是不等于) > < >= <=(这4个就是大家熟悉的意思)
# in 在where匹配规则中,表示支持多个选择,
# not in(是not in 不是notin) 恰好相反
# where是条件判断语句,在很多sql里面用的非常多,一般都是放在最后面使用
# 用法:where 具体判断条件 目的:匹配符合要求的数据
MariaDB [abc]> select * from abc where id=2 and sex="男";
# or 只要其中一个满足就会显示出来
MariaDB [abc]> select id from abc where name="mit" or name="方yue" or name="ssd";
#and只有2个都满足的才会有结果输出,如果其中一个条件没有满足,但是会执行成功,不过没有具体的结果输出
MariaDB [abc]> select * from abc where id=4 and name="ssd";
#将id不等于4的记录全部显示出来(就举这一个例子,其他的用法都差不多)
MariaDB [abc]> select * from abc where id<>4;
#in 的用法,notin用法也是一样
MariaDB [abc]> select * from abc where id in(23,9,4);
MariaDB [abc]> select * from abc where id not in(23,9) order by id desc;
#order by 排序 mysql数据库默认是升序(由小到大),所以大家只用记住它的一个参数:desc(降序:由大到小)
#用法:order by 字段(排序的字段) desc ,
# 按照id列进行降序排序
MariaDB [abc]> select * from abc order by id desc;
#多个字段排序,默认以第一个字段为主
MariaDB [abc]> select * from abc order by id,address,name desc;
# row_number() over 分组排序(适用于sql server跟oracle)
#范围运算 between....and... 可以用算术运算符来代替
#以降序的方式显示id 9 - 23的内容
MariaDB [abc]> select * from abc where id between 9 and 23 order by id desc;
#一样的结果
MariaDB [abc]> select * from abc where id>=9 and id<=23 order by id desc;
#模糊匹配查询 用法:where 字段名 [not] like 匹配的内容 其中not like差不多是取反的意思
#只匹配id为9的数据
MariaDB [abc]> select * from abc where id like "9";
#取反,也就是把除id=9的数据全部匹配出来
MariaDB [abc]> select * from abc where id not like "9";
#select子查询 简单来说就是在select里面在嵌套一个select查询
#在select里面嵌套select循环的时候,会先执行()里面的select语句,然后将结果以变量的方式赋值给外面的select语句(也就是给id赋值了),
# 可以理解为变量赋值就行了,一般是用来进行跨表查询,我这没有就用一个表演示,
MariaDB [abc]> select * from abc where id=(select id from abc where id=4);
#连接查询 以一个共同的字段,求两张表当中符合条件的并集。 通过共同字段把这两张表连接起来。
但是分内连接 跟外连接(又分左外连接,又外连接)
内连接:select 字段 from 表1(别名),表2(别名) where 并集 还有种方法:select 字段 from 表1(别名) inner join 表2(别名) on 表1.字段=表2.字段
select bname,btypename from books a,category b where a.btypeid=b.btypeid;
外连接-左外连接 select 字段 from 表1(别名) left jion 表2(别名) on 连接条件 其中a表是主表,b表是从表,主表内容全都有,从表内没有的显示null
select bname,btypename,price from books a left join category b on a.btypeid=b.btypeid;
外连接-右外连接 select 字段 from a表 right join b表 on 条件 其中a表是从表,b表是主表(都显示),右连接可以表示多表连接
select bname,btypename,price from books a right join category b on a.btypeid=b.btypeid;
#聚合函数 执行特定功能的代码块
#sum() 求和 用法:select sum(求和的字段只能是数字) from 表名;
MariaDB [abc]> select sum(price) from abe;
#avg()求平均值 用法:select avg(求平均值的字段只能是数字) from 表名;
MariaDB [abc]> select avg(price) from abe;
# max() 最大值 用法:select max(同上) from 表名;
MariaDB [abc]> select max(price) from abe;
MariaDB [abc]> select * from abe where price=(select max(price) from abe); #综合用法
#min() 最小值 后面的同上
MariaDB [abc]> select min(price) from abe;
MariaDB [abc]> select * from abe where price=(select min(price) from abe);
count() 统计行数 用法: select count(*) from 表名;
MariaDB [abc]> select count(name) from abe;
#字符串函数
#substr(string,start,len) 截取方式:从start(默认是从1开始算)开始,截取len长 作用:截取某一段数据
MariaDB [abc]> select substr(name,1,3) from abe; #从第一个字符开始截取,截取3个字符
MariaDB [abc]> select substr(name,-2,3) from abe; #从倒数第二个字符开始截取,截取2个字符 加了 - 号 就是倒着截取
#concat(str1,str2,str3) 拼接 作用;将多个字段拼成一个字段输出
MariaDB [abc]> select concat(name,id) from abe;
MariaDB [abc]> select concat(name,"#######",id) from abe; #中间可以用特殊符号隔开,但是需要" "号,引起来
#大小写转换
#upper() 将所有英文转为大写输出 用法:select upper(只针对英文小写的字段) from 表名 [条件]
MariaDB [abc]> select upper(address) from abc where id=4 or id=233; #以英文大写输出
#lower() 跟 upper恰好相反
MariaDB [abc]> select lower(address) from abc where id=4 or id=233; #以英文小写输出
#获取上个sql查询数据的行数(sql server)
select @@rowcount #用于小于20亿的数据
select @@rowcount_big #用于大于20亿的数据
3.9 删除表内容
语法:delete from 表名 where 指定条件 作用:删除记录
#删除id=3的记录
MariaDB [abc]> delete from abc where id=3;
#删除空值(不能直接写id=null,否则会报错的)
MariaDB [abc]> delete from abc where id is null;
#and 是2个条件都要满足,才能进行删除操作,虽然没有删除成功,但是还会提示操作成功。
MariaDB [abc]> delete from abc where id=2 and address="cs";
#or 只要满足其中一个条件就可以进行操作,如果2个条件都成功满足,2个记录都会被干掉。
MariaDB [abc]> delete from abc where id=2 or address="cs";
3.10 更新表记录
语法:update 表名 set(行) 指定条件 作用;更新记录
#如果不加where指定具体条件,默认是对sex字段整段进行替换(操作的时候一定得谨慎)
MariaDB [abc]> update abc set sex="女" where id =4;
MariaDB [abc]> update abc set id=233 where id =10;
# 算术运算 + - * / 经过下面的测试是支持正常的加减乘除的
#只要是60块钱以下的书,每本涨6元 price+6 也就是在原来的price值上+6
MariaDB [abc]> update abe set price=price+6 where price<60;
#只要是100块以上的书都减10块钱
MariaDB [abc]> update abe set price=price-10 where price>100;
#只要是40块钱以下的书都涨1.1倍
MariaDB [abc]> update abe set price=(price+(price*0.1)) where price<40;
3.11 备份表
# select * into 备份后的表名 from 需要备份的表
select * into MachineMatchPayInfo_bak_2021_04_07 from MachineMatchPayInfo
4.对系统相关操作
4.1 打印时间
#打印当前系统时间
MariaDB [abc]> select now();
##打印年,,日
MariaDB [abc]> select curdate();
#打印小时,分,秒
MariaDB [abc]> select curtime();
4.2 查询系统信息
#查询表信息,用户信息
#查询当前系统变量(但是直接这么用,肯定查询不到你的结果,系统变量几百条了) 一般配合like(感觉跟grep一样) 检索具体的是数据
MariaDB [abc]> show variables(变量);
# 只匹配wait这一栏属性 %是通配符 如果%放在末尾,只匹配以wait开头的数据
MariaDB [abc]> show variables like "wait%";
# 双%wait%的话,主要包含wait的数据都给匹配出来
MariaDB [abc]> show variables like "%wait%";
#global(全局) 只打印全局变量,可以跟like一起使用,匹配符合自己要求的数据
MariaDB [abc]> show global variables\G;
MariaDB [abc]> show global variables like 'int%';
#查询当前系统版本信息
MariaDB [abc]> show global variables like 'version%'
#查询当前系统默认引擎
MariaDB [abc]> show gloabl variables like "%storage_engine%";
#查询慢查询信息
MariaDB [abc]> show global variables like "%slow%";
#查询线程信息
MariaDB [abc]> show global variables like "%Thread%";
注:查询系统信息 一般以show gloabl variables like "你要查询的具体参数" 方式查询
#查看mysql支持引擎有哪些
MariaDB [abc]> show engines(引擎);
#查询当前mysql的程序状态 可以通过show status like "查询值"; 查询具体程序运行信息
MariaDB [abc]> show status;
#查看当前mariadb版本
MariaDB [abc]> select version();
#查询进程数量
MariaDB [(none)]> show full processlist\G;
5 用户管理
5.1 用户查询
#查看具体用户信息
MariaDB [abc]> select * from mysql.user where user='用户'\G
#查看当前系统操作用户
MariaDB [abc]> select user();
#查看当前mysql中有哪些用户
MariaDB [(none)]> select user,host from mysql.user;
#以授权形式查询用户权限 用法:show grants for '用户'@'主机地址'
MariaDB [(none)]> show grants for 'root'@'127.0.0.1';
MariaDB [(none)]> show grants; #查看当前用户权限
MySQL [ecology]> show grants for sa; #查看某用户授权信息,作用域
#小扩展:创建用户密码有时候需要注意密码长度的问题:validate_password_policy(在高版本的mariadb默认没有安装这个插件),
MariaDB [(none)]> show variables like 'validate_password%'; 查询此值
简单介绍解决方案:
通过在my.cnf文件里面添加 validate-password=OFF 此参数,重启MySQL可以解决,
或者是在mysql内部执行 set global validate_password_policy=0 然后flush privileges刷新权限表即可。
2种方法,看着用即可
5.2创建用户
语法:create user '用户'@’地址‘ identity by '密码'; 注:里面的几个单词都是固定写法
#创建用户(这种方式用户的不多,一般是在授权的时候顺便把用户创建了)
MariaDB [(none)]> create user 'zabbix'@'127.0.0.1' identified by 'zabbix';
#刷新权限(无论是做创建用户还是做授权用户操作后,都得记得刷新权限)
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> select user.host from mysql.user where user=zabbix;
5.3授权(也是创建用户并且授权)
语法:grant [权限] on [数据库名].[数据表名] to '[用户]'@’[作用域(对哪些ip生效)]‘ identified by '[密码]';
权限介绍:
all privilege on 或 all on 是所有权限
select,update,insert,delete 这些单个权限就是大家熟悉的功能,可以组合使用,单个权限用,号隔开
数据库:
*.* 代表所有数据库
zabbix.* 只对zabbix这个数据库有权限
zabbix.zabbix只对zbbix库中的zabbix表有权限
同时在identified by中,如果没有指定密码,并且这个用户存在的话,密码还是原样。
#对已经存在的用户进行授权,并且此用户是可以登录的,但是只能打开3个库(information_schema test zabbix,前面2个库好像所有用户都可以访问)
MariaDB [(none)]> grant all on zabbix.* to 'zabbix'@'127.0.0.1';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show grants for 'zabbix'@'127.0.0.1';
#创建新用户并且授权
#创建新用户并且授权,新用户一定得加密码,如果不加,会有报错提醒的(用的最多的也是这种,创建用户,授权一步到位)
MariaDB [(none)]> grant all on zabbix.* to 't1'@'localhost' identified by 't1222';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> show grants for 't1'@'localhost';
5.4 修改授权
第一种方法是通过grant直接重新赋予权限,然后刷新权限(貌似只针对单权限转all权限生效)
MariaDB [(none)]> grant all on zabbix.* to 't2'@'localhost' identified by '123456';
MariaDB [(none)]> flush privileges;
8.0:grant all privileges on ecology.* to 'sa'@'127.0.0.1';
第二种方法是通过revoke取消授权,刷新权限,然后在进行grant授权(万能的)
MariaDB [(none)]> revoke all on zabbix.* from t1@'localhost'; #revoke 取消授权 用法:revoke 权限 on [数据库].[表] from 用户@‘作用域’ identified(可以省略)。
MariaDB [(none)]> grant select on zabbix.* to t1@localhost;
MariaDB [(none)]> flush privileges;
5.5 删除用户三部曲
#查询用户,确认用户是否我们想要删除的用户
语法:show gants for '用户'@地址范围; 如果不知道地址范围可以通过:select user,host from mysql.user; 获取
#查询用户,不知道当前用户具体信息的时候,可以这样查询
MariaDB [(none)]> select * from mysql.user where user='Qbslave'\G
MariaDB [(none)]> show grants for 'duhao'@'127.0.0.1';
#删除用户
语法:delete from mysql.user where user='用户';
#删除整个用户
MariaDB [(none)]> delete from mysql.user where user='duhao';
#删除针对某个主机开放的用户
MariaDB [(none)]> delete from user where user='Qbslave' and host='192.168.1.2';
#刷新权限
MariaDB [(none)]> flush privileges;
#附赠的,查询当前数据库有哪些用户
MariaDB [(none)]>select user,host from mysql.user;
6 mysql命令的一些常见用法
常见参数:
-u 指定用户
-h 指定登录地址(默认是localhost)
-p 指定密码
-P 指定端口(默认是3306)
-e 后面接sql语句(执行sql语句)
-S 以sock方式进行连接
更多的用法参考:mysql --help
示例:
[root@test ~]# mysql -uroot -p
[root@test ~]# mysql -h127.0.0.1 -uroot -p
[root@test ~]# mysql -h127.0.0.1 -uroot -p -P3306
[root@test ~]# mysql -uroot -p -e 'show databases;'
[root@test ~]# mysql -uroot -p -S /data/mydata/mysql.sock
7 数据库的导入导出
#导出数据库:
mysqldump 用法:mysqldump [OPTIONS] --databases [OPTIONS] DB1 [DB2 DB3...]
# -B 导出整个库包含建库语句
[root@test ~]# mysqldump -uroot -p -B abc >/data/mydata/abc.sql
#-A 导出所有数据库
[root@test ~]# mysqldump -uroot -p -A >/data/mydata/all.sql
#--skip-lock-table支持导出数据的时候不锁表,innodb引擎默认是会锁表的
[root@test ~]# mysqldump --skip-lock-table -h127.0.0.1 -uroot -p abc > /data/mydata/test.sql
# --single-transaction 保持事务的一致性
# --master-data=2 将当前二进制日志的信息写入到输出的文件中,1是不注销二进制信息,2是注销(在做主从的时候会到这个参数)
[root@test ~]# mysqldump -uroot -h 127.0.0.1 -p --single-transaction --master-data=2 -B &>/tmp/abc.sql
#导入数据库(导入之前必须创建一个空数据库)
通过mysql命令方式导入:
[root@test ~]# mysql -uroot -p -e 'create databases ac'
[root@test ~]# mysql -uroot -p ac < /data/mydata/abc.sql
通过登录mysql方式导入:
MariaDB [abc]> create database ab;
MariaDB [abc]> use ac;
MariaDB [abc]> source /data/mydata/abc.sql #source 加sql文件路劲就可以轻松导入
如何导出select查询结果? 用法:select [查询选项] from 表名 into outfile [存放结果的路劲(必须是mysql用户可以访问的路劲)]
MariaDB [abc]> select * from abc into outfile "/data/mydata/ac.txt";
8 MySQL慢日志
#查询慢日志状态(默认是关闭)
mysql> show variables like 'slow_query%'; #如果 slow_query_log 值为OFF代表慢日志还没有开启
#查询慢日志记录时间(默认是10秒)
mysql> show variables like 'long_query_time';
#临时开启慢日志
mysql> set global slow_query_log='ON'; #启动慢日志记录功能
mysql> set global slow_query_log_file='/data/logs/mysql/mysql-slow.log'; #指定慢日志文件存放地点
mysql> set global long_query_time=1; #将执行超过1s的sql语句均记录
#永久开启,在my.cnf文件中添加如下配置
slow-query-log = 1 #记录慢日志
slow-query-log-file = /data/logs/mysql/mysql-slow.log #慢查询日志记录文件
long_query_time = 1 #慢日志超时设置,默认是10s,记录超过查询时间的语句 这里的1 是1s
然后重启MySQL
9 MySQL备份
#!/bin/bash
export PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin
ScriptName=$(basename $0)
Cname=$(echo $ScriptName | awk -F'[-.]' '{print $2}')
Pname=$(echo $ScriptName | awk -F'[-.]' '{print $3}')
### ↓↓↓↓↓↓↓↓ 根据自己项目进行修改 ↓↓↓↓↓↓↓↓ ##
# Ip: 表示数据库备份脚本的机器, 默认用内网ip, 没有内网ip情况下,用外网ip
Ip=需要备份的服务器的ip
# 公司名简称
Comp=lh
# 项目名简称
Proj=jyb
# 对应的数据库名
dbs=(jyb)
# 数据库连接信息
Host="127.0.0.1"
User=root
Pass='你的密码'
# push等于1时,表示主动推送
Push=0
### ↑↑↑↑↑↑↑↑ 根据自己项目进行修改 ↑↑↑↑↑↑↑↑ ##
#匹配公司及项目是不是自己有需求的那个项目,不是就退出当前备份
if [ "x$Cname" != "x$Comp" ]; then
echo "公司名和配置不匹配"
exit 3
elif [ "x$Pname" != "x$Proj" ]; then
echo "项目名和配置不匹配"
exit 3
fi
#设定变量(在后面都会被调用到)
Dir=/data/dbbak/$Proj #指定备份目录
Date=$(date +%Y%m%d -d "1 days ago") #指的是当天时间的前一天时间
Date7ago=$(date +%Y%m%d -d "7 days ago") #指的是当天时间的前7天时间
echo "======= $(date +"%F %T") start =========" #就是一个打印在屏幕上的开始时间
mkdir -p "$Dir/$Date" #创建目录( -p 递归创建./ 这个在这里就是 /的意思没有别的意,主要存放sql备份的
[ $? != 0 ] && echo 'mkdir failed!' && exit 4; # 是个简单的条件判断语句 && 是用于判断前面[ 语句 ]执行结果,为真时候就执行第一个&&后的命令 为假的时候 执行第二&&后面的命令
cd $Dir #就是cd意思
if [ ! -d "$Dir/$Date" ] ; then #还是判断此文件存不存在
echo "Directory is not exist: $Dir/$Date "
exit 3
fi
## 进行数据库备份
for m in ${dbs[@]} #就是简单的for语句 其中@值的是某个表
do
mysqldump --skip-lock-tables -h$Host -u$User -p$Pass $m > $Dir/$Date/$m.sql #对某个表进行导出到本地
done
## 清理老的数据库备份
\rm -f ${Dir}/${Date7ago}.tar.gz #只要是在7天之前的备份就删除
\rm -f ${Dir}/${Proj}-${Ip}-${Date7ago}.tar.gz #也是删除7天之前的备份,但是命名方式通过下面的tar命令决定的
tar czf ${Proj}-${Ip}-$Date.tar.gz $Date #创建tar.gz文件 以项目名-ip-数据备份名一起创建tar.gz文件
\rm -rf "$Dir/$Date" #删除刚刚创建的备份文件目录,释放空间,最主要是没用了
## 当只有内网ip时, Push=1, 那需要进行rsync主动推送
if [ "x$Push" = "x1" ] ; then
RsyncPwd=/opt/scripts/dbbak/rsync-dbbak-client.pwd
rsync -avP --port 875 --delete --password-file=$RsyncPwd $Dir dbbak@rsync主机ip::dbbak/${Comp}/
fi
echo "======= $(date +"%F %T") end ========="