菜鸟 linux mysql_笔记MySQL

搭建数据库服务器

什么是数据库?

存储数据的仓库

部署一台数据库,提供数据库存储服务

1、购买服务器 (硬件主机 云主机 )

2、安装操作系统: Unix Linux( redhat、ubuntu、centos ) Windows

3、装包(软件包的来源?)

官网下载 XXX.主.次.修改次数 (次版本号是偶数的是稳定版,奇数是测试版)

操作系统光盘自带软件

软件包封包类型

(1)源码 可以自定义配置和安装 必须解决依赖关系

(2)RPM 软件是封装好不可以自定义安装 安装卸载简单 rpm -ivh rpm -e

开源软件还是商业软件?(开源不等于免费)

使用那种版本软件?(提供数据库服务的软件有哪些?)

(1)关系型数据库(RDBMS):Mysql、 Oracle、 SQL server、DB2

// 按照一定的规则存数据,SQL server只能在Windows上装

(2)非关系型数据(NOSQL):Redis、Mongodb、Memcached

Mysql特点:

1、开源且跨平台:unix linux windows上都可以安装

2、支持主流的编程语言:

静态网站开发语言:html、css

动态网站开发语言:java、php

运维程序开发语言:python、ruby、perl

3、可移植性好

数据库服务通常和网站服务一起使用:

LAMP、LNMP M(Mysql、Mongodb)

MySQL

软件包mysql-5.7.17.tar // 社区开源版

部署MySQL服务器

// 提供mysql服务的软件有两个,mysql、mariadb,但是不能同时存在

安装软件

]# tar -xf mysql-5.7.17.tar

]# ls .rpm

mysql-community-server-5.7.17-1.el7.x86_64.rpm // 提供服务

mysql-community-client-5.7.17-1.el7.x86_64.rpm // 管理命令

]# rpm -qa | grep -i mariadb // 查找是否有mariadb相关的包

// 如果有

]# rpm -e --nodeps mariadb-libs // 卸载,一定会有这个包

]# systemctl stop mariadb // 先停掉服务

]# rpm -e --nodeps mariadb-server // 删除软件

]#rm -rf /etc/my.cnf // 删除配置文件

]#rm -rf /var/lib/mysql // 删除目录下的内容

]# rpm -Uvh mysql-community-.rpm // 有依赖安装依赖

U:升级安装、v:查看安装过程、h:以#号方式显示安装进度

配置文件

]# ls /etc/my.cnf // 不修改

启动服务

]# systemctl restart mysqld

]# systemctl enable mysqld

查看数据库目录

]# ls /var/lib/mysql

查看端口号

]# netstat -nultp | grep 3306

查看进程号

]# ps -C mysqld

]# ps aux | grep mysqld

SQL指令

— 结构化查询语言

— 数据库定义、查询、操纵、授权语句

基本注意事项

— 操作指令不区分大小写(密码、变量值除外)

— 每条SQL指令以;(分号)结束或分隔

— 不支持Tab键自动补齐

— \c 废气当前编写错的操作指令

— quit 断开数据库连接

常用的SQL操作指令

— DDL 数据定义语言(create、alter、drop)

— DML 数据操作语言(insert、update、delete)

— DCL 数据控制语言(grant、revoke)

— DTL 数据事物语言(commit、rollback、savepoint)

面试题:用过什么SQL指令

答:DDL、DML、DCL、DTL

初次连接数据库、改密码

初始密码在日志文件

]# grep password /var/log/mysqld.log

连接数据库服务器

]# mysql -hlocalhost -uroot -p'查到的密码'

mysql> // 所在位置/var/lib/mysql

修改密码策略(临时)

set global validate_password_policy=0;

set global validate_password_length=6;

修改密码策略(永久)

]# vim /etc/my.cnf

validate_password_policy=0

validate_password_length=6

修改密码

alter user root@"localhost" identified by "123456";

— 相当于系统的文件夹

数据库命名规则

— 可以使用数字、字母、下划线,但不能纯数字

— 区分大小写。具有唯一性

— 不可使用指令关键字、特殊字符

查看库

show databases;

Information_schema、mysql、performance_schema、sys

// 系统库,不能删

创建库

create database 库名;

show databases;

// sql命令建库,所属主和组为 mysql

// 在数据库目录下建库,所属主和组为 root

进入/切换库

use 库名;

查看当前所在库

select database();

删除库

drop database 库名;

— 相当于系统文件

— *表必须在库里创建

— 先建表结构,再插入记录

— 建表之后数据库目录下会有frm、ibd生成

查看表

show tables;

删除表

drop table 表名;

修改表名

alter table 原表名 rename 新表名;

alter tanle t2 rename stuinfo;

创建表结构

create database studb;

use studb;

create table stuinfo(

-> name char(15),

-> sex char(10),

-> age int(2),

-> tel char(11)

-> );

创建表结构时指定字段值可以为中文

create table t1(name char(4),age int) DEFAULT CHARSET=utf8;

查看表结构

desc stuinfo;

插入表记录

— 第一列叫字段名,其余列叫字段值,默认不能用中文,其余都可以

insert into stuinfo values("bob","boy",21,"88888"),("lucy","girl",20,"66");

字段值设置为中文

DEFAULT CHARSET=utf8;

查看建表的命令

show create table stuinfo;

查看表记录

select * from stuinfo;

修改表记录(批量)

update stuinfo set sex="girl"; // 全部改为girl

删除表记录(所有)

