MySQL常见命令

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 ========="
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值