首页 > 代码库 > mysql 实用
mysql 实用
( 静静 )
DBA 数据库管理员
IDC监控
mysql数据库管理 7
Linux安全 3
Linux监控 3
————————————————————————————————————————
在mysql中 我创建一个student库 并 设置字符集:utf8 -- UTF-8 Unicode,排序规则:utf8_general_ci
语句怎样的
mysql> create database if not exists student default charset utf8 collate utf8_general_ci;
导入sql脚本 自动创建所需的表。
mysql> use cbas_orige
Database changed
mysql> source /root/dbtables.sql;
————————————————————————————————————————
create table t1(name char(10),pawword int(10),shel char(30))charset=utf8;
如果导入的是中文在 创表创库时加上 utf8
(不管什么数据如果要想导入到数据库中,一定要在安装数据库本机中导入,给别的用户授任何权限都只有增删该查,不能执行导入这命令)
mysql>load data infile "/etc/passwd" into table userdb.student fields terminated by ":" lines terminated by "\n";
ftp://172.40.50.117/soft 软件
++++++++++++++++++++++++
mysql数据库管理 7
零基础入门
表管理
用户授权与权限撤销
数据备份与数据恢复
mysql主从同步
mysql读写分离
mysql集群
mysql优化
一、零基础入门
1. 什么是数据库 存储数据库的仓库
2 提供数据库服务的软件有哪些?
Oracle(不开源跨平台) DB2(不开源跨平台) SQL SERVER(不开源不跨平台) MySQL(开源跨平台)
商业软件
开源软件 不等于 免费
是否夸平台 Unix Linux Windows
既开源又跨平台 MySQL
MySQL发展史?
MySQL特点?
MariaDB ( RHEL7 )
数据迁移 mysql - > MariaDB
关系型数据库系统
非关系型数据库系统 Mongodb
用户名 密码
商品信息
名 型号 价格 总量
大衣 M 1800 3
销售信息
名 型号 价格 个数
大衣 M 1800 2
工作中都哪些公司在使用数据库服务
游戏网站 购物网站 论坛网站
婚恋网站 金融网站
数据库服务器用来储存什么数据?
登录账户 购买的商品 发的帖子
提供网站服务 apache Nginx Tomcat
应用环境 : LAMP LNMP
搭建数据库服务器(HP Dell 联想 大概市场价位 性能)
CPU 内存 存储
在IP地址是 x.x.x.x 运行MySQL数据库服务
软件包的来源?
官网下载 (一般奇数测试 偶数正式版)
操作系统安装光盘自带的
软件包的封包 类型? .rpm
源码 .tar.gz .tar.bz2
装包 (.rpm)
安装操作系统安装光盘自带的mysql软件提供
数据库服务
rpm -q mysql-server || yum -y install
mysql-server
service mysqld status|start|stop
chkconfig mysqld on
客户端的访问(默认只允许本机访问)
[root@stu yum.repos.d]# which mysql
/usr/bin/mysql
[root@stu yum.repos.d]# rpm -qf
/usr/bin/mysql
mysql-5.1.73-5.el6_6.x86_64
[root@stu yum.repos.d]#
[root@stu ~]# mysql
mysql> quit
[root@stu ~]#
安装官网下载的mysql软件提供数据库服务
/etc/init.d/mysqld stop
rpm -e --nodeps mysql-server mysql
rpm -q mysql-server mysql
rm -rf /etc/my.cnf
rm -rf /var/lib/mysql/*
tar -xvf MySQL-5.6.rpm.tar
rpm -Uvh MySQL-*.rpm
service mysql start
213 cat /root/.mysql_secret
214mysql -hlocalhost -uroot -pCxifrkkA
mysql>set password for root@"localhost"=password("123");
mysql>quit;
mysql -hlocalhost -uroot -p123
mysql>show databases;
主配置文件 /etc/my.cnf
服务名 mysqld
进程名 mysqld
进程所有者/组 mysql/mysql
端口号 3306
传输协议 tcp
数据库目录 /var/lib/mysql/
把数据存储到数据库服务器上的过程?
1 连接数据库服务器 mysql
2 选择库 use 库名;
3 创建表
4 向表中插入记录 insert into
5 断开连接 quit
*数据以文件的形式存储在数据库目录下
数据库服务的基本使用?
SQL命令使用规则: 命令不区分字母大小写
\c 终止命令
命令必须以;结尾
命令不支持tab键补齐
库名的命名规则: 具有唯一性
区分字母大小写
只能使用数字、字母 _
不能是纯数字
不要使用特殊字符和关键字
? * .
show databases; 显示已有的库
create database 库名;
use 库名; 切换库
select database(); 查看当前所在的库
drop database 库名; 删除已有的库
show tables; 显示当前所在库下已有的表
创建表(表存放在库里)
create table 库名.表名(
字段名1 类型,
字段名2 类型,
字段名3 类型
);
create table bbsdb.stuinfo(
name char(10),
age int,
sex char(10)
);
select 字段名列表 from 表名; 查看表记录
select * from stuinfo;
desc 表名; 查看表结构
desc stuinfo;
desc mysql.db;
select user,host,db from mysql.db;
向表中插入记录
insert into stuinfo values("jim",21,"boy");
删除表中的所有记录
delete from 表名;
delete from stuinfo;
删除表
drop table 表名;
drop table stuinfo;
建表的语法格式
create table 表名(
字段名 类型(宽度) 约束条件,
字段名 类型(宽度) 约束条件,
字段名 类型(宽度) 约束条件
);
++++++++++++++++++++++++++++++++++++
mysql数据库类型
字符类型 (姓名 家庭地址)
char 定长 255
varchar 变长 255+
65532
大文本类型
blob
text
create table t1(
name char(5),
address varchar(20)
);
desc t1;
insert into db10.t1 values("jerryy","beijing");
insert into db10.t1 values("jerry","beijing");
select * from t1;
t1 t2
name name
char(3) varchar(3)
jim jim
a a
ab ab
abc abc
abcd abcd
create table t5( name text );
create table t5( name blob );
数值类型 (工资 成绩 年龄 身高 体重)
18000.88 59.9 21
+21
-21
整数类型
根据存储数值的范围又分为:
有符号 无符号
tinyint 微小整型 -128~127 0~255
smallint
MEDIUMINT
int
bigint
create table t7(level tinyint);
create table t8(age tinyint unsigned);
insert into t7 values(170);
insert into t7 values(-17);
insert into t7 values(128);
insert into t8 values(170);
insert into t8 values(-170);
insert into t8 values(17.54);
insert into t8 values(17.44);
select * from t8;
select * from t7;
浮点型 float double
单精度 双精度
float(n,m)
double(n,m)
n 表示总位数
m 表小数位位数
整数.小数
1023.77
create table t9(
name char(10),
age int,
pay float(7,2)
);
insert into t9 values ("jim",21,118000.23);
insert into t9 values ("jim",21,118000);
数值类型的宽度与字符类型宽度的区别?
数值类型的宽度是显示宽度,不能够控制给字段赋值的大小,字段值的大小由字段类型决定。
create table t10(
name char(3),
id int(2)
);
insert into t10 values("lucy",1129);
insert into t10 values("tom",1129);
insert into t10 values("luc",1029);
create table t12(
level int(7) zerofill,
id int(3) zerofill
);
create table t13(
level int (1)
id int(1)
);
日期时间类型 (生日 注册时间 入职时间)
年 year YYYY 2016
01-69 20XX
70-99 19XX
00 0000
日期 date YYYYMMDD 20161219
时间 time HHMMSS 144518
日期时间 ( 约会时间 )
datetime / timestamp
YYYYMMDDHHMMSS
20170214183018
datetime 与 timestamp 的区别?
当不给timestamp类型的字段赋值时,用系统当前的时间给字段赋值。
create table t16(
time1 timestamp,
time2 datetime
);
insert into t16 values(20171219165200,20161219165200);
insert into t16 (time1) values(20191219165200);
insert into t16 (time2) values(20151219165200);
create table t15(
name char(10),
age tinyint(2) unsigned,
pay float(7,2),
up_class time,
birthday date,
s_year year,
meetting datetime
);
insert into t15 values("bob",21,18800.88,083000,20170101,1995,20170224203000);
insert into t15(name,s_year)values("lucy",13);
insert into t15(name,s_year)values("alic",70),("lilei",00);
select name,s_year from t15;
使用时间函数获取时间给日期时间类型字段赋值?
now() 获取当前系统时间
year() 获取年份
date() 获取日期
month() 获取月份
day() 获取日期(几号)
time() 获取时间
select now();
select year( now() );
select year( 20191224 );
select date( now() );
insert into t15 values("lili",21,18800.88,093000,20171008,1995,now());
insert into t15 values("jerry",29,28800.88,now(),now(),now(),now());
insert into t15 values("tom",21,18800.88,time(20171224201818),date(20171224201818),year(now()),now());
枚举类型 (爱好 性别 专业 )
字段的值只能在列举的范围内选择
enum(值列表) 单选
set(值列表) 多选
create table t177(
name char(10),
sex enum(0,1),
likes set("book","game","film","music")
);
create table t17(
name char(10),
sex enum("boy","girl","no"),
likes set("book","game","film","music")
);
desc t17;
insert into t17 values("bob","boy","woman,game");
insert into t17 values("bob","boy","book,game");
insert into t17 values("alic",3,"game");
select * from t17;
查看建表过程
show create table 表名;
create table 学生信息表2(
姓名 char(10),
年龄 int(2)
)DEFAULT CHARSET=utf8;
insert into 学生信息表2 values ("张三丰",21);
课后作业:
创建stuinfo表,设置合理的字段个数和字段类型。
+++++++++++++++++++++++++++++++++++++++++++++++
day01内容回顾:
提供数据库服务的软件有哪些?
哪些是开源软件 商业软件 是否跨平台?
mysql的发展史? 特点 ? 应用场景 分支版本
安装系统自带的mysql数据软件提供服务?
rpm -q mysql-server mysql
启动mysql数据库服务
service mysqld start|stop|status
3306
/etc/my.cnf
mysqld
mysql/mysql
tcp
/var/lib/mysql/
连接数据库服务器
mysql -hlocalhost -uroot -p123 库名
SQL命令 的使用规则?
管理库相关的命令?
show databases; (显示有哪些数据库)
use 库名;(进入一个数据库)
select database();(查看当前在哪一个库)
show tables; (查看名下有哪些表)
create database 库名;(创建一个数据库)
drop database 库名;(删除一个数据库)
管理表相关的命令?
create table 表(字段列表); mysql> create table t1(name int);创建一个表
select * from 表名; (查看表中的内容)
desc 表名; ( 打开该表)
delete from 表名; (删除表中的内容)
drop table 表名; (删除该表)
insert into 表名 values(字段值列表);
mysql数据类型?
字符类型 char varchar text blob
数值类型 tinyint smallint int bigint
float(n,m)
double(n,m)
阐述zerofill 和 unsigned 作用?
日期时间类型 year data time datetime timestmap
使用2位数给year类型字段赋值的规律?
01-69 20xx
70-99 19xx
00 0000
时间函数 now() year() date() day() month() time()
枚举类型 enum set
单选 多选
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
约束条件
作用:当向表中插入新记录时,限制如何给字段赋值,若建表时不设置约束条件,使用mysql的默认设置。
Null 是否允许为null (空) 不设置默认允许为空
not null 不允许为null
mysql> create table t18(
-> name char(10) not null,
-> age tinyint(2) unsigned default 23,
-> sex enum("boy","girl") default "boy",
-> likes set("it","book","work","film") default "it,book"
-> );
Query OK, 0 rows affected (0.67 sec)
create table t22(
name char(5) not null,
id int(2) not null
);
insert into t21 values(null,null);
insert into t22 values("",19);
insert into t22 values("NULL",19);
Key 是否是索引字段
默认不是索引字段
Default 字段是否有默认值,若没有设置默认值,默认值是null
作用:向表中插入新记录时,当不给记录的字段赋值时,使用字段的默认值给字段赋值,指定默认值时 要与字段的类型匹配。
字段名 类型(宽度) default 值
create table t23(
name char(10) not null ,
age tinyint(2) unsigned default 21,
sex enum("boy","girl") not null default "boy",
likes set("book","music","film","game") default "film,game"
);
insert into t23(name)values("bob");
insert into t23 values("tom",28,"girl","book");
insert into t23 values(null,28,"girl","book");
insert into t23 values("null",28,"girl","book");
insert into t23 values("",28,"girl","book");
Extra 额外设置(例如自增长 描述信息)
+++++++++++++++++++++++++++++++++++++++++++++++
修改表结构
alter table 表名 执行动作;
add 添加新字段
add 字段名 类型(宽度);
add 字段名 类型(宽度) 约束条件 ;
add 字段名 类型(宽度) 约束条件 first;
add 字段名 类型(宽度) 约束条件 after 字段名;
alter table t1 add class char(7) default "nsd1609" first,add tel char(11) ,add sex enum ("boy","girl") default "boy" after name;
drop 删除字段
drop 字段名
alter table t1 drop name,drop sex;
modify 修改字段类型
* 不能与字段已经存储的数据冲突
modify 字段名 类型(宽度) 约束条件;
mysql> alter table t1
-> modify
-> sex enum("boy","girl","no") not null default "no";
change 修改字段名
change 原字段名 新字段名 类型(宽度) 约束条件;
alter table t1 change tel iphone char(11);
修改表名
alter table 原表名 rename [to] 新表名;
alter table t1 rename t111;
+++++++++++++++++++++++++
day02
一、mysql索引
二、mysql存储引擎
一、mysql索引
什么是索引? 相当于 "书的目录"
总页数 1000页
1~1000
目录 1----30
第一章 31--217 网站搭建
35-40 数据加密 2
第2章 218--273 dhcp
。。。
第十章
正文
索引的优点 加快查询记录的速度.
索引的缺点 会减慢写的速度( insert update delete ).
占用物理存储空间.
在表里建索引 设置在字段上
stuinfo.frm stuinfo.ibd
name class sex age
jim
tom
lucy
jerry
bob
alic
aliccc
select name from userinfo where name like "j%";
mysql索引类型?
普通索引 index *
唯一索引 unique
主键 primary key *
外键 foreign key *
全文索引 fulltext
使用索引(查看 创建 使用规则 删除 )?
查看索引?
desc 表名;key
show index from 表名\G;
Table: user
Column_name: Host
Key_name: PRIMARY
Index_type: BTREE B+tree hash
二叉树
1-10
1-5 6-10
1-2.5 2.6-5
++++++++++++++++++++++
index普通索引的使用规则?
一个表中可以有多个INDEX字段
字段的值允许有重复,且可以赋NULL值
经常把做查询条件的字段设置为INDEX字段
INDEX字段的KEY标志是MUL
创建普通索引?
1 在已有表里创建index字段
create index 索引名 on 表名(字段名);
create index sex on t111(sex);
2 建表时创建index字段
create table 表名 (
字段名列表,
index(字段名),
index(字段名)
);
create table t24(
name char(10) ,
age tinyint(2) unsigned default 21,
sex enum("boy","girl") default "boy",
likes set("book","music","film","game") default "film,game",
index(name),
index(sex)
);
insert into t24(name)values("bob"),("bob"),(null),(null);
删除普通索引?
drop index 索引名 on 表名;
drop index sex on t24;
++++++++++++++++++++++++++++++++++++++++++++++
primary key 主键的使用规则?
一个表中只能有一个primary key字段
对应的字段值不允许有重复,且不允许赋NULL值
如果有多个字段都作为PRIMARY KEY,称为复合主键,必须一起创建。
主键字段的KEY标志是PRI
通常与 AUTO_INCREMENT 连用
经常把表中能够唯一标识记录的字段设置为主键字段[记录编号字段]
建表时创建主键字段
create table t25(
name char(10),
age int(2),
primary key(name)
);
create table t26(
name char(10) primary key,
age int(2)
);
删除主键
alter table 表名 drop primary key;
在已有表里创建主键
alter table 表名 add primary key(字段名);
复合主键的使用? 多个字段一起做主键是复合主键 必须一起创建。
*字段的值不允许同时相同。
create table t29(
host char(10),
db char(10),
user char(10),
primary key(host,db,user)
);
alter table t29 drop primary key;
alter table t29 add primary key(host,user,db);
insert into t29 values("2.1.1.1","game","tom");
insert into t29 values("2.1.1.1","bbsdb","tom");
insert into t29 values("2.1.1.1","game","jim");
通常和aUTO_INCREMENT 连用 实现字段值的字段增长
数值类型
主键
id name age
1 jim 21
2 jim 21
3 jim 21
create table t221(
id int(2) primary key auto_increment,
name char(10),
age int(2)
);
insert into t221(name,age)values("jim",21);
insert into t221(name,age)values("tom",19);
select * from t221;
insert into t221(id,name,age)values(7,"bob",19);
select * from t221;
经常把表中能够唯一标识记录的字段设置为主键字段[记录编号字段]
+++++++++++++++++++++++++++++++++++++++++++++
唯一索引 unique ?
字段的值可以为Null 但不可以重复
一个表里可以有多个unique字段
标志 UNI
姓名 身份证 考试证 护照 驾驶证
jim null
tom null
建表时创建
create table t29(
name char(10),
stu_id char(9),
age int(2),
unique(stu_id)
);
mysql> insert into t29 values ("lucy","nsd160903",18);
Query OK, 1 row affected (0.05 sec)
mysql> insert into t29 values ("lucy","nsd160901",18);
mysql> insert into t29 values ("lucy","nsd160903",18);
mysql> insert into t29 values ("lucy",null,18);
drop index 索引名 on 表名;
drop index stu_id on t29;
在已有表里创建unique字段
create unique index 索引名 on 表名(字段名);
create unique index stu_id on t29(stu_id);
++++++++++++++++
缴费表
jfb_id name pay
98 jim 20000
87 bob 18000
92 alic 20000
班级表
bjb_id name
98 jim
87 bob
+++++++++++++++++++++++++++++++++++++++++++++++++
外键 foreign key *
功能 让当前表某个字段的值,在另一个表某个字段值的范围内选择。
使用规则?
1 表的存储引擎必须是innodb
2 字段的数据类型要匹配
3 被参考的字段必须是key 中的一种 (primary key)
create table jfb(
jfb_id int(2) primary key auto_increment,
name char(10),
pay float(7,2)
)engine=innodb;
insert into jfb(name,pay)values("bob",18000),("lucy",17800),("alic",20000);
create table bjb(
bjb_id int(2),
name char(10),
foreign key(bjb_id) references jfb(jfb_id) on update cascade on delete cascade
)engine=innodb;
mysql> show create table bjb;
select * from bjb;
insert into bjb values(2,"lucy");
insert into jfb(name,pay)values("lilei",18000);
insert into bjb values(5,"lilei");
update jfb set jfb_id=8 where jfb_id=2;
delete from jfb where jfb_id=3;
++++++++++++++++++++++++++++++++++++++++++++++++++++++
使用外键的注意事项?
delete from jfb;
alter table jfb drop jfb_id;
drop table jfb;
删除外键
show create table 表名;
alter table 表名 drop foreign key 外键名;
alter table bjb drop foreign key bjb_ibfk_1;
++++++++++++++++++++++++++++++++++++++++++++++++++++++++
二、mysql存储引擎
什么是存储引擎?
表的处理器,是mysql数据库服务软件自动程序,不同处理器有不同的功能和数据存储方式。
查看数据库服务支持哪些存储引擎?
show engines;
InnoDB DEFAULT
修改mysql数据库服务默认使用的存储引擎?
vim /etc/my.cnf
[mysqld]
default-storage-engine=myisam
:wq
service mysql stop
service mysql start
建表时指定表使用的存储引擎
create table t31(name char(10))engine=memory;
修改表使用的存储引擎?
alter table 表名 engine=存储引擎名;
alter table t31 engine=innodb;
查看表使用的存储引擎?
show create table 表名;
工作中使用哪种存储引擎?
myisam
innodb
myisam的特点?
支持表级锁
不支持外键 、 事务 、事务回滚
独享表空间
t1.frm 表结构
t1.MYD 表记录
t1.MYI 表索引
innodb的特点?
支持行级锁
支持外键 、 事务 、事务回滚
共享表空间
t3.frm 表结构
t3.ibd 表记录+表索引
事务? 一次sql操作从开始到结束的过程。
事务回滚?执行一次事务,只要执行过程中,任何一步执行失败,就恢复之前所有的sql操作。
ATM
A ------------> B
A 登录 密码
转账 金额 10000
对方卡号 xxxxxx
确定
转账中...... A-1W B+1W
余额不足
转账成功
退卡
事务日志文件记录对所有inondb存储引擎的表执行过的sql命令。
ibdata1 记录sql命令产生的数据信息
ib_logfile0----|
|---> 记录SQL 命令
ib_logfile1----|
insert into t1 values(101),(202),(999);
ti.idb 真实的数据
select * from t1
id
101
202
999
锁机制是为了解决客户端的并发访问冲突问题。
锁粒度: 表级锁 行级锁 页级锁
锁类型:
读锁 (共享锁) select * from t1;
写锁 (互斥锁 排它锁)
insert into t1 values(22);
update t1 set id=102 where id=22;
delete from t1 where id=99;
建表时如何决定表使用的存储引擎?
执行写操作多的表适合使用inondb存储引擎,这样并发访问大。
执行读操作多的表适合使用myisam存储引擎.
mysql体系结构(mysql服务的工作过程)
连接池
sql接口
分析器
优化器
查询缓存
存储引擎
文件系统
管理工具
++++++++++++++++++++++++
day02内容回顾:
1约束条件:
是否允许为空 not null
是否是索引
默认值 default 值
额外设置
2修改表结构:
alter table 表名 执行动作;
add after first
modify
drop
change
3mysql 索引
什么是索引?
优点与缺点?
mysql索引类型
index primary key unique foreign key
索引的查看 创建 删除 使用规则
4 mysql存储引擎
修改mysql数据库服务默认使用的存储引擎
vim /etc/my.cnf
[mysqld]
default-storage-engine=存储引擎名
:wq
service mysql restart
查看存储引擎:
show engines;
show create table 表名;
create table 表名(字段列表)engine=存储
引擎名;
alter table 表名 engine=存储引擎名;
+++++++++++++++++++++++
day03
数据导入 : 把系统文件的内容存储到数据库的表里。
语法格式:
mysql> LOAD DATA INFILE ‘文件名‘ INTO TABLE 表名
FIELDS TERMINATED BY ‘分隔符‘ LINES TERMINATED BY ‘\n‘;
把系统用户信息存储到数据库服务器userdb库下的student表里。
cat /etc/passwd
用户名 密码 uid gid 描述信息 家目录 shell
create database userdb;
create table userdb.student(
name char(25),
password char(1),
uid smallint(2),
gid smallint(2),
comment varchar(50),
homedir char(30),
shell char(30),
index(name)
);
(不管什么数据如果要想导入到数据库中,一定要在安装数据库本机中导入,给别的用户授任何权限都只有增删该查,不能执行导入这命令)
mysql>load data infile "/etc/passwd" into table userdb.student fields terminated by ":" lines terminated by "\n";
-----------------------
mysql> select * from student;
mysql>alter table userdb.student add id int(2) zerofill primary key auto_increment first;
数据导入注意事项:
字段分隔符要与文件内的一致
指定导入文件的绝对路径
导入数据的表字段类型要与文件字段匹配
++++++++++++++++++++++++++++++++++++++
数据导出: 把表中的记录存储到系统文件里。
语法格式:
sql查询命令 INTO OUTFILE ‘文件名‘;
sql查询命令 INTO OUTFILE ‘目录名/文件名‘;
sql查询命令 INTO OUTFILE ‘目录名/文件名‘ fields terminated by "符号";
sql查询命令 INTO OUTFILE ‘目录名/文件名‘ lines terminated by "!!!";
sql查询命令 INTO OUTFILE ‘目录名/文件名‘ fields terminated by "符号" lines terminated by "符号";
mysql>select * from student into outfile "plj.txt";
mysql>select * from userdb.student into outfile "/tmp/plj8.txt";
#mkdir /mydata
#chown mysql /mydata
mysql>select * from userdb.student into outfile "/mydata/plj8.txt";
mysql>select name,uid,shell from userdb.student into outfile "/mydata/plj1.txt";
mysql>select name,uid,shell from userdb.student limit 4;
mysql>select name,uid,shell from userdb.student limit 4 into outfile "/mydata/plj3.txt" fields terminated by "##";
mysql>select name,uid,shell from userdb.student limit 4 into outfile "/mydata/plj7.txt" lines terminated by "!!!";
数据导出的注意事项:
导出的内容由SQL查询语句决定
若不指定路径,默认会放在执行导出命令时所在库对应的数据库目录下。
应确保mysql用户对目标文件夹有写权限。
目标位置文件具有唯一性
++++++++++++++++++++++++++++++++++++++++++++++++++++
管理表记录
插入新记录 insert into
一次插入一条记录 给记录的所有字段赋值
insert into 库.表 values(值列表);
一次插入多条记录 给记录的所有字段赋值
insert into 库.表 values(值列表),(值列表);
一次插入1条记录 给记录的指定字段赋值
insert into 库.表(字段名列表) values(值列表);
一次插入多条记录 给记录的指定字段赋值
insert into 库.表(字段名列表) values(值列表),(值列表);
insert into userdb.student values
(26,"bob","x",2077,2077,"this is student","/home/bob","/sbin/nologin");
insert into userdb.student values(27,"bob","x",2077,2077,"this is student","/home/bob","/sbin/nologin"),(28,"bob","x",2077,2077,"this is student","/home/bob","/sbin/nologin");
insert into userdb.student(name,uid,gid) values("alic",300,301);
insert into userdb.student(name,uid,gid) values("alic",300,301),("lucy",309,401);
++++++++++++++++++++++++
查询表记录 select
select 字段列表 from 表名;
select 字段列表 from 表名 where 表达式;
select * from student;
select id,name,homedir from student;
select 字段列表 from 表名 where 条件表达式;
select * from student where id=3;
select id,name,homedir from student where id=3;
条件的表示方式?
1 数值比较
字段名 符号 数字
= != > >= < <=
select * from student where id=5;
select * from student where id<=10;
select name,shell from student where uid=500;
select * from student where uid=500;
2 字符比较
字段名 符号 "值"
= !=
select name from student where name="zhangsan";
select * from student where name!="root";
3 范围内比较
between ... and ... 在...之间
in (值列表) 在....里
not in (值列表) 不在....里
select name,uid,homedir,shell from student where uid between 10 and 20;
select name from student where name in ("root","daemon","rsync");
select name,uid from student where uid in (2000,100,105,13);
select id,name,uid from student where id not in (1,10,20);
+++++++++++++++++++++++++++++++++++
4 匹配空 is null
匹配非空 is not null
insert into student(id,name)values(30,""),(31,null),(32,"null"),(33,NULL);
select id,name from student where name is null;
select id,name from student where name="null";
select id,name from student where name="";
select id,name from student where name is not null;
select id,name from student where shell is null;
select id,name from student where name like ‘%‘;(31不显示出来)
+++++++++++++++++++++++++++++++++++++++++++++++
逻辑比较(多个查询条件)
逻辑与 and 多个查询条件必须同时成立
逻辑或 or 多个查询条件某个条件成立就可以
逻辑非 ! 取反
and和or同时出现 默认先判断and再判断or, 或者在or判断加小括号就先判断or 再判断and.
select id,uid,name,homedir,shell from student where name="root" or uid=1 or shell="/bin/bash";
select name,uid from student where name="root" or name="bin" and uid=0
select name,uid from student where name="root" or name="bin" and uid=1 ;
select name,uid from student where (name="root" or name="bin" ) and uid=1 ;
+++++++++++++++++++++++++++++++++++++++++++++++++
6 四则运算 + - * / %
alter table student add age tinyint(2) default 21 after name;
alter table student add linuxsys int(2) default 60 after age, add linuxser int(2) default 60 after linuxsys;
select name,2016-age as s_year , age from student;
select name,year(now())-age as s_year , age from student;
select name,age,linuxsys,linuxser,(linuxsys+linuxser)/2 as pjf from student where name="root";
select name,age,linuxsys,linuxser,(linuxsys+linuxser) as zcj from student where name="root";
++++++++++++++++++++++++++++++++++++++++++++++++
7 模糊查询 like
where 字段名 like ‘表达式‘
_ 任意一个字符
% 零个或多个字符
select name from student where name like ‘___‘;
insert into student(name)values("a");
select name from student where name like ‘a%‘; 这是a开头的所有
select name from student where name like ‘_a_‘;
select name from student where name like ‘%a%‘; 只要还有a的都要
select id,name from student where name like ‘%‘; 所有的都出现
mysql> select name,uid from student where name like ‘_%_‘;两个或多个
mysql> select name,uid from student where name regexp ‘....‘; 出现名字是四个的或四个以上
mysql> select name,uid from student where name like ‘____‘; 出现名字是四个的
+++++++++++++++++++++++++++++++++++++++++++++++
8 在查询结果里过虑数据 having 条件
select id,name from student where name like ‘%‘ having id in (33,31);
select name from student where uid <500 having name="jim";
select name from stuent where uid<500 and name="jim";
select name from t1 where class="nsd1610" having name="lilei";
+++++++++++++++++++++++++++++++++++++
9 使用正则表达式做查询条件
^ $ . * [ ]
字段名 regexp ‘正则表达式‘
insert into student(name)values("plj9"),("pl8j"),("p7lj"),("6plj"),("1plj");
mysql> select name,uid from student where name regexp ‘^[0-9]‘;
select name,uid from student where name regexp ‘^a.*t$‘;
select name,uid from student where name regexp ‘^a.*t$‘ and shell="/sbin/nologin";
select name,uid from student where uid regexp ‘^..$‘;两位的
select name,uid from student where uid regexp ‘..‘;两位以上的都出现
mysql> select name,uid from student where uid regexp ‘...‘;三位的以上的都出现
mysql> select name,uid from student where uid regexp ‘^...$‘;三位的出现
mysql> select name,uid from student where name regexp ‘...‘;名字包含三个或三个以上的都出现
查询结果为四位数的:三种方式
select name,uid from student where uid regexp ‘^....$‘; ###
select name,uid from student where uid between 1000 and 9999;###
mysql> select name,uid from student where uid>1000;###
++++++++++++++++++++++++++++++++++++++++++++++++++++++
10 聚集函数:做数据统计的mysql服务自带的内置命令
max(字段名) 获取最大值
min(字段名) 获取最小值
avg(字段名) 获取平均值
sum(字段名) 求和
count(字段名) 获取字段值个数
select avg(linuxsys) from student;
select sum(linuxsys) from student;
select max(gid),min(uid) from student;
select count(name),count(id) from student; (id=57 name=55 是因为name有null)
select count(name) from student where shell is null;
select count(*) from student; 所有列个数
select count(id) from student; 所有列个数
mysql> select count(uid) from student where uid>=5 and uid<=10 ; (uid 大于5小于10的个数)
+++++++++++++++++++++++++++++++++++++
11 查询分组 group by 字段名
sql查询命令 group by 字段名;
select shell from student where uid<500 group by shell;
select 部门 from 员工信息表 where 性别="女" and 年龄<=25 and 工资>=10000 group by 部门;
12 查询排序 order by
sql查询命令 order by 字段名 排序方式
asc 升序(默认)
desc 降序
select uid from student where uid <500 order by uid;
select uid from student where uid <500 and shell!="/bin/bash" order by uid desc
++++++++++++++++++++++++++++++++++++++
13 limit 限制显示查询结果记录的行数。
SQL查询命令 limit 数字;
SQL查询命令 limit 起始行,共显示几行
第1行的编号是0(零)
select * from student limit 1;
select * from student limit 3;
select * from student limit 2,5;
select name,uid from student order by uid;
select name,uid from student order by uid desc limit 5;
select name,uid from student order by uid desc limit 5,10;
select * from student where uid is not null order by uid;
mysql> select * from student where uid is not null order by uid limit 2; ####
+++++++++++++++++++
mysql> select name from student where name order by name; ###
按名字排序:
++++++++++++++++++++
mysql> select name from student where name is not null having name="root"; (having.....过滤 查找,前面结果找)
+------+
| name |
+------+
| root |
| root |
mysql> select name from student where name is not null and name="root"; (查找 全表找)
+------+
| name |
+------+
| root |
| root |
++++++++++++++++++++++++++++++++++++++++++++
14 DISTINCT 不显示重复的值
select distinct shell from student; 每种出现一个
select shell from student group by shell;
select distinct shell from student where uid<500; (uid小于500的,每种出现一个)
++++++++++++++++++++++++++++++++
15 where 子查询
把内层查询结果做为外层的查询条件。
select 字段名列表 from 表名 条件 (select 字段名列表 from 表名);
insert into student(name,linuxsys)values("lili",38),("jerry",58),("lucy",59);
select avg(linuxsys) from student;
select name,linuxsys from student where linuxsys < (select avg(linuxsys) from student);
select id,name from student where name in (select userser from mysql.user where host="localhost");
mysql> select name from student
-> where
-> name in (select user from mysql.user where host="::1");
+------+
| name |
+------+
| root |
select lisi from 用户表 where lisi in(select 姓名 from db1.家庭地址表 where 城市="上海 ");
查找单课成绩小于这颗的平均分用户
select name,linuxsys from student where linuxsys < (select avg(linuxsys) from student);
+++++++++++++++++++++++++++++++++++++++++++
16 复制表(备份表 快速创建新表)
create table 新表名 sql查询命令;
复制全表(复制完后,新表不会继承索引)
create table 新表名 select * from 表名;
create table stu4 select * from student;
复制部分数据
create table 新表名 select 字段名列表
from 表名 where 条件;
create table stu3 select name,homedir,shell from student where uid<=10 ;
mysql> create table student5 select name,uid from student where uid>=20 ;
只复制表结构 (让后面的查找不成立为空,在复制就是空表)
create table 新表名 select * from 表名 where 1 = 2;
create table stu2 select * from student where 1 = 2;
mysql> create table student3 select * from student where 1 = 3;
+++++++++++++++++++++++
17 更新表记录update (修改记录字段的值)
批量修改
update 表名 set 字段名=值,字段名="值";
update student set age=18;
mysql> update student set linuxsys=100;
mysql> update student set linuxsys=05 where name="root";
修改符合条件的记录字段的值
update 表名 set 字段名=值,字段名="值" where 条件;
update student set name="zhangsan" where id=31;
update student set shell=null where id=31;
update student set shell="" where name="bin";
mysql> update student set linuxsys=null ;
mysql> update student set linuxsys=0 where name="root";
18 删除表记录 delete
删除表的所有记录。
delete from 表名;
只删除符合条件的记录
delete from 表名 where 条件;
delete from student where name is null;
delete from student where name="bob";
mysql> select * from student where name is null;
+----+------+------+----------+----------+----------+------+------+---------+---------+-------+
| id | name | age | linuxsys | linuxser | password | uid | gid | comment | homedir | shell |
+----+------+------+----------+----------+----------+------+------+---------+---------+-------+
| 53 | NULL | 21 | 100 | 70 | NULL | 1234 | NULL | NULL | NULL | NULL |
| 54 | NULL | 21 | 100 | 70 | NULL | 4565 | NULL | NULL | NULL | NULL |
+----+------+------+----------+----------+----------+------+------+---------+---------+-------+
2 rows in set (0.00 sec)
mysql> delete from student where name is null;
mysql> select * from student where name is null;
Empty set (0.00 sec)
19 多表查询:
select 字段名列表 from 表名列表;(笛卡尔集)
select 字段名列表 from 表名列表 where 条件;
*只显示与条件匹配记录字段的值。
create table t41 select name,uid from student limit 2;
create table t42 select name,uid,shell from student limit 4;
select * from t41,t42 where t41.uid = t42.uid;
select t41.name,t42.* from t41,t42 where t41.uid = t42.uid;
select t41.name,t42.name from t41,t42 where t41.uid = t42.uid;
+++++++++++++++++++++++++++++++++++++++++++++++++++
连接查询:
左连接查询(查询时以左边的表为主显示查询记录)
select 字段名列表 from 表1 left join 表2 on 条件;
右连接查询(查询时以右边的表为主显示查询记录,左表没有的记录用null与右表匹配)
select 字段名列表 from 表1 right join 表2 on 条件;
create table t43 select name,uid,shell from student limit 3;
create table t44 select name,uid,shell from student limit 5;
select * from t43 left join t44 on t43.uid = t44.uid;
select count( *) from t43 left join t44 on t43.uid = t44.uid;
select t43.name from t43 left join t44 on t43.uid = t44.uid;
select t43.* from t43 left join t44 on t43.uid = t44.uid;
select * from t43 right join t44 on t43.uid = t44.uid;
+++++++++++++++++++++++++
day03课程内容回顾:
数据导入
1 什么是数据导入
2 导入命令的语法格式
3 导入数据注意事项
数据导出
1 什么是数据导出
2 导出命令的语法格式
3 导出数据注意事项
管理表记录:
插入记录 insert into
查询记录 select
查询条件: 数值比较 字符比较
范围内查找
匹配空 匹配非空
逻辑比较
四则运算
模糊查询 like _ %
正则匹配 regexp ^ $ . * [ ]
聚集函数 max() min() avg()
sum() count()
查询排序
order by 字段名 desc/asc
查询分组
group by 字段名;
限制显示记录数
limit 数字
limit 数字1,数字2
在查询结果里过滤数据
having 条件
where嵌套查询
sql查询 where 字段 符号 (sql查询);
更新记录字段值
update 表名 set 字段名=值,字段名="值";
update 表名 set 字段名=值,字段名="值" where 条件;
update student set name="" where name="jim";
update student set shell=null where name="root";
update student set shell=null where id<=10;
update student set homedir="" where id<=10;
删除表记录
delete from 表名;
delete from 表名 where 条件;
复制表(快速创建新表 备份表)
*不会把原表的字段的索引属性复制给新表。
create table 新表名 sql查询 ;
+++++++++++++++++++++++++++++++++++++++++++++++++++++
day04
恢复数据库管理员从数据库服务器本机登录的密码。
#service mysql stop
#service mysql start --skip-grant-tables
#mysql
mysql> update mysql.user
-> set
-> password=password("654321")
-> where
-> host="localhost" and user="root";
mysql> flush privileges;
mysql> quit;
#service mysql stop
#service mysql start
#mysql -uroot -p654321
mysql>
修改数据库管理从本机登录的密码
[root@stu db100]#
mysqladmin -hlocalhost -uroot -p password "新密码"
Enter password: 旧密码
+++++++++++++++++++++++++++++++
用户授权及撤销
用户授权的作用:在数据库服务器上新添加一个连接数据库服务器的用户,并设置这个用连接到数据库服务器后的访问权限。
给谁授权? 使用者(网站服务器) -hip(ip是网站服务器主机ip) -u.. -p..
管理者(DAB)
* 默认只有数据库管理员root用户从服务器本机登录才有授权权限。
mysql> select user(); 查看当前登录用户
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
mysql> show grants; 查看当前用户权限
____+_++++++++++++++++++++++++++++++++++++++++++++++++++
[root@19 ~]# mysql -uroot -p123456
mysql> grant all on *.* to jb@"localhost" identified by "123";
mysql> quit;
[root@19 ~]# mysql -ujb -p123
mysql> select user();
+--------------+
| user() |
+--------------+
| jb@localhost |
mysql> show grants;
+--------------------------------------------------------------------------------------------------------------------+
| Grants for jb@localhost |
+--------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘jb‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257‘ |
+--------------------------------------------------
++++++++++++++++++++++++++++++++++++++++++
授权的语法
mysql -hlocalhost -uroot -p999
mysql> grant 权限列表 on 数据库名 to 用户名@"客户端地址" identified by "密码" with grant option;
(客户端地址,ip 密码:登录时密码 它也有授权命令)
mysql> grant 权限列表 on 数据库名 to 用户名;
权限列表:
all 所有权限
select,update(name,age) 指定权限
usage 无权限
授权:
grant all on *.* to plj@"localhost" identified by "123456";
数据库名:
*.* 所有库和所有表
库名.* 一个库的权限
库名.表名 一张表的权限
用户名: 客户端连接数据库服务器时,使用的登陆名,授权时自定义即可,要有标识性。
客户端地址: 可选项
% 所有地址
172.40.50.117 一个IP地址
192.168.1.% 一个网段
pc100.tedu.cn 主机名
%.tedu.cn 域名
identified by "密码" 设置授权用户连接时使用的密码 可选项
with grant option 设置授权用户连接后,有授权权限 可选项
select user(); 显示登陆的用户名和客户端地址;
show grants; 登陆数据库服务器的用户查看自己的访问权限
例子
允许数据库管理员账号可以从117主机连接自己,连接后对所有库、表拥有完全权限,且有授权权限,连接的密码是plj123
grant all on *.* to root@"172.40.50.117" identified by "plj123" with grant option;
117:
mysql -h172.40.50.171 -uroot -pplj123
mysql>grant all on bbsdb.* to student@"%" identified by "123";
mysql>grant select,insert on userdb.student to studen2;
mysql>grant select,update(name,uid) on userdb.student to student3;
让jim用户可以在数据库本机登录数据库服务对库表有完全权限 登陆密码是123456
grant all on *.* to jim@"localhost" identified by "123456";
+++++++++++++++++
默认的4个数据库:
information_schema 虚拟库 +++存储在内存 不占用硬盘存储空间(在/var/lib/mysql下没有文件夹)+++
performance_schema 服务运行时的参数信息
mysql 授权库
test 公共库 只要用户能够连接到服务上对此库就有完全权限
++++++++++++++++++
授权信息存储在mysql库里
user 授权用户的访问权限
db 授权用户对库的访问权限
tables_priv 授权用户对表的访问权限
columns_priv 授权用户对字段的访问权限
查看已有的授权用户和连接的客户端地址:
select user,host from mysql.user;
mysql> select user from mysql.user;
+---------+
| user |
+---------+
| student |
| root |
| root |
| root |
| weadmin |
| weadmin |
| root |
| jb |
| plj |
| root |
+---------+
mysql> select user,host from mysql.user;
+---------+---------------+
| user | host |
+---------+---------------+
| student | % |
| root | 127.0.0.1 |
| root | 19.tedu.cn |
| root | 192.168.4.254 |
| weadmin | 192.168.4.254 |
| weadmin | 192.168.4.5 |
| root | ::1 |
| jb | localhost |
| plj | localhost |
| root | localhost |
+---------+---------------+
查看已有授权用户的访问权限:
show grants for 用户@"客户端地址";
mysql> show grants for student@"%";
没有明确授权时,用户不能管理test库,
mysql> delete from mysql.db where user="";
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
撤销用户的权限:
revoke 权限列表 on 库名 from 用户@"客户端地址";
revoke grant option on *.* from ‘root‘@‘172.40.50.117‘;
revoke drop,delete on *.* from ‘root‘@‘172.40.50.117‘;
revoke all on *.* from ‘root‘@‘172.40.50.117‘;
delete from mysql.user where host="172.40.50.117" and user="root";flush privileges;
drop user 用户;
授权用户登录数据库服务器,然后修改自己的登陆密码
SET PASSWORD=PASSWORD(‘新密码‘);
数据库管理员修改授权用户的登录密码
SET PASSWORD FOR 用户名@‘客户端地址‘=PASSWORD(‘新密码‘);
grant练习题.txt
++++++++++++++++++++++++++++++++++++++++++++++++++++++
MySQL图形管理工具-phpMyAdmin
#yum -y install httpd php php-mysql
#service httpd start
#chkconfig httpd on
[root@stu ~]# cat /var/www/html/linkdb.php
<?php
$linkdb=mysql_connect("localhost","root","123456");
if ($linkdb){
echo "linkdb ok";
}else{
echo "linkdb no";
}
?>
[root@stu ~]# elinks --dump http://localhost/linkdb.php
linkdb ok
[root@stu ~]#
#tar -zxvf phpMyAdmin-2.11.11-all-languages.tar.gz
#mv phpMyAdmin-2.11.11-all-languages /var/www/html/phpmyadmin
#cd /var/www/html/
#chown -R apache:apache phpmyadmin/
修改配置
cd /var/www/html/phpmyadmin/
cp config.sample.inc.php config.inc.php
vim config.inc.php
17 $cfg[‘blowfish_secret‘] = ‘plj123‘;
31 $cfg[‘Servers‘][$i][‘host‘] = ‘localhost‘;
:wq
#mysql -uroot -p999
#mysql> create database bbsdb;
mysql> grant all on bbsdb.* to webadmin@"localhost" identified by "123";
客户端访问:
http://172.40.50.171/phpmyadmin
webadmin
123
++++++++++++++++++++++++++++++++++++++++++++
day04课程内容回顾:
多表查询:
select 字段名列表 from 表名列表 where 条件;
select 字段名列表 from 表名 left join 表名 on 条件
select 字段名列表 from 表名 right join 表名 on 条件
恢复数据库管理员本机登录密码。
修改数据库管理员本机登录密码。
用户授权:
为什么要做授权?
给谁授权?
默认谁授权权限?
授权命令的语法格式?
grant 权限列表 on 数据库名 to 用户名;
grant 权限列表 on 数据库名 to 用户名@"客户端地址" identified by "密码" with grant option ;
权限撤销:
* 对目标库有过授权才可以撤销
* 撤销的只是权限
revoke 权限列表 on 数据库名 from 用户名@"客户端地址";
show grants ;
select user,host from mysql.user;
show grants for 用户名@"客户端地址";
授权信息存储在mysql数据库里,使用不同的表存储不同授权信息。
user db tables_priv columon_priv
安装phpmyadmin图形管理工具
yum -y install httpd php php-mysql
++++++++++++++++++++++++++++++++++++++++++++++++++++
day05
数据备份与恢复
实时增量备份
XtraBackup 备份
mysql主从同步
+++++++++++++++++
数据备份与恢复
为什么要对数据做备份?数据库丢失时能够使用备份文件恢复数据。
备份方式:++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
物理备份:直接拷贝库或表对应的文件。 (1.先备份拷贝。之后如果被删了,把所有拷贝的再覆盖回去,数据就回来了,物理备份,若没有拷贝被删了,那就初始化数据恢复)
cp -r /var/lib/mysql/mysql /bakdir/++++++++++++++++++++++++++++++++++++++++++++++++++
cp /var/lib/mysql/mysql/user.* /bakdir/
tar -zcvf /bakdir/mysql.tar.gz /var/lib/mysql/mysql/*
mysqlhostcopy 物理备份命令
只适用于MyISAM引擎的表
yum -y install perl-DBD-MySQL
mysqlhotcopy -h localhost -u 用户名 -p 密码 库名
mysqlhotcopy -h localhost -u 用户名 -p 密码 库名 目录名
mkdir /mydata
mysqlhotcopy -u root -p 999 userdb /mydata
使用物理备份文件恢复数据
cp -r 备份文件或文件夹 对应的数据库目录下
chown -R mysql:mysql /var/lib/mysql/目录名或文件
逻辑备份:备份时,根据已有的数据生成对应的sql命令,把sql命令保存到备份文件里。
备份策略:
完全备份 备份所有数据
一台数据库服务器上的所有数据
一个库的所有数据
一张表的所有数据
差异备份 备份自完全备份后所有新产生的数据
增量备份 备份自上一次备份后所有新产生的数据
增量备份
差异备份
完全备份
生产环境中使用的备份策略?
完全备份+差异备份
完全备份+增量备份
生产环境中备份数据要考虑的因素?
备份频率
备份时间
存储空间
备份文件的命名
备份方式
备份策略
备份周期
完全备份+差异备份
备份时间 库 文件名 储存
1 完全 18:00 1 1.sql 1
2 差异 3 2.sql 3
3 5 3.sql 8
4 2 4.sql 10
5 7 5.sql 17
6 4 6.sql 21
7 差异 6 7.sql 27
完全备份+增量备份
备份时间 库 文件名 储存
1 完全 18:00 1 1.sql 1
2 增量 3 2.sql 3
3 5 3.sql 5
4 2 4.sql 2
5 7 5.sql 7
6 4 6.sql 4
7 增量 6 7.sql 6
生产环中备份数据的手段?
计划任务 + 备份脚本
00 23 * * 1 /root/allbakdb.sh
30 23 * * 2-7 /root/newbakdb.sh
+++++++++++++++++++++++++++++++++++++++++++++++++
完全备份数据命令:
mysqldump -uroot -p999 数据库名 > 目录/名.sql
数据库名的表示方式?
--all-databases 一台数据库服务器上的所有数据
数据库名 一个库的所有数据 userdb
库名 表名 一张表的所有数据 userdb student
-B 数据库名1 数据库名2 数据库名N 一起备份多个库的数据
#mysqldump -uroot -p999 --all-databases > alldb.sql
#mysqldump -uroot -p999 userdb student > student.sql
#mysqldump -uroot -p999 -B userdb gamedb > twodb.sql
#mkdir /mydata
#mysqldump -uroot -p999 userdb > /mydata/userdb.sql
create database db_name;
use db_name;
完全恢复数据命令
#mysql -uroot -p999 < 名.sql
#mysql -uroot -p999 库名 < 目录/名.sql
#mysql -uroot -p999 userdb < userdb.sql
++++++++++++++++++++++++++++++++++++++++++++
crontab -e
00 23 * * 1 /root/allbakdb.sh &> /dev/null
:wq
vim /root/allbakdb.sh
#!/bin/bash
day=`date +%F`
if [ ! -e /bakdbdir ];then
mkdir /bakdbdir
fi
mysqldump -uroot -p999 userdb > /bakdbdir/${day}-userdb.sql
:wq
chmod +x /root/allbakdb.sh
/root/allbakdb.sh
++++++++++++++++++++++++++++++++++++++++++++++++++
实时增量备份
(启用mysql服务的binlog日志实现对数据的增量备份)
(二进制日志)
binlog日志? 是mysql服务日志中的一种。记录客户端连接数据库服务器后,执行的除查询之外的sql命令。
查询的命令 : select desc show
不是查询的sql命令如下:
create
use
insert into
delete
drop
grant
load data
启用binlog日志? (日志编号范围1-999999)
vim /etc/my.cnf
[mysqld]
#log-bin
log-bin=/mylog/plj
:wq
mkdir /mylog
chown mysql:mysql /mylog
service mysql restart
stu-bin.000001 binlog日>500M
stu-bin.000002
stu-bin.index 日志索引文件
查看binlog日志文件内容?
mysqlbinlog stu-bin.000001
+++++++++++++++++++++++++++++++++++
手动生成新的binlog日志文件?
mysql> flush logs;
#mysql -uroot -p999 -e "flush logs"
#mysqldump -uroot -p999 --flush-logs 库名 > xxx.sql
#service mysql restart
删除指定binlog日志编号之前的日志文件?
mysql> PURGE MASTER LOGS TO "binlog文件";
mysql> purge master logs to "plj.000003";
删除当前所有的binlog日志文件,重新创建第1个binlog日志文件
mysql>reset master;
#rm -rf binlog日志文件名
+++++++++++++++++++++++++++++
binlog日志文件记录sql命令的方法?
字符偏移量
记录sql命令执行时间
使用binlog日志恢复数据?
mysqlbinlog 选项 binlog日志名 | mysql -uroot -p999 [数据库名]
选项
--start-position=pos值
--stop-position=pos值
--start-datetime="yyyy-mm-dd hh:mm:ss"
--stop-datetime="yyyy-mm-dd hh:mm:ss"
mysqlbinlog --start-position=964 --stop-position=1144 plj.000002 | mysql -uroot -p999
课后作业 binlog日志练习题
完全备份+增量备份
00 23 * * 1 /root/allbakdb.sh #周一做完全备份
30 23 * * 2-7 /root/newbakbinlog.sh #周2-7做增量备份
/root/newbakbinlog.sh脚本的功能:
拷贝每天新生成的binlog日志文件到系统的/mylogdir目录下,如果拷贝的binlog日志文件是正在使用的不拷贝。
搭建2台数据库服务器,启动数据库服务并设置管理员root用户从本机登录密码是123456,2台数据库服务器能够ping通。
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
安装第三方软件XtraBackup对数据做增量备份
XtraBackup介绍:
在线热备份工具,备份过程中不锁库表,
只备份表记录,不备份表结构
表的存储引擎必须是InnoDB/XtraDB
必须先有一次完全备份,这样再执行备份时才知道那些数据是新产生。
安装XtraBackup: perl(DBD::mysql) perl(Time::HiRes) 安装两个依赖包
rpm -q perl-Time-HiRes
rpm -ivh percona-xtrabackup-2.1.6-702.rhel6.x86_64.rpm
提供2个备份命令:
xtrabackup:C程序,支持InnoDB/XtraDB
innobackupex:以Perl脚本封装xtrabackup,还支持MyISAM
xtrabackup_56 命令语法格式:
(完全备份 完全恢复 增量备份 增量恢复)
xtrabackup_56 <选项>
--backup 备份数据
--prepare 恢复数据
--target-dir=目录名 指定备份文件存储的目录
--datadir=/var/lib/mysql 指定数据库目录的位置
--incremental-basedir=目录名 增量备份时,指定上一次备份文件存储的目录
--incremental-dir=目录名 增量恢复数据时,指定使用恢复文件所在的目录
db1.a 5 -> 999 完全备份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/allbak
10 -> 301 第1次增量备份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/new1 --incremental-basedir=/allbak
8 -> 801 第2次增量备份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/new2 --incremental-basedir=/new1
3 -> 777 第3次增量备份
xtrabackup_56 --backup --datadir=/var/lib/mysql --target-dir=/new3 --incremental-basedir=/new2
xtrabackup 备份数据时,时如何解决如下问题的:
执行备份时,如何知道,是否有新记录插入?
在备份数据时如何知道在所有记录里,那些记录是新产生的?
备份数据分为2部分
1 日志信息
2 数据
/var/lib/mysql/
事务日志文件 ib_logfile1
ib_logfile2
日志信息文件 ibdata1
LSN 日志序列号
工作过程:
备份目录 /allbak /new1 /new2 /new3
xtrabackup_checkpoints #当前的备份类型和LSN的范围
xtrabackup_logfile #SQL命令
ibdata1.* #数据信息
库名/表名.ibd.* #真实数据
delete from bbsdb.a;
++++++++++++++++++++++++++++++++++++++++++++++++++
xtrabackup恢复数据的步骤:
1 准备恢复数据
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak --incremental-dir=/new1
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak --incremental-dir=/new2
xtrabackup_56 --prepare --datadir=/var/lib/mysql --target-dir=/allbak --incremental-dir=/new3
2 把备份文件拷贝回对应的数据库目录下
[root@stu ~]# cp /allbak/bbsdb/a.ibd /var/lib/mysql/bbsdb/
cp:是否覆盖"/var/lib/mysql/bbsdb/a.ibd"? y
[root@stu ~]#
3 重启数据库服务
service mysql restart
4 查看恢复是否成功
select * from bbsdb.a;
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
把数据库服务器107配置为 171的从数据库服务器。
1 在107主机上运行mysql数据库服务器。
rpm -Uvh Mysql-*.rpm
service mysql start ; chkconfig mysql on
cat /root/.mysql_secret
mysql -uroot -pXXXXX
mysql> set password for root@"localhost"=password("999");
mysql>quit
mysql -uroot -p999
mysql> show databases;
mysql>quit
ping 172.40.50.171
setenforce 0
service iptables stop
171 的配置
mysqldump -uroot -p123 bbsdb > /root/bbsdb.sql
scp /root/bbsdb.sql root@172.40.50.107:/root/
107:
mysql -uroot -p999
mysql> create database bbsdb;
mysql> quit;
#mysql -uroot -p999 bbsdb < /root/bbsdb.sql
把171配置为主(master)数据库服务器
#vim /etc/my.cnf
[mysqld]
log-bin=master171
server_id=171
:wq
#service mysql restart
#mysql -uroot -p123
mysql> grant replication slave on *.* to slaveuser@"172.40.50.107" identified by "123456";
mysql>show master status\G;
*************************** 1. row ***************************
File: master171.000001
Position: 335
Binlog_Do_DB:
Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.00 sec)
ERROR:
No query specified
mysql>
配置从数据库服务器 107
mysql -h172.40.50.171 -uslaveuser -p123456
mysql> quit;
vim /etc/my.cnf
[mysqld]
server_id=107
log-bin=jing #可选项
:wq
service mysql restart
mysql -uroot -p999
mysql> show slave status;
Empty set (0.00 sec)
mysql> change master to
master_host="172.40.50.171",
master_user="slaveuser",
master_password="123456",
master_log_file="master171.000001",
master_log_pos=335;
mysql> start slave;
mysql> show slave status\G;
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
171验证配置
mysql -uroot -p123
mysql>grant all on *.* to jingyaya@"%" identified by "123";
主从同步的工作过程
Slave_IO_Running: Yes
IO线程:负责把主数据库服务器binlog日志里的sql命令拷贝到本机的中继日志文件里。
IO线程 No状态的原因?
从数据库服务器连接不上主数据库服务器:
ping
iptables
selinux
连接的授权用户
binlog日志文件指定错误
binlog日志pos点位置错误
查看报错信息
Last_IO_Error: 报错信息
修改错误:
stop slave;
change master to 选项="值",选项="值",;
start slave;
Slave_SQL_Running: Yes
SQL线程:执行本机中继日志文件里的sql命令,把数据写进本机的库里。
IO线程 No状态的原因?
执行本机中继日志文件里的sql命令时,本机没有命令使用到的库 表 或字段。
查看报错信息
Last_SQL_Error: 报错信息
ls /var/lib/mysql/
master.info 记录连接主数据库服务器配置信息
relay-log.info 记录中继日志信息文件
mail-relay-bin.00000x 中继日志文件
mail-relay-bin.index 中继日志的索引文件
主从同步结构模式:
一主一从 *
一主多从 *
主从从
主主结构
+++++++++++++++++++++++++
day05课程内容回顾:
数据的备份与数据恢复
备份方式 ?
物理备份: cp tar mysqlhotcopy
逻辑备份: 备份时把库表记录对应sql命令保
存 到备份文件
备份策略?
完全备份 mysqldump
增量备份 binlog
差异备份
binlog使用:
binlog日志 ? 启用 ? 查看内容 ?
记录sql命令的方法?
手动生成新的binlog日志文件?
删除已有的binlog日志文件?
执行binlog日志文件sql命令恢复数据?
XtraBackup 备份
mysql主从同步
++++++++++++++++++++++++++++++++++++++++++++++++++
day06
mysql主从同步常用配置参数
vim /etc/my.cnf
[mysqld]
.....
:wq
service mysql restart
主数据库服务器的使用参数
binlog-do-db=数据库名,数据库名 #只允许同步的库
binlog-ignore-db=数据库名,数据库名 #只不允许同步的库
从数据库服务器的使用参数:
log-slave-updates 级联复制
replicate-do-db=数据库名,数据库名 #只同步的库
replicate-ignore-db=数据库名,数据库名 #只不同步的库
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
使用mysql代理服务实现数据读写分离
客户端
|
代理117
|
|
-------------------------------------
| |
写117 读107
在117主机上运行mysql代理服务。
服务运行时,把接收到的读请求给后端的数据库服务器107 把接收到的写请求给后端的数据库服务器171
117:
#tar -zxvf mysql-proxy-tar.gz
#mv mysql-proxy-0.8.3-linux-rhel5-x86-64bit/ /usr/local/mysqlproxy
# rpm -q lua || yum -y install lua
#chmod +x /usr/local/mysqlproxy/share/doc/mysql-proxy/rw-splitting.lua
启动mysql代理服务
#rpm -qa | grep -i mysql-server
#netstat -utnalp | grep :3306
#service mysql stop ; chkconfig mysql off
#/usr/local/mysqlproxy/bin/mysql-proxy
-P 172.40.50.117:3306
-r 172.40.50.107:3306
-b 172.40.50.171:3306
-s /usr/local/mysqlproxy/share/doc/mysql-proxy/rw-splitting.lua &
[root@room9pc00 ~]# netstat -utnalp | grep :3306
tcp 0 0 172.40.50.117:3306 0.0.0.0:* LISTEN 32524/mysql-proxy
[root@room9pc00 ~]#
停止服务
pkill -9 mysql-proxy
kill -9 %后台运行编号
107 + 171
mysql -uroot -p密码
mysql> grant all on *.* to jim@"%" identified by "123";
客户端访问
mysql -h172.40.50.117 -ujim -p123
mysql> select * from gamedb.a; -> 107
mysql> insert gamedb.a values(88);-> 171
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
day07
部署mysql高可用集群。
mysql MMM + mysql主从同步
环境配置:
4台数据库服务器 171 107 99 23
service mysql start
mysql -uroot -p密码
把多余库都删除只留默认的4个数据库
下载软件包 mysql-mmm.zip
配置yum源
yum -y install perl-*
二 、mysql主从同步:
2.1 171 和 107 配置为主主结构
171配置为107的主
171:
grant replication slave on *.* to slaveuser@"%" identified by "123456";
[root@stu mysql]# cat /etc/my.cnf
[mysqld]
log-bin=master171
server_id=171
[root@stu mysql]# service mysql restart
107:
grant replication slave on *.* to slaveuser@"%" identified by "123456";
vim /etc/my.cnf
[mysqld]
server_id=107
log-bin=master107
log-slave-updates
:wq
[root@stu mysql]# service mysql restart
mysql -uroot -p999
mysql> change master to master_host="172.40.50.171",master_user="slaveuser",master_password="123456",master_log_file="master171.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
171: 把自己设置为107的从库
mysql -uroot -p999
mysql> change master to master_host="172.40.50.107",master_user="slaveuser",master_password="123456",master_log_file="master107.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
2.2 99 和 23 同时配置为 107 的从库
99:
vim /etc/my.cnf
[mysqld]
server_id=99
:wq
/etc/init.d/mysql restart
mysql -uroot -p123
mysql> change master to master_host="172.40.50.107",master_user="slaveuser",master_password="123456",master_log_file="master107.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
23:
vim /etc/my.cnf
[mysqld]
server_id=23
:wq
/etc/init.d/mysql restart
mysql -uroot -p123
mysql> change master to master_host="172.40.50.107",master_user="slaveuser",master_password="123456",master_log_file="master107.000001",master_log_pos=120;
mysql> start slave;
mysql> show slave status\G;
三、测试主从同步的配置
171 :
mysql -uroot -p999
mysql> grant all on bbsdb.* to lili@"%" identified by "123";
107 / 99 / 23 :
select user,host from mysql.user where user="lili";
什么是集群? 使用一组服务器提供相同服务
高可用集群? 主备
负载均衡集群?多台服务器平均分摊客户端的访问请求。
四 安装MySQL MMM
软件介绍:MySQL主主复制管理器
监控、故障转移 一套脚本套件(perl)
提供2种服务:
mmm-monitor: 负责所有的监控工作, 决定故障节点的移除或恢复 。
mmm-agent 运行在MySQL服务器上,提供简单远程服务集、提供给监控节点。
在所以主机上安装mysql mmm 软件 (4台数据库服务器 + 监控服务器)
#tar -zxvf mysql-mmm-2.2.1.tar.gz
#cd mysql-mmm-2.2.1
#make install
#cd /etc/mysql-mmm
#ls *.conf
mmm_agent.conf mmm-agent服务的主配置文件(数据库主机)
mmm_mon.conf mmm-monitor服务的主配置文件(监控主机)
mmm_common.conf 公信息配置文件,在所有主机上都要配置
mmm_tools.conf
在四台数据库服务器上做如下授权
mysql>grant replication client,process,super on *.* to agent@"%" identified by "123456";
mysql>grant replication client on *.* to monitor@"%" identified by "123456";
七 在所以主机上 安装服务运行时依赖的软件包。
装三个依赖包(Algorithm-Diff perl-Log-Log4perl Proc-Daemon)
[root@66 ~]# cd mysql-mmm
[root@66 mysql-mmm]# tar -zxvf Algorithm-Diff-1.1902.tar.gz
[root@66 mysql-mmm]# cd Algorithm-Diff-1.1902
[root@66 Algorithm-Diff-1.1902]# perl Makefile.PL
[root@66 Algorithm-Diff-1.1902]# make
[root@66 Algorithm-Diff-1.1902]# make install
[root@66 Algorithm-Diff-1.1902]# cd
[root@66 ~]# cd mysql-mmm
[root@66 mysql-mmm]# rpm -ivh --nodeps perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm
[root@66 mysql-mmm]# tar -zxvf Proc-Daemon-0.03.tar.gz
[root@66 mysql-mmm]# cd Proc-Daemon-0.03
[root@66 Proc-Daemon-0.03]# perl Makefile.PL
[root@66 Proc-Daemon-0.03]# make
[root@66 Proc-Daemon-0.03]# make install
___________________________________________________________________________________________________
tar -zxvf Algorithm-Diff-1.1902.tar.gz (和上面一样操作步骤)
cd Algorithm-Diff-1.1902
perl Makefile.PL
make
make install
rpm -ivh --nodeps perl-Log-Log4perl-1.26-1.el6.rf.noarch.rpm
tar -zxvf Proc-Daemon-0.03.tar.gz
cd Proc-Daemon-0.03
perl Makefile.PL
make
make install
_____________________________________________________________
八 在4台数据库服务器上安装获取虚拟Ip地址程序。
#yum -y install gcc gcc-c++
#gunzip Net-ARP-1.0.8.tgz
#tar -xvf Net-ARP-1.0.8.tar
#cd Net-ARP-1.0.8
#perl Makefile.PL
#make
#make install
启动服务
1 启动数据库服务器上mmm-agent 服务
[root@stu mysql-mmm]# /etc/init.d/mysql-mmm-agent start
Daemon bin: ‘/usr/sbin/mmm_agentd‘
Daemon pid: ‘/var/run/mmm_agentd.pid‘
Starting MMM Agent daemon... Ok
[root@stu mysql-mmm]# netstat -utnalp | grep agent
tcp 0 0 172.40.50.171:9989 0.0.0.0:* LISTEN 24009/mmm_agentd
[root@stu mysql-mmm]# netstat -utnalp | grep :9989
tcp 0 0 172.40.50.171:9989 0.0.0.0:* LISTEN 24009/mmm_agentd
[root@stu mysql-mmm]#
日志文件 /var/log/mysql-
mmm/mmm_agentd.log
2 启动监控服务器上mmm-monitor 服务
[root@stu mysql-mmm]#
/etc/init.d/mysql-mmm-monitor start
Daemon bin: ‘/usr/sbin/mmm_mond‘
Daemon pid: ‘/var/run/mmm_mond.pid‘
Starting MMM Monitor daemon: Ok
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# netstat -utnalp | grep :9988
tcp 0 0 172.40.50.177:9988 0.0.0.0:* LISTEN 23544/mmm_mond
[root@stu mysql-mmm]#
测试配置
177 查看数据库服务器的状态:
[root@stu mysql-mmm]# mmm_control show
master107(172.40.50.107) master/AWAITING_RECOVERY. Roles:
master171(172.40.50.171) master/AWAITING_RECOVERY. Roles:
slave23(172.40.50.23) slave/AWAITING_RECOVERY. Roles:
slave99(172.40.50.99) slave/AWAITING_RECOVERY. Roles:
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control set_online master171
OK: State of ‘master171‘ changed to ONLINE. Now you can wait some time and check its new roles!
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control set_online master107
OK: State of ‘master107‘ changed to ONLINE. Now you can wait some time and check its new roles!
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control show
master107(172.40.50.107) master/ONLINE. Roles:
master171(172.40.50.171) master/ONLINE. Roles: writer(172.40.50.100)
slave23(172.40.50.23) slave/AWAITING_RECOVERY. Roles:
slave99(172.40.50.99) slave/AWAITING_RECOVERY. Roles:
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control
set_online slave99
OK: State of ‘slave99‘ changed to ONLINE.
Now you can wait some time and check its
new roles!
[root@stu mysql-mmm]# mmm_control
set_online slave23
OK: State of ‘slave23‘ changed to ONLINE.
Now you can wait some time and check its
new roles!
[root@stu mysql-mmm]#
[root@stu mysql-mmm]# mmm_control
show
master107(172.40.50.107)
master/ONLINE. Roles:
master171(172.40.50.171)
master/ONLINE. Roles: writer
(172.40.50.100)
slave23(172.40.50.23) slave/ONLINE.
Roles: reader(172.40.50.102)
slave99(172.40.50.99) slave/ONLINE.
Roles: reader(172.40.50.101)
[root@stu mysql-mmm]#
查看虚拟ip地址
[root@stu Net-ARP-1.0.8]# ip addr show | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
inet 172.40.50.171/24 brd 172.40.50.255 scope global eth0
inet 172.40.50.100/32 scope global eth0
[root@stu Net-ARP-1.0.8]#
客户端连接虚拟IP地址172.40.50.100 访问数据库服务器
mysql -h172.40.50.100 -ulili -p123
mysql>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
mysql性能优化:
(当一数据库服务器处理客户端的请求慢时可能由那些原因造成。)
网络带宽太窄 ? 测速软件
服务配置低(CPU 内存 硬盘)?
查看硬件设备的使用率
top uptime df -h free -m
提供数据库服务软件的版本太低 ?
查看mysql数据库服务运行时,运行参数。
数据库服务器处理查询请求过程?
mysql>show variables like ‘%commit%‘;
mysql>set [global] 变量名=值;
vim /etc/my.cnf
[mysqld]
变量名=值
:wq
1 并发连接数
mysql> set global max_connections=200;
mysql> show variables like
"max_connections";
mysql> show processlist;
mysql>show global status like "%
used%";
Max_used_connections/max_connections
=0.85 * 100% =85%
2连接超时时间
connect_timeout 建立连接 tcp三次握手的
超时时间
wait_timeout 建立连接后等待执行SQL命令的
超时时间
show variables like "%timeout%";
3 可用重复使用的线程数量
thread_cache_size=2
4 显示与查询相关的参数的设置
show variables like "query_cache%";
query_cache_type = 0 / 1 / 2
1
2 select 关键字 * from a;
query_cache_wlock_invalidate | OFF
myisam
pc1 : select name from a where name="jim";
name="jim"
pc2 select name from a where name="jim";
pc3 update a set name="lucy" where name="jim";
脏读
T G M k 字节 位
显示查询缓存的统计信息?
show global status like "qcache%";
Qcache_hits | 80 |
| Qcache_inserts | 1000 |
给执行不同查询请求的进程分配资源
mysqld 线程
select * from a; read_buffer_size
select * from a order by age desc; sort_buffer_size
select * from a where 工资>1w group by 部门 ; read_rnd_buffer_size
select name,age from a where name like "a%"; key_buffer-size
程序员编写的访问数据库的sql命令太复杂导致数据库服务器处理速度慢?
启用MySQL服务慢查询日志 ,记录超过指定时间显示查询结果的SQL命令。
mysql数据库服务日志类型4种:
错误日志 : 默认就开启,记录服务在启动和运行过程中产生的错误信息。
binlog日志:
查询日志: 记录客户端连接数据库服务器后,执行的所有的SQL命令。
general-log
general-log-file=名
慢查询日志:记录客户端连接数据库服务器后,超过指定时间(10秒)显示查询结果的sql命令。
slow-query-log
vim /etc/my.cnf
[mysqld]
slow-query-log
general-log
#slow-query-log-file=名
#long-query-time=5
#log-queries-not-using-indexes
:wq
/etc/init.d/mysql restart
select sleep(5);
select sleep(11);
select sleep(13);
mysqldumpslow 数据库目录/主机名-slow.log > /tmp/sql.txt
cat 数据库目录/主机名-slow.log
网络结构有问题 ?
网络中存在单点故障
数据传输有瓶颈
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
体系结构组成: 连接池 sql接口 分析器 优化器 存储引擎 文件系统 管理工具
连接池就是接收到用户请求后,查看自己是否有空闲资源(空闲线程处理用户的连接请求,有的话连接到sql接口) MYSQL>
SQL接口就是把用户输入的命令(select * from t1;),交给mysqld这个服务的。当sql命令有语法错误的时候,它会报错,这是分析器提供的,当没错时,他就执行。当查询的时候,他会优化这条命令(优化器)以最节省资源方式来处理你这个命令,它会到缓存里查找(查询缓存),有的话直接给数据,没有的话就到表里查(/var/lib/mysql/db1/t1.frm,文件系统),这个表会有使用的存储引擎(innodb,mysiam),执行查询的时候,会给这个表加读锁, 锁一行还是锁整表取决于存储引擎。这时它就工作了。它会把当前查找到的数据先放到查询缓存里,然后再给客户端。这个就是整个工作过程。
管理工具 。输mysql按两次tab它会把所有mysql开头的都显示出来,这些就是mysql服务自带的命令,就是mysql的管理工具,登入的是mysql,改密码是mysqladmin,按什么包可以改密码,下面的..这就是管理工具。
[root@proxe ~]# mysql
mysql mysql_embedded
mysqlaccess mysql_find_rows
mysqlaccess.conf mysql_fix_extensions
mysqladmin mysqlhotcopy
mysqlbinlog mysqlimport
mysqlbug mysql_install_db
mysqlcheck mysql_plugin
[root@proxe ~]# which mysqladmin
/usr/bin/mysqladmin
[root@proxe ~]# rpm -qf /usr/bin/mysqladmin
MySQL-client-5.6.15-1.el6.x86_64
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
破解密码:
[root@19 ~]# service mysql stop ++++++++++
Shutting down MySQL... SUCCESS!
[root@19 ~]# service mysql start --skip-grant-tables +++++++
Starting MySQL.. SUCCESS!
[root@19 ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.15 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.
mysql> update mysql.user +++++++++++++++
-> set password=password(‘123456‘)
-> where
-> host=‘localhost‘ and user=‘root‘;
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> flush privileges; +++++++++++++++++++
Query OK, 0 rows affected (0.02 sec)
mysql> quit; +++++++++++++++++=
[root@19 ~]# service mysql stop++++++++++++
Shutting down MySQL.. SUCCESS!
[root@19 ~]# service mysql start++++++++++++
Starting MySQL.. SUCCESS!
[root@19 ~]# mysql -uroot -p123456 +++++++++
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
修改mysql的密码
[root@19 ~]# mysqladmin -hlocalhost -uroot -p password "新密码"
Enter password: 旧密码
[root@19 ~]# mysql -uroot -p新密码
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
授权的语法
mysql -hlocalhost -uroot -p999
mysql> grant 权限列表 on 数据库名 to 用户名@"客户端地址" identified by "密码" with grant option;
(客户端地址,ip 密码:登录时密码 它也有授权命令)
mysql> grant 权限列表 on 数据库名 to 用户名;
权限列表:
all 所有权限
select,update(name,age) 指定权限
usage 无权限
授权:
grant all on *.* to plj@"localhost" identified by "123456";
数据库名:
*.* 所有库和所有表
库名.* 一个库的权限
库名.表名 一张表的权限
用户名: 客户端连接数据库服务器时,使用的登陆名,授权时自定义即可,要有标识性。
客户端地址: 可选项
% 所有地址
172.40.50.117 一个IP地址
192.168.1.% 一个网段
pc100.tedu.cn 主机名
%.tedu.cn 域名
identified by "密码" 设置授权用户连接时使用的密码 可选项
with grant option 设置授权用户连接后,有授权权限 可选项
select user(); 显示登陆的用户名和客户端地址;
show grants; 登陆数据库服务器的用户查看自己的访问权限
mysql> select user(); +++++++++++++++查看当前用户
+----------------+
| user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
mysql> show grants; ++++++++++++++++++查看当前用户权限
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ WITH GRANT OPTION |
| GRANT PROXY ON ‘‘@‘‘ TO ‘root‘@‘localhost‘ WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
1.给plj用户使用特定的密码在本机登录对所有的库的操作权限。
mysql> grant all on *.* to plj@"localhost" identified by "123456"; ++++++
Query OK, 0 rows affected (0.00 sec)
mysql> quit;
Bye
[root@19 ~]# mysql -uplj -p123456
mysql> select user();
+---------------+
| user() |
+---------------+
| plj@localhost |
+---------------+
1 row in set (0.00 sec)
mysql> show grants;
+---------------------------------------------------------------------------------------------------------------------+
| Grants for plj@localhost |
+---------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘plj‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
+---------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
2. 给 管理者(DAB)权限 特定主机特定用户和密码拥有所有权限。
mysql> grant all on *.* to root@"192.168.4.254" identified by "123456" with grant option; +++++++++++++++
Query OK, 0 rows affected (0.08 sec
实验:
[root@room1pc01 桌面]# mysql -h"192.168.4.19" -uroot -p123456
1 row in set (0.00 sec)
mysql> select user(); 查看当前用户和主机ip
+--------------------+
| user() |
+--------------------+
| root@192.168.4.254 |
+--------------------+
1 row in set (0.00 sec)
mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ WITH GRANT OPTION |
| GRANT PROXY ON ‘‘@‘‘ TO ‘root‘@‘localhost‘ WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------------------------------------------+
3.给使用者(网站服务器)特定的权限 使用设置的用户密码和ip主机,有wedbd库下所有权限。
设置权限:
mysql> grant all on wedbd.* to weadmin@"192.168.4.5" identified by "123456";
实验:
[root@proxe ~]# mysql -h192.168.4.19 -uweadmin -p123456
mysql> select user();
+---------------------+
| user() |
+---------------------+
| weadmin@192.168.4.5 |
+---------------------+
1 row in set (0.03 sec)
mysql> show grants;
+------------------------------------------------------------------------------------------------------------------+
| Grants for weadmin@192.168.4.5 |
+------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO ‘weadmin‘@‘192.168.4.5‘ IDENTIFIED BY PASSWORD ‘*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9‘ |
| GRANT ALL PRIVILEGES ON `wedbd`.* TO ‘weadmin‘@‘192.168.4.5‘ |
+------------------------------------------------------------------------------------------------------------------+
4.设置student用户在任何主机不用输密码可直接登入
mysql>grant select,update(name,uid) on userdb.user to student; +++++++只对userdb.user表有select,update(name,uid)权限,默认设置时先要存在该表和该字段,设置才能成功)
[root@room1pc01 桌面]# mysql -ustudent
——————————————————————————————————————————————————————————————————————
注意测试时:都要装mysql连接工具,就可以连接授权的mysql数据库。
[root@room1pc01 桌面]# yum -y install mysql
[root@room1pc01 桌面]# which mysql
/usr/bin/mysql
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
本文出自 “12336621” 博客,请务必保留此出处http://12346621.blog.51cto.com/12336621/1920561
mysql 实用