delete from stuinfo;

MySQL数据类型

常见的信息种类

数值型:体重、身高、成绩、工资

字符型:姓名、工作单位、通信地址

枚举型:兴趣爱好、性别

日期时间型:出生日期、注册时间

数值类型

整型、浮点型

类型 大小 范围(有符号) 范围(无符号) 用途

TINYINT 1字节 -128~127 0~255 微小整数

SMALLINT 2字节 -32768~32767 0~65535 小整数

MEDIUMINT 3字节 -2^23~2^23-1 0~2^24-1 中整数

INT 4字节 -2^31~2^31-1 0~2^32-1 大整数

BIGINT 8字节 -2^63~2^63-1 0~2^64-1 极大整数

FLOAT 4字节 单精度浮点数

DOUBLE 8字节 双精度浮点数

DECIMAL 对DECIMAL(M,D),其中M为有效位数,D为小数位数,M应大于D,占用M+2字节

建表结构时指定范围(有符号 | 无符号):

create table t1(level int signed | unsigned);

desc t1;

浮点类型建表结构:

create table t1(pay float(7,2));

// 7 表示整数位和小数位的总个数,最大数为99999.99

数值类型的宽度 是显示宽度,不能限制字段赋值的大小,字符值的大小由 数据类型决定,int不指定宽度,默认是11,不够宽度默认用空格从左补 位。

例子:不用默认空格,用0补位,只保存正数

create table t2(id int(4) unsigned zerofill);

字符类型

定长:char(字符数) *常用

— 最大长度为255字符

— 不够指定字符数在前边用空格补齐

— 字符数超出时,不能写入数据

— 缺点:浪费存储空间 优点:处理速度快

变长:varchar(字符数)

— 最大长度为65532字符

— 按数据实际大小分配存储空间,存几个是几个,不用空格补齐

— 字符数超出时,不能写入数据

— 优点:节省存储空间

— 缺点:大量写入数据时,占用CPU,访问变慢

枚举类型

// 让字段的值,在规定的范围内选择

enum(值列表) 单选

set(值列表) 多选

create table t1 (name char(10),sex enum(“boy”,”girl”),likes set(“eat”,”play”,”eat”));

日期时间类型

年 year YYYY 2018

日期 date YYYYMMDD 20181010

时间 time HHMMSS 083030

日期时间 datetime YYYYMMDDHHMMSS 20181002103020

timestamp

例子:

create table t1(name char(15),birthday date,work time,s_year year,meetingtime datetime);

insert into t1 values(“bob”,20160520,103030,2016,20200621093030);

当未给TIMESTAMP字段赋值时,自动以当前系统时间赋值,而DATETIME字段默认赋值为NULL;

MYSQL服务时间函数(内置命令)

select now(); // 获取系统日期时间

select year(now()); // 获取系统年份

select month(20150210); // 获取指定月份

例子:

insert into t1 values("bob",date(now()),time(now()),year(now()),now());

管理表结构

// 对已经创建的表的结构做修改

添加字段 add

alter table 表名 add 字段名 字段类型 (约束条件);

alter table t2 add email char(50) default “stu@tedu.cn”;

alter table t2 add stu_num char(9) first,

grade int(3) after email;

修改字段类型

alter table 表名 modify 字段名 字段类型 约束条件;

// 不修改的部分,原样抄下来,否则会还原

alter table t2 modify email varchar(50) default “stu@tedu.cn”;

// 修改字段位置,也要原样抄下来

alter table t2 modify email varchar(50) default “stu@tedu.cn” after stu_num;

修改字段名

alter table 表名 change 原字段名 新字段名 字段类型 (约束条件);

// 字段类型、约束条件也要抄下来

alter table t2 change stu_num stu_id char(9);

删除字段

alter table 表名 drop 字段名;

alter table t2 drop email;

修改表名

alter table 原表名 rename 新表名;

alter tanle t2 rename stuinfo;

管理表记录

添加新纪录 insert

1.>insert into user values(42,”bob”,”x”,2000,2000,”student”,”/home/bob”, ”/bin/bash”); // 给所有字段赋值

2.>insert into user(name,shell,uid) // 给某些字段赋值 values(“lucy”,”/bin/bash”,1998),(“tom”,”/bin/bash”,1997);

查询新纪录 select

select 字段名列表 from 表where 条件;

select * fom user;

select name,uid,shell from user;

select name uid,shell from user where shell=”/bin/bash”;

修改记录字段值 update

update 表名 set 字段名=值,字段名=值 where 条件:

update user set password=”A”; // 改所有行

update user set password=”1”,uid=”100” where name=”root”;

删除记录 delete

delete from表 where 条件;

delete from t1; // 删除所有记录(慎用,一般不给程序员删的权限)

delete from t1 where name=”root”;

匹配条件

基本匹配条件

数值比较

= < <= !=

select name,id from user where id <=10;

select name,uid,gid from user where uid=gid;

字符比较

= !=

select name,shell from user where shell!=”/bin/bash”;

匹配空

is null is not null

insert into user(id,name) values(51,””),(52,”null”),(53,null);

select id,name from user where name=””;

select id,name from user where name=”null”;

select id,name from user where name is null;

逻辑比较

and(非) or(或) !(非) ()(优先级)

select from user where name="root" and shell="/bin/bash";

select from user where name="root" or shell="/bin/bash";

select name,uid from user where name="root" or name="bin" and uid=1; // and比or优先级高

select name,uid from user where (name="root" or name="bin") and uid=1;

范围内匹配

in(值列表)在..里 between 数1 and 数2(在..之间)

not in(值列表)不在..里 distinct 字段名 (去重显示)

select name from user where name in (“root”,”bin”);

select name,shell from user where shell not in (“/bin/bash”,”/sbin/nologin”);

select * from where uid between 10 and 20;

select distinct shell from user; // 显示字段值有几种类型

select distinct shell from user where uid <=500;

高级匹配条件

模糊查询

— where 字段名 like ‘通配符’

— _ 匹配单个字符、% 匹配0~N个字符

select name from user where name like ‘___’; // 名字包含三个字

select name from user where name like '%a%'; // 名字里有a

正则匹配

— where 字段名 regexp ‘正则表达式’

— 正则元字符 ^ $ . [] |

select name from user where name regexp '^a.t$';

select name from user where name regexp ‘[0-9]’;

四则运算

/ %

update user set uid=uid+1 where id<=10;

select name,uid,gid,uid+gid as jieguo from user where name="root";

select name,age,2018-age year from user where name=”root”;

select name,uid,gid,(uid+gid)/2 from user where name=”root”;

聚集函数

— avg(字段名) // 统计字段平均值

— sum(字段名) // 统计字段之和

— min(字段名) // 统计字段最小值

— max(字段名) // 统计字段最大值

— count(字段名) // 统计字段值个数

select avg(uid),max(uid),min(uid) from user where id <=10;

select count(name) from user where shell="/bin/bash";

操作查询结果

group查询分组

— SQL查询 group by 字段名;

select shell from user group by shell;

order by查询结果排序

— SQL查询 order by 字段名 [asc | desc]; //升序、降序,默认从小到大

select name,uid from user where uid <=500 order by uid desc;

select name,uid from user where uid <=500 order by uid;

limit限制查询结果显示行数

— SQL查询 limit 数字; // 显示查询结果的前几行

— SQL查询 limit 数字1,数字2; // 显示指定范围内的行

select name,shell from user where uid <=500 limit 5;

select name,shell from user where uid <=500 limit 5,10;

// 从第六行开始,显示10行

having条件在查询结果里查找数据

— SQL查询 having 条件表达式;

— SQL查询 where 条件 having 条件表达式;

— SQL查询 group by 字段名 having 条件表达式;

select id from user where id <=10 having where name=”bin”;

约束条件

// 作用:控制如何给字段赋值

NuLL 是否允许赋空值

create table t1(name char(10) not null); // 赋值时不能写null

“”不代表空值,代表一个字符

“null”也不代表空值,代表一个值

null表示空

Default 默认值

create table t2(sex enum(“boy”,”girl”) default “boy”);

Extra 额外设置

create table t1(id int(9) primary key auto_increment,name char(10) not null);

KEY 键值

MYSQL键值

普通索引 index

— 给字段值排序的树形结构,排序用算法(btree、b+tree、hash)

// 给字段加了索引后,会排序,当where name=”bob”,可以迅速找到, 否则要从一开始全部查找。

// 优点:加快查询数据的速度。

// 缺点:减慢写入数据时的速度,占用磁盘空间,新写入时还要再重新排序。

// 一个表中可以有多个index字段

// 字段的值允许有重复,也可以赋空值

// INDEX字段的KEY标志是MUL

在已有表中设置INDEX字段

create index 索引名 on 表名(字段名);

删除指定表的索引字段

drop index 索引名 on 表名;

创建时指定index字段

create table t1(name char(10),age(2),index(name),index(age));

删除索引

drop index 字段名on 表名;

查看表名信息

show index from 表名\G;

// 主要看表名.索引名.字段名.算法。默认用btree算法(二叉树算法)

主键 primary key

— 控制如何给字段赋值

// 一个表中只能有一个primary key字段

// 通常与auto_increment连用,让字段的值自动增长,前提(主键,数值)

// 字段值不能重复,且不能为空

// 主键字段的KEY标志是PRI

// 如果有多个字段都作为主键,称为复合主键,必须一起创建

建表时创建主键

1.>create table t1(id int(9) primary key auto_increment,name char(10) not null,age int(2) unsigned default 19);

insert into t1(name,age) values(“tom”,20); // id字段自增1

insert into t1 values(null,"bob",20); // null表示空,也会自增1

2.>create table t1(id int(9),name char(4),primary key(id));

在已有表里创建主键

alter table t2 add primary key(id); // 前提是id没有重复

删除主键

alter table t1 drop primary key;

有自动增长的情况下删除主键的操作

alter table t1 modify id int(9) not null; // 先删除自动增长

alter table t1 drop primary key;

创建复合主键

// 表中的多个字段一起做主键,赋值时,两个主键字段的值不同时重复

例子:同时重复(不可以)

PRI PRI

Name class pay

Bob nsd1804 yes

Bob nsd1804 no

create table t2(name char(4),class char(5),pay enum(“yes”,”no”),primary(name,class));

insert into t2 values(“bob”,”nsd1804”,”yes”);

insert into t2 values(“bob”,”nsd1804”,”no”); //会报错

insert into t2 values(“bob”,”nsd1805”,”yes”);

在已有表里创建复合主键

alter table t2 add primary key(name,class); //两个主键不重复

删除复合主键

alter table t1 drop primary key;

外键 foreign外键

— 让当前表字段的值在另一个表中字段值的范围内选择

// 表的存储引擎必须是innodb

// 字段类型要一致

// 被参照字段必须要是索引类型的一种(primary key)

例子:假如只有三名员工,结果给四个人发了工资,为了防止这种情况给 gz_id加外键,以yg_id作为参考

yginfo gztab

yg_id name gz_id pay

1 bob 1 30000

2 bob 2 40000

3 lucy 3 20000

4 30000

被参考的yginfo

create table yginfo(yg_id int(2) primary key auto_increment,name char(15))engine=innodb;

insert into yginfo(name) values(“bob”);

insert into yginfo(name) values(“bob”);

insert into yginfo(name) values(“lucy”);

创建外键gztab

create table gztab(gz_id int(2),pay float(7,2),primary key foregin key(gz_id) references yginfo(yg_id) on delete cascade on update cascade)engine=innodb;

// 为保持数据一致,同步删除,同步更新

// 设置为主键,不重复发工资,不能为空值

insert into gztab values(1,30000)

.....

insert into gztab values(4,30000)

// 给编号为4的员工存的时候报错,因为yg_id里没有4

删除外键

show create table gztab;

// CONSTRAINT gztab_ibfk_1外键名称

alter table gztab drop foreign key gztab_ibfk_1;

数据导入与导出

// 导出、导入数据 文件默认存储路径为 /var/lib/mysql-files

show variables like “secure_file_priv”;

自定义数据导入导出文件存储的目录

]# mkdir /mydata

]# chown mysql /mydata

]# vim /etc/my.cnf

[mysqld]

secure_file_priv=”/mydata”

]# systemctl restart mysqld

数据导入

— 把系统文件的内容存储到数据库服务器的表里(有格式规律)

// 字段分隔符要与文件内的一致

// 指定导入文件的绝对路径

// 导入数据的表字段类型要与文件字段匹配

// 禁用selinux保护机制

把系统文件拷贝到指定的目录下(在mysql登录状态下执行系统命令)

system cp /etc/passwd /mydata

在系统命令下执行mysql命令

]# mysql -uroot -p123456 -e “sql命令”

例子:mysql -uroot -p123456 -e “show slave status\G”

创建存储文件的表

use db3;

create table user(name char(50),password char(1),uid int(2),gid int(2),comment varchar(150),homedir char(150),shell char(50),index(name));

导入数据

load data infile “/mydata/passwd” into table db3.user fields terminated by “:” lines terminated by “\n”;

数据导出

— 把数据库服务器的表里的记录存储到系统文件里

// 导出的内容由SQL查询语句决定

// 导出的是表中的记录,不包括字段名

// 禁用selinux

SQL查询条件 into outfile “/指定目录/自定义文件名.txt” fields terminated by “分隔符” lines terminated by “\n”;

select * from t1 into outfile “/mydata/t1.txt” // 默认 tab \n

多表查询

复制表

备份表

create table 新表名 sql查询

create table user1 select from user; // 键值不会被复制

create table user3 select from user where 1=2;

// 后面跟一个不成立的条件,只复制表结构,不复制记录

快速建表

create table user2 select name from user order by uid limit 5;

多表查询

笛卡尔集 两个表相乘的积

create table t1 select name,uid,shell from user limit 5;

create table t2 select name,uid,shell,gid from user limit 3;

— select 字段名列表 from 表名列表 where 条件;

select from t1,t2;

select t1.,t2.uid,t2.password from t1,t2 where t1.uid = t2.uid;

嵌套查询

把内层的查询结果作为外层的查询条件

— select 字段名列表 from 表名 where 条件(select 字段名列表 from 表名 where 条件)

select name,uid from user where uid < (select avg(uid) from user); // 找出uid比uid平均值小的用户名字

select name from user where name in (select name from db.t3);

// 查找user表里有哪些名字在db库里的t3表里

连接查询

左连接查询

以左边的表为主显示查询结果

create table t1 select name,uid,shell from user limit 5;

create table t2 select name,uid,shell from user limit 3;

— select 字段名列表 from 表A left join 表B on条件

select from t1 left jion t2 on t1.uid = t2.uid

// 以t1表为主,显示5行

右连接查询

以右边的表为主显示查询结果

— select 字段名列表 from 表A right join 表B on条件

select from t1 right jion t2 on t1.uid = t2.uid

// 以t2表为主,显示3行

phpMyAdmin-2.11.11-all-languages.tar.gz软件

(MySQL图形管理工具)

常见的MySQL管理工具

类型 界面 操作系统 说明

mysql 命令行 跨平台 MySQL官方bundle包自带

MySQL-Workbench 图形 跨平台 MySQL官方提供

MySQL-Front 图形 Windows 开源,轻量级客户端软件

phpMyadmin 浏览器 跨平台 开源,需LAMP平台

Navicat 图形 Windows 专业、功能强大、商业版

部署LAMP/LNMP运行环境

// 安装 httpd、mysql、php、php-mysql

]# yum -y install httpd

]# systemctl start httpd

]# systemctl enable httpd

]# tar -xf mysql-5.7.tar.gz

]# rpm -Uvh mysql-community-*

]# systemctl start mysqld

]# systemctl enable mysqld

// phpMyadmin是用php语言开发的,想要服务器运行就要装这两个包

]# yum -y install php // 用来解释php代码的程序

]# yum -y install php-mysql

// 用来连接mysql数据库的连接命令的软件包

]# systemctl restart httpd

// 加载安装的php模块

安装软件

]# tar -zxvf phpMyAdmin-2.11.11-all-languages.tar.gz

// 解压即可

]# ls phpMyAdmin-2.11.11-all-languages

// 网页文件

]# mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpadmin

// 拷贝到httpd默认目录下,可以直接访问phpadmin

创建配置文件

// 指定管理数据库服务器

]# cd /var/www/html/phpadmin/

]# cp config.sample.inc.php config.inc.php

]# vim config.inc.php

17 $cfg['blowfish_secret'] = '自定义'; // 随便写东西

31 $cfg['Servers'][$i]['host'] = 'localhost'; // 不用修改

客户端访问

]# firefox http://192.168.4.50/phpadmin

// 用户名、密码和命令行登录mysql时相同

修改、恢复root密码

命令行改密码(操作系统管理员有权限)

]# mysqladmin -hlocalhost -uroot -p旧密码 passwrod “新密码”

恢复登录密码(操作系统管理员有权限)

// 忘记密码时

修改配置文件

]# vim /etc/my.cnf 追加写入

skip_grant_tables // 跳过授权库

重起mysqld服务

]# systemctl restart mysqld

登录mysql修改密码

update mysql.user set authentication_string=passwrod(“123456”) where user=”root” and host=”localhost”;

// password() 加密函数

更新权限

flush privileges;

注释配置文件中添加的那行,重起mysqld服务

用户授权

// 在数据库服务器上添加连接时使用的用户名

创建授权

— grant 权限列表 on 数据库名 to 用户名@”客户端地址” identified by “密码” [with grant option];

// with grant option 让添加的用户连接服务器后,也有授权权限

权限列表表示方式

// 所有权限 all

某种权限 select,insert,delete

客户端地址表示方式

// 所有主机 %

网段 192.168.4.%

指定主机 192.168.4.51

本机 localhost

数据库名表示方式

// 所有库、所有表 .

库下的所有表 库名.*

某张表 库名.表名

grant select,update(name,uid) on gamedb.to admin@"192.168.4.%" identified by "123456";

grant all on.* to root@”192.168.4.51” identified by “123456” with grant option; // 对所有库表有完全权限,且有授权权限

服务器查看授权信息

// 授权库mysql库记录授权信息,使用不同的表记录不同的授权信息

use mysql; // 进入mysql库,有如下四个表

user 已经添加的连接用户

db 记录已添加的连接用户对库的访问权限

tables_priv 记录已添加的连接用户对表的访问权限

columns_priv 记录已添加的连接用户对表中字段的访问权限

select user,host from mysql.user;

— show grants for 用户@”客户端地址”;

show grants for root@”localhost”;

客户端连接后查看信息

select @@hostname; // 客户端查看自己连接的主机的名字

select user(); // 显示自己以什么名字连接的服务器

select grants; // 客户端查看自己的被授权权限

做一个授权模版

查看代理信息

show variables like "%proxy%";

将代理授权打开proxy(临时)

set global check_proxy_users=”on”;

set global mysql_native_password_proxy_users=”on”;

将代理授权打开proxy(永久)

]# vim /etc/my.cnf

[mysqld]

check_proxy_users=on

mysql_native_password_proxy_users=on

]# systemctl restart mysqld

创建用户mysqladmin

create user mysqladmin identified by “123456”;

给用户mysqladmin授权

grant all on bbsdb.* to mysqladmin@"%";

将用户mysqladmin的权限映射给用户will、tom

create user will identified by “123456”;

create user tom identified by “123456”;

grant proxy on mysqladmin to will;

grant proxy on mysqladmin to tom;

权限撤销

revoke撤销

— revoke 某权限 on 数据库名 from 用户名@”ip”

select user,host from mysql.user;

show grants for 用户名@”ip”;

revoke grant option on . from root@”192.168.4.51”;

show grants for root@”192.168.4.51”; // 1、看权限信息

修改记录改权限

修改记录改权限 (将N改为Y,Y改为N)

select * from mysql.user where user=”root” and host=”192.168.4.51”\G; // 2、看权限信息

update mysql.user set Delete_priv=”N” where user=”root” and host=”192.168.4.51”;

flush privileges; // 刷新权限

删除授权用户

— drop user 用户名@”ip”;

select user,host from mysql.user;

drop user root@”192.168.4.52”;

权限说明

RELOAD // 有重新载入授权 必须拥有reload权限,才可以执行flush

FILE // 导入、导出数据

REFERENCES // 创建外键

SUPER // 关闭属于任何用户的线程

LOCK TABLES // 允许使用LOCK TABLES语句

EXECUTE // 执行存在的Functions,Procedures

REPLICATION SLAVE // 从主服务器读取二进制日志

REPLICATION CLIENT //允许在主/从数据库服务器上使用show status

CREATE ROUTINE // 创建存储过程

ALTER ROUTINE // 修改存储过程

EVENT // 有操作事件的权限

TRIGGER // 有操作触发器的权限

授权用户密码的修改

授权用户连接后修改连接密码

set password=password(“新密码”);

管理员重置授权用户的连接密码

set password for 用户名@”客户端地址”=password(“新密码”);

MySQL存储引擎

什么是存储引擎?

MySQL服务软件自带的功能程序,处理表的处理器

不同的存储引擎有不同的功能和数据存储方式

工作中建表时如何决定表使用存储引擎

执行写操作多的表适合使用innodb存储引擎,这样并发访问量大。

// 当有人只修改一行的话,如果用innodb,只锁一行,别人可以同时 访问这张表,如果用myisam,锁一张表的话,要等第一个改完, 才能第二个人访问。

执行查询操作多的表适合使用myisam存储引擎,节省系统资源。

// 当select * from t1 where id <=10,,如果用innodb,会给前10 行加锁,每一行都要锁一遍,占用cup,如果用myisam,锁一张 表,就只加锁一遍。

常见存储引擎(MyISAM、InnoDB)

MyISAM特点

1、支持表级锁(客户端连接数据库服务器后对表的数据做访问时,若表的 存储引擎是myisam时,会给整张表加锁)

2、不支持事务和事务回滚

3、每个表对应三个表文件

表.frm // 对应表结构 desc 表

表.MYD // 对应表数据

表.MYI // 对应表的index索引信息

InnoDB特点

1、支持行级锁(客户端连接数据库服务器后对表的数据做访问时,若表的 存储引擎是innodb时,只给表中被访问的行加锁)

2、支持事务和事务回滚

事务日志文件会记录所有的sql操作,启动mysql服务时自动创建

]# cd /var/ww/mysql

1、ibdata1 // 记录未执行成功的sql命令

2、ib_logfile0 // 记录执行成功的sql命令

3、ib_logfile1 // 记录执行成功的sql命令

3、每个表对应两个表文件

表.frm // 对应表结构 desc 表

表.ibd // 对应表数据和表的index索引信息

锁粒度(锁表的范围)

行锁 表锁 页级锁

锁类型

读锁(共享锁):支持并发读

当对一张表做查询(select)操作时,会加读锁

写锁(排他锁、互斥锁)

当对一张表做写(insert update delete)操作时,会加写锁

事务 (Transcations)

— 一次sql操作从建立连接到操作完成断开连接的过程称作事务

// 支持事务的表可以做事务回滚

事务回滚

一次sql操作只要有任意一步没有成功,会恢复所有操作 // 转账例子

事务特点(ACID)* 面试必问

Atomic:原子性

— 事务的整个操作是一个整体,要么全部成功,要么全部失败

Consistency:一致性 — 事务操作的前后,表中的记录没有变化

Isolation:隔离性 — 事务操作是相互隔离不受影响的

Durability:持久性 — 数据一旦提交,不可改变,永久改变表数据

查看存储引擎

show engines; // 默认为InnoDB

建表时指定存储引擎

create table 表名(id int(2)) engine=存储引擎名;

修改默认存储引擎

修改配置文件

]# vim /etc/my.cnf 追加写入

default-storage-engine=myisam

重起mysqld服务

]# systemctl restart mysqld

修改表使用的存储引擎

— alter table 表名 engine=存储引擎名; // 一般不会建表以后修改

关闭自动提交(默认自动提交)

show variables like "autocommit";

set autocommit=off;

手动提交

commit;

回滚操作

rollbak;

数据备份与恢复

// 方式分为物理备份和逻辑备份,逻辑备份又分为完全备份和增量备份,完 全备份又分为mysqldump和innobackupex,两种方式增量备份 又分启用binlog日志和第3方软件percona提供的 innobackupex命令两种方式。

// 增量备份:只备份新产生的数据,备份上次备份后,所有新产生的数据

// 差异备份:只备份新产生的数据,备份完全备份后,所有新产生的数据

// 生产环境下一般用完全备份+增量备份

物理备份

缺点:

— 跨平台性差

— 备份时间长、冗余备份、浪费存储空间

(50)备份库和表对应系统文件

1、]# cp -r /var/lib/mysql/ /root/mysql.bak

2、]# tar zcvf /mysql.tar.gz /var/lib/mysql/]# scp -r /root/mysql.bak 192.168.4.51:/root

物理恢复

(51)把备份文件拷贝回对应的数据库目录,所有者和组改为mysql,重 起数据库服务器

]# systemctl stop mysqld

]# rm -rf /var/lib/mysql

]# cd /root/mysql.bak

mysql.bak]# cp -r /var/lib/mysql

]# chown -R mysql.mysql /var/lib/mysql

]# systemctl start mysqld

完全备份mysqldump

缺点:

— 效率较低,备份和还原速度慢

— 备份过程中,数据插入和更新操作会被挂起

执行备份命令时,根据备份的库表生产对应的sql命令,把命令保存到指定的文件里。(备份时会锁表)

备份所有数据的3个对象:

一台数据库服务器的所有数据

一个库里的所有表

一张表里的所有数据

— ]# man mysqldump // man帮助

— ]# mysqldump -uroot -p123456 库名 > [目录]/文件名.sql

库名表示方式:

--all-databases 或 -A // 所有库、所有表

库名 // 备份库下的所有表

库名 表名 // 备份一张表的所有记录

-B 库1 库2 // 备份几个库的数据

例子(50)

]# mkdir /bakdir

]# mysqldump -uroot -p123456 db55 --master-data=1 > /bakdir/db55.sql

// --master-data=1解决在备份时有人写入数据,会丢一部分数据, 加入这句会记录当时的偏移量,配置从库时,写这个偏移量不丢 失那部分数据

]# vim /bakdir/db55.sql

// CHANGE MASTER TO MASTER_LOG_FILE='db60.000001', MASTER_LOG_POS=980;

这行不会注释,如果--master-data=2,这行会被注释

]# scp /bakdir/db55.sql 192.168.4.51:/root

完全恢复mysql

执行保存sql命令的备份文件,把数据写回数据库里。(恢复时会锁表)

1、— ]# mysql -uroot -p123456 库名 < [目录]/文件名.sql

2、— >source [目录]/文件名.sql

例子(51)

先创建一个库名为db55的数据库(提前建库、建表)

create database db55;

quit;

再完全恢复

1、]# mysql -uroot -p123456 db55 < /root/db55.sql

2、> use db55;

source /root/db55.sql

增量备份启用binlog日志文件

日志介绍:MySQL服务自带,是服务日志文件中的一种(默认没有启用), 记录除查询之外的sql命令

日志文件记录格式(三种)

statment:每一条修改数据的sql命令都记录再binlog日志中

row:不记录sql语句上下文相关信息,仅保存哪条记录被修改

mixed:两种方式的结合

查看当前日志记录格式

show variables like "binlog_format"; // 默认row

启用日志

]# vim /etc/my.cnf

[mysqld]

server_id=50

log-bin=/logdir/db50

// log-bin后面可以不写,不写就是默认目录和名称,一般 目录和文件名一起写,只写名字也可以,目录还是默认 数据库目录,只写目录(/logdir),就会认为/ 是目录, logdir是文件名

binlog-format=”mixed”

重起服务

]# systemctl restart mysqld

查看日志文件 和 内容

]# ls /var/lib/mysql/host50-bin.*

// host50-bin.00001 日志文件 >500M会变为00002

// host50-bin.index 索引文件

]# mysqlbinlog /var/lib/mysql/host50-bin.00001

增量恢复binlog日志文件

日志记录sql命令格式(两种)

mysqlbinlog 选项 /logdir/db50-bin.00001 | mysql -uroot -p123456 // 中间包含一个commit

偏移量:--start-position= --stop-position

时间点:--start-datetime=”yyyy-mm-dd hh:mm:ss”

--stop-datetime=”yyyy-mm-dd hh:mm:ss”

例子:

use db55;

delete from t2 where id in (1,2); // 模拟误删除

]# mysqlbinlog /logdir/db50-bin.00001

// 查看创建时的偏移量或时间点

]# mysqlbinlog --start-position=1702 --stop-position=1831 /logdir/db50-bin.00001 | mysql -uroot -p123456

// mysql进去多了id=1

]# mysqlbinlog --start-datetime="2018-08-24 15:18:31" --stop-datetime="2018-08-24 15:18:34" /logdir/db50-bin.00001 | mysql -uroot -p123456

// mysql登录进去查看多了id=2

手动生成新的日志文件(默认大于500M自动生成)

// 新的记录会记录在编号最大的日志文件里

1、]# mysqldump -uroot -p --flush-logs db55 > /bakdir/db55.sql

// --flush-logs完全备份后生成新的日志文件

2、> flush logs; // 执行一次生成一个新的日志文件

3、]# mysql -uroot -p123456 -e “flush logs”

查看正在使用的日志文件

show master status;

删除已有的日志文件

purge master logs to “db50-bin.000004” // 删除4之前所有的

reset master;

]# rm -rf /logdir/*

percona-xtrabackup-24-2.4.7-1.el7.rpm

libev-4.15-1.el6.rf.x86_64.rpm // 依赖包

一款强大的在线热备份工具(xtrabackup工具)

— 备份过程中不锁库表,适合生产环境

— 由专业组织Percona提供

主要包含两个组件

— xtrabackup:C程序,支持InnoDB/XtraDB

— innobackupex:以Perl脚本封装xtrabackup,还支持MyISAM

Innobackupex增量备份时一定是innodb存储引擎

第3方软件完全备份和恢复

安装软件包(percona、libev)

]# rpm -ivh percona-xtrabackup-24-2.4.7-1.el7.x86_64.rpm

// 安装时有依赖就安装依赖,so代表模块,不是软件名

]# rpm -ivh libev-4.15-1.el6.rf.x86_64.rpm

]# rpm -ql percona-xtrabackup-24 // 查看安装的列表

查看备份帮助

]# man innobackupex

Innobackupex基本选项

--host 主机名

--user 用户名

--port 端口号

--password 密码

--no-timestamp 不用日期命名备份文件存储的子目录名

--databases 数据库名

// 什么也不写 所有库

--databases=“库名” 单个库

--databases=“库1 库2” 多个库

--databases=“库.表” 单个表

完全备份innobackupex

]# innobackupex --user root --password 123456 --databases=" mysql sys performance_schema gamedb" /allbak --no-timestamp

// 用innobackupex完全备份时的一个缺点时,恢复时要求数据库目 录/var/lib/mysql为空,所以备份的时候要将系统的三个库也备份 上,有一个是虚拟库,不用备份

// /allbak这个目录,如果之前有,要求里面也为空,不然会报错,没 有就会自动创建

]# ls /allbak

// 里面包含两部分,备份的数据和日志文件,配置文件就是备份数据时 的备份信息,统称日志文件

— xtrabackup_checkpoints

// 记录当前备份目录的备份类型和日志序列号的范围(lsn)

from_lsn=

to_lsn=

// 序列号对应的sql命令存放在xtrabackup_logfile里

]# cat /allbak/xtrabackup_checkpoints // 类型是full-backuped

完全恢复innobackupex

准备恢复数据(回滚备份目录下的日志信息)

]# innobackupex --user root --password 123456 --database=”mysql sys performance_schema gamedb” --apply-log /allbak

]# cat /allbak/xtrabackup_checkpoints // 类型是full-prepared

停掉服务,清空数据库目录

]# systemctl stop mysqld

]# rm -rf /var/lib/mysql/*

]# ls /var/lib/mysql

把备份目录下的数据拷贝回数据库目录下

]# innobackup [--user root --password 123456] --databases=”mysql sys performance_schema gamedb” --copy-back /allbak

修改所属主、组

]# chown -R mysql.mysql /var/lib/mysql

启动mysqld服务

]# systemctl start mysqld

增量备份innobackupex

// Innobackupex增量备份时表一定是innodb存储引擎

首先有一次完全备份

]# innobackupex --user root --password 123456 --databases=”sys mysql performance_schema gamedb” /fullbak --no-timestamp

完全备份后向表中存储新数据

insert into gamedb,a values(666);

insert into gamedb,a values(888);

对数据做增量备份

]# innobackupex --user root --password 123456 --incremental /new1dir --incremental-basedir=/fullbak --no-timestamp

// incremental 增量备份数据存放的目录

// incremental-basedir 以上次备份的目录为基准

// /newdir目录要求为空,没有此目录时自动创建

]# ls /new1dir 增量备份目录下有.meta 完全备份没有

]# cat /allbak/xtrabackup_checkpoints //类型是full-incremental

增量备份后向表中再次存储新数据

insert into gamedb,a values(456);

insert into gamedb,a values(789);

对数据做增量备份

]# innobackupex --user root --password 123456 --incremental /new2dir --incremental-basedir=/new1dir --no-timestamp

]# ls /new2dir

增量恢复innobackupex

// 将完全备份和两次增量备份的日志合并在一起(才是所有的数据)

准备恢复数据(回滚备份目录下的日志信息) 从最原始备份的那一次开始恢复

]# innobackupex --user root --password 123456 --apply-log --redo-only /fullbak/

]# innobackupex --user root --password 123456 --apply-log --redo-only /fullbak/ --incremental-dir=/new1dir

]# innobackupex --user root --password 123456 --apply-log --redo-only /fullbak/ --incremental-dir=/new2dir

停掉服务,清空数据库目录

]# systemctl stop mysqld

]# rm -rf /var/lib/mysql/*

]# ls /var/lib/mysql

把备份目录下的数据拷贝回数据库目录下

]# innobackupex --copy-back /fullbak/

修改所属主、组

]# chown -R mysql.mysql /var/lib/mysql/

启动mysqld服务

]# systemctl start mysqld

使用innobackupex完全备份文件恢复单个表

// 恢复单个表时不需要清空数据库目录,所以备份时也不需要备份系统库, 但是需要提前把表结构建出来

备份gamedb库

]# innobackupex --user root --password 123456 --databases="gamedb" /gamedbdir --no-timestamp

模拟a表被删除

drop table gamedb.a;

提前把a表的表结构建出来

create table gamedb.a(id int(2));

删除表空间(.ibd文件)

alter table gamedb.a discard tablespace;

导出表信息

]# innobackupex --user root --password 123456 --apply-log --export /gamedbdir/ // 多出了 表.cfg、表.exp、表.ibd

将三个文件拷贝到gamedb目录下

]# cp /gamedbdir/gamedb/a.{cfg,exp,ibd} /var/lib/mysql/gamedb

修改导入内容的所属主、组

]# chown mysql.mysql /var/lib/mysql/gamedb/a.*

导入表空间

alter table gamedb.a import tablespace; 恢复完成

mysqldump完全备份脚本

]# vim /root/db55.sh

#!/bin/bash

if [ ! -e /bakdir ];then

mkdir /bakdir

fi

x=date +F

mysqldump -uroot -p密码 db55 > /bakdir/db55_${x}.sql

]# chmod +x /root/db55.sh

]# /root/db55.sh

]# ls /bakdir

]# ctrontab -e

00 23 1 /root/db55.sh &> /dev/null

监视从库IO线程和SQL线程脚本

]# mkdir /root/bin

]# vim /root/bin/checkslave.sh

#!/bin/bash

io=mysql -uroot -p123456 -e "show slave status\G" 2> /dev/null | grep -i Slave_IO_Running: | head -1 | awk '{print $2}'

sql=mysql -uroot -p123456 -e "show slave status\G" 2> /dev/null | grep -i Slave_SQL_Running: | tail -1 | awk '{print $2}'

echo $io

echo $sql

if [ $io == "Yes" ];then

echo "io is running"

else

echo "io is down"

fi

if [ $sql == "Yes" ];then

echo "sql is running"

else

echo "sql is down"

fi

Innobackupex完全、增量备份脚本(一起用)

提取年月日 ]# date +%F

提取年 ]# date +%Y

提取月 ]# date +%m

提取日 ]# date +%d

Innobackupex完全备份脚本

]# vim /root/allbak.sh

#!/bin/bash

day=date +%F

innobackup --user root --password 123456 /fullbak_${day} --no-timestamp

]# chmod +x /root/allbak.sh

]# /root/allbak.sh

]# crontab -e

00 23 1 /root/allbak.sh

Innobackupex增量备份脚本

]# vim /root/newallbak.sh

#!/bin/bash

jt=date +%d

zt=expr $jt - 1

m=date +%m

Innobackupex --user root --password 123456 --incremental /new${m}${jt}dir --incremental-basedir=/new${m}${zt}dir --no-timestamp

]# chmod +x /root/newallbak.sh

]# /root/newallbak.sh

]# crontab -e

00 23 1 /root/newallbak.sh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值