指令+数据,PHP:查找算法
排序,二分法,索引,B+树
搜索码
ODBC
线程池:用来限制线程个数
DBMS:databases management system
数据的组织结构
层次型
网状型
关系型
RDBMS:relational databases management system
RDBMS:
1、数据库创建,删除
2、创建表,删除表,修改表
3、索引的创建,删除
4、用户和权限
5、数据增、删、改
6、查询
DML:data manapulate lanague:数据操作语言
insert,replace,update,delete
DDL:data defination lanauage:数据定义语言
create,alter,drop
DCL:data control language:数据控制语言
grant,revoke
SELECT
RDBMS:
oracle,Sybase,infomix,DB2,SQL server,MySQL,egresql,postgresql,enterpriseDB
MySQL,SQL,MySQL AB
去IOE计划(IBM,Oracle,EMC)
Oracle,
IBM,
SUN-->MySQL
BEA:weblogic
PepoleSoft
OpenOffice
LibreOffice
MariaDB
MySQL --> Percona
反关系模型:NoSQL
MongoDB
Redis
HBase
DBMS:
数据管理独立性
有效地完成数据存取
数据完整性和安全性
数据集中管理
开发存储与故障恢复
减少应用程序开发时间
SQL:ANSI
sql86,sql89,sql92,sql99
DBMS基本组件:提供分析器来判断语法是否正确,计划执行器用来分析有多少种方法来执行这个语句,优化器来判断哪种方法最优,文件的存取方法,要先把数据存取到缓存器,最后使用磁盘空间管理器来决定此数据存在哪个空间里,以及故障恢复管理器,事物管理器,锁管理器
www.mysql.com
MySQL:
community Edtion,社区版
Enterprise Edtion,企业版
软件包格式:
软件包管理器特有的格式
rpm包,.exe格式
通用二进制格式
源程序
RHEL 5.8 (32bit)
mysql,mysql-server
MySQL的rpm包
LAMP:
MySQL
通用二进制
二进制程序
mysql
-u username
-p
-h mysql_server
-h 127.0.0.1
Linux:socket
windows:memory
mysql客户端:
交互式模式
批处理模式:执行mysql脚本
交互式模式中的命令类别:
客户端命令
服务器端命令
都必须使用语句结束符,默认为分号;
SQL接口:
Oracle,PL/SQL
SQL server,T-SQL
用户:username@host
mysqld
tcp/3306
RDBMS:
/var/lib/mysql/
安装
yum install mysql-server
初始化:就是建立mysql数据库
关系数据库对象:
库
表
索引
试图
约束
存储过程
存储函数
触发器
游标
用户
权限
事务
表:
行,列
表:实体
行:row
列:field,column
字段名称,数据类型,类型修饰(实现限制功能)
字段名称:
字符,char(n),varchar(n),binary(n),varbinary(n),text(n),blob(n),
数值
精确数值:
整型
tinyint
smallint
medinuint
int
bigint
修饰符:unsigned,无符号
not null
十进制:
decimal
近似数值
浮点型
Float
double
日期时间
data
time
datetime
stamp
布尔
DDL
create
alter
drop
DML
insert
update
delete
DCL
grant
revoke
创建数据库
create database db_name;
create database if not exists db_name;
drop database db_name;
创建表
create table tb_name(col1,col2,...);
查看库中的表:show tables from db_name;
查看表的结构:desc tb_name;
删除表:drop table tb_name;
修改表:
alter table tb_name
modify
change
add
drop
DML:
insert into tb_name (col1,col2,...) values|value('string',num,...);
insert into tb_name (col1,col2,...) values|value('string',num,...),('string',num,...);
update tb_name set column=value where
delete from tb_name where condition;
选择:
select 字段 from tb_name where condition
*: 所有字段
where:没有条件表示显示所有行
创建用户:
create user 'username'@'host' identified by 'password'
drop user 'username'@'host'
jerry@localhost,[email protected]
host:
ip:
hostname:
network:
通配符
:匹配任意单个字符,172.16.0.
%:匹配任意长度字符
jerry@'%'
DCL:
grant pri1,pri2,...on db_name.tb_name to 'username'@'host' [identified by 'password']
revoke pri1,pri2,...on db_name.tb_name from 'username'@'host'
查看用户授权:show grants for 'username'@'host'
all privileges
选择(只对行操作):指定以某字段做为搜索码,做逻辑比较,选符合条件的行
where 指定选择条件
投影(只对列操作):
INT A=10
CHAR A=10
mysql -u root -p -h 172.16.100.1
ls /var/lib/mysql/
mysql>\h;
mysql>show databases;
mysql>create database testdb;
mysql>create database if not exists testdb;
mysql>drop database testdb;
mysql>use mydb;
mysql>create table students(name char(20) not null,age tintint unsigned,gender char(1) not null);
mysql>show tables;
mysql>desc students;
mysql>alter table students add course varchar(100);
mysql>alter table students change course Course varchar(100) after name;
mysql>alter table students drop course;
mysql>insert into studnets (name,gender) value ('linghuchong','m'),('xiaolongnv','f');
mysql>select from students;
mysql>insert into students values ('xiaoxiangzi','hamagong','57','m');
mysql>update students set course='pixiejianfa';
mysql>update students set course='hamagong' where name='xiaoxiangzi';
mysql>select name,course from students where gender='m';
mysql>delete from students where course='pixiejianfa';
mysql>create user 'jerry'@'%' identified by 'jerry';
mysql>show grants for 'jerry'@'%';
mysql>grant all privileges on mydb. to 'jerry'@'%';
MySQL
SQL/MySQL
事务,隔离,并发控制,锁
用户和权限
监控:status
索引类型:查询:variables
备份和恢复
复制功能
集群
文件存储缺陷:数据冗余和不一致性,数据访问困难,数据孤立,完整性问题,原子性问题,并发访问异常,安全性问题
文件:
表示层:文件
逻辑层:文件系统:存储引擎
物理层:元数据,数据:数据块
dbms:层次模型,网状模型,关系模型
E-R:实体-关系模型
关系模型(结构化数据模型):
关系模型
实体-关系模型
对象关系模型:基于对象的数据模型
半结构化数据模型:xml(扩展标记语言)例如
关系:关系代数运算
交集
并集
差集
全集
补集
SQL(structure query language):结构化查询语句
70年代
system R:SQL
ingres,oracle,Sybase
ANSI(美国国家标准委员会):ansi-sql
DML:数据操作语言
insert
delete
select
update
DDL:数据定义语言
create
drop
alter
DCL:数据控制语言
grant
revoke
访问权限
RDB对象:库,表,索引,视图,用户,存储过程,存储函数,触发器,事件调度器
约束:
域约束:数据类型约束
外键约束:引用完整性约束
主键约束:某字段能唯一标识此字段所属的实体,并且不允许为空,一张表只能有一个主键
唯一性约束:每一行的某字段都不允许出现相同值,可以为空,一张表中可以有多个
检查性约束:age:int
constraint
关系型数据库:
表示层:表
逻辑表:存储引擎
物理层:数据文件
数据存储和查询:
存储管理器:权限及完整性管理器,事物管理器,文件管理器,缓冲区管理器
查询管理器:DML解释器,DDL解释器,查询执行引擎
C/S:协议通信
单进程:
多线程:守护进程,应用线程
thread reuse(线程重用)
32bit:
2.7G
64bit:
smp:对称多处理器
MySQL --》mariadb--》percona
查询管理器--》存储管理器--》磁盘
关系运算:
投影:只输出指定属性
选择:只输出符合条件的行
自然连接:具有相同名字的属性上所有取值相同的行
笛卡尔积:(a+b)*(c+d)=ac+ad+bc+db
并:集合运算
SQL查询语句:
sequel-->SQL
SQL-86
SQL-92
SQL-99
SQL-03
SQL-08
SQL语言的组成部分:
DDL
DML
完整性定义语言:DDL的一部分功能
视图定义
事物控制
嵌入式SQL和动态SQL
授权:DCL
使用程序设计语言如何跟rdbms交互:
嵌入式SQL:与动态SQL类似,但其语言必须程序编译时安全确定下来
ODBC
动态SQL:程序设计语言使用函数(mysql_connect())或者方法与rdbms服务器建立连接,并进行交互:通过建立连接向SQL服务器发送查询语句,并将结果保存至变量中而后进行处理
JDBC
MySQL组成部分
连接管理器--》解析器+缓存器--》优化器--》储存引擎(MySQL插件式存储引擎)
用户连接请求--》连接管理器--》线程管理器--》用户模块--》命令分发模块+缓存模块+日志模块--》解析器--》优化器+表定义模块+表维护模块(repair)+状态报告模块+复制模块--》访问控制模块--》表管理器--》存储引擎
MySQL插件式存储引擎
5.5.8:myisam
5.5.8后:innodb
表管理器:负责创建、读取或修改表定义文件;维护表描述符高速缓存;管理表锁;
表结构定义文件
表修改模块:表创建,删除,重命名,移除,更新或插入之类的操作
表维护模块:检查,修改,备份,恢复,优化(碎片整理)及解析
行:定长,变长
文件中记录组织:
堆文件组织:一条记录可以放在文件中的任何地方
顺序文件组织:根据“搜索码”值顺序存放
散列文件组织:
表结构定义文件,表数据文件
表空间(table space)
数据字典(data dictionary):
关系的元数据:关系的名字,字段名字,字段的类型和长度,视图,约束,用户名字,授权,密码
缓冲区管理器:
缓存置换策略
被钉住的块
MySQL -->
MariaDB
Percona
MySQL安装:
专用软件包管理器
deb,rpm
rpm:RHEL(oracle Linux),centos,suse
通用二进制格式包
gcc:x86,x64
源代码:
5.5,5.6
cmake
MySQL用户密码修改:
1.mysqladmin -u username -h hostname password ‘new_pass’ -p
2.mysql>set password for "username"@"host" =password('new_pass')
3.mysql>update mysql.user set password=password('new_pass') where condition
MySQL安装:
源码安装MySQL
cmake
字符集:
汉字:字符集
GBK
GB2312
GB18030
UTF8
排序规则:
性能分析
安装MySQL
yum groupinstall "Development Libraries"
tar -zxvf cmake-2.8.8.tar.gz
tar -zxvf mysql-5.5.28.tar.gz
cd cmake-2.8.8
./configure
make
make install
groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
chown -R mysql.mysql /mydata/data
cd mysql-5.5.28
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock
make
make install
mysql--》mysqld
unix
mysql --> mysql.sock --> mysqld
windows
mysql --> memory(pipe) --> mysqld
不在同一主机上,基于tcp/ip协议
mysql客户端工具:
mysql
mysqldump
mysqladmin
mysqlcheck
mysqlimport
[client]
-u username
-h host
-p
--protocol {tcp|socket|pipe|memory}
--port PORT
cd /usr/local/mysql
chown -R :mysql ./
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start
vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin
mysql>show databases;
mysql>show engines;
vim /etc/my.cnf
[mysqld]
datadir=/mydata/data
mysql>drop user ''@localhost;
mysql>use mysql;
mysql>select User,Host,Password from user;
mysql>drop user ''@localhost.localdomain;
mysql>update user set Password=PASSWORD('redhat') where user='root';
mysql>flush privileges;
vim /root/.my.cnf
[client]
user = 'root'
password = 'redhat'
host = 'localhost'
mysql非客户端工具:
myisamchk
myisapack
myISAM:
每表三个文件:
.frm:表结构
.MYD:表数据
.MYI:表索引
innodb:
所有表共享一个表空间文件
建议:每表一个独立的表空间文件
.frm:表结构
.ibd:表空间(表数据和表索引)
mysql>show variables like '%innodb%';
vim /etc/my.cnf
[mysqld]
innodb_file_per_table = 1
mysql>create database mydb;
mysql>use mydb;
mysql>create table testdb(id int not null,name char(30));
MySQL插件式存储引擎:
5.5.8:myisam
5.5.8后:innodb
存储引擎,也被称为表类型:
mysql:myisam
myisam表:无事物,表锁
.frm:表结构定义文件
.myd:表数据
.myi:索引
innodb表:事物,行锁
.frm:表结构
.ibd:表空间(数据和索引)
mysql>show engines;
mysql>show table status like ‘[表名]’;
--protocol:
tcp,socket,pipe,memory
程序语言连接数据的方式:
动态SQL:通过函数或方法与数据库服务建立连接
嵌入式SQL:
JDBC,ODBC
客户端:mysql,mysqladmin,mysqldump,mysqlimport,mysqlcheck
服务器:mysqld,mysql_safe,mysqld_multi
my.cnf
/etc/my.cnf--》/etc/mysql/my.cnf--》$mysql_home/my.cnf--》--default-extra-file=/path/to/somefile --》~/.my.cnf
[mysqld]
[mysqld_safe]
[client]
host =
[mysql]
mysqld --help --verbose:查看各种指令帮助信息
datadir = /mydata/data
hostname.err:错误日志
1.此前服务未关闭
2.数据初始化失败
3.数据目录位置错误
4.数据目录权限问题mysql:myisam
DBA:
开发DBA:数据库设计,SQL语句,存储过程,存储函数,触发器
管理DBA:安装,升级,备份,恢复,用户管理,权限管理,监控,性能分析,基准测试
数据类型:
数值型:精确数值(int),近似数值(float,double,real)
字符型:定长(char(#),binary),变长(varchar(#),varbinary)
text,blob
enum(枚举),set(集合)
日期时间型:data,time,datatime,timestamp
域属性,修改符:
数据类型:
1.存入的值类型
2.占据的存储空间
3.定义还变长
4.如何比较及排序
5.是否能够索引
SQL
mysql>show character set;显示字符集
mysql>show collation;显示排序规则
mysql>show global variables like ‘%char%’;
mysql>select database();
mysql>select last_insert_id();
auto_increment:必须是×××,非空,无符号,主键或唯一键
mysql>create table test(id int unsigned auto_increment not null primary key,name char(20));
RRtype ENUM('A','PTR')
SQL模型:
abc,abcdefg
char(3)
MySQL服务器变量:
作用域:分为两类:
全局变量:mysql>show global variables like 'sql_mode';
会话变量mysql>show [session] variables like‘sql_mode’;
生效时间:分为两类:
可动态调整:可及时修改,能及时生效
可静态调整:写在配置文件中,通过参数传递给mysqld
动态调整参数的生效方式:
全局:对当前会话无效,只对新建会话有效
会话:及时生效,但只对当前会话生效
或者: br/>服务器变量:@@变量名
显示:select
设定:set global|session 变量名=‘values’
mysql>select @@global.sql_mode;
mysql>select @@session.sql_mode;
mysql>set global sql_mode='strict_all_tables';
mysql>set session sql_mode='strict_trans_tables';
SQL语句:
数据库
表
索引
视图
DML
数据库:
create database|schema [if not exists] db_name [character set=] [collate=]
alter {database|schema} db_name {character set charset_name|collate cllation_name
drop {database|schema} {if exists} db_name
mysql>show character set; mysql>create schema if not exists students character set 'gbk' collate 'gbk_chinese_ci';
mysql>
表:
1.直接定义一张空表;
2.从其他表中查询出数据,并以之创建新表
3.以其他表为模板创建一个空表
create table [if not exists] tb_name (col_name col_defination,constraint)
mysql>create table tb1(id int unsigned not null auto_increment primary key,name char(20) not null ,age tinyint nou null) engine=engine_name;
mysql>create table tb1(id int unsigned not null auto_increment ,name char(20) not null ,age tinyint nou null,primary key(id),unique key(name),index(age));
键也称作约束,可用作索引,属于特殊索引(有特殊限定):B+tree
mysql>create table courses(cid tinyint unsigned not null auto_increment primary key,couse varchar(50) not null) engine=myisam;
create>show indexes from tb_name;显示指定表上的索引
单字段:
primary key
unique key
单或多字段:
primary key(col,...)
unique key(col,...)
index(col,...)
mysql>show table status like 'courese'\G;
mysql>drop table courses;
mysql>insert into courses(course) values('hamagong'),('pixiejianfa'),('kuihuabaodian');
mysql>create table testcourses select * from courses where cid <=2;
mysql>desc testcourses;
mysql>create table test like courses;
修改表定义:
alter table:添加,删除,修改字段;添加,删除,修改索引,该表名,修改表属性
mysql>alter table test add unique key(course);
mysql>alter table test change course course varchar(50) not null;
mysql>alter table test add starttime date default ‘2013-04-12’;
mysql>alter table test rename to testcourse;
mysql>rename table testcourse to test;
mysql>create table student(sid int unsigend not null auto_increment primary key,name varchar(30),cid int not null)
mysql>insert into student(name,cid) values(‘yue buqun’,2),(‘zhang wuji’,1)
mysql>select name,couse from student,courses where student.cid=courses.cid;
mysql>insert into student(name,cid) values('chen jialuo',5);
mysql>alter table student add foreing key foreign_cid(cid) references course(cid);
mysql>create table course like courses;
mysql>alter table courses engine=innodb;
mysql>show tables status;
mysql>alter table student modify cid tinyint unsigned not null;
mysql>show indexes from student;
mysql>insert into student(name,cid) values('chen jialuo',5);
删除表:
innodb支持外键
create index创建索引
show indexes from tb_name 显示指定表上的索引
create index index_name on tb_name(col,...);
col_name[(length)] [asc|desc]
name
mysql>create index name_on_student on student(name) usinag btree;
mysql>drop index name_on_student on student;
mysql>create index name_on_student on student(name(5)desc) using btree;
mysql>show indexes from student;
DDL:
DML:
select
insert into
delete
update
select select-list from tb where qualification
查询语句类型:
简单查询
多表查询
子查询
select from tb_name;
select filed1,filed2 from tb_name;投影
select [distinct] from tb_name where qualification;选择
mysql>select from students;
mysql>select from students where age>=20;
mysql>select name,age from students where age >=20;
mysql>select name,age from students where gender='M';
mysql>select gender from students;
mysql>select distinct gender from students;
from子句:要查询的关系 表、多个表,其它select语句
where子句:布尔关系表达式,=,<,>,<=,>=
逻辑关系:and,or,not,between ... and ...
like ""
%:任意长度任意字符
_:任意单个字符
rlike "正则表达式"
in/not in
is null
is not null
mysql>select name,age from students where age+1>=20;
mysql>select name,age,gender from students where age>20 and gender='M';
mysql>select name,age,gender from students where age>20 and gender='M' or gender='M';
mysql>select name,age,gender from students where not age>20;
mysql>select name,age,gender from students where not age>20 and not gender='M';
mysql>select name,age,gender from students where not (age>20 or gender='M');
mysql>select name,age from students where age between 20 and 25;
mysql>select name from students where name like 'Y%';
mysql>select name from students where name like 'Y____';
mysql>select name from students where name like '%ing%';
mysql>select name from students where name rlike '^[MNY].*$';
mysql>select name from students where age=20 or age=18 or age=25;
mysql>select name from students where age in(18,20,25);
mysql>select name from students where CID is null;
order by filed_name {asc|desc}
mysql>select name from students where CID is not null order by name desc;
字段别名:as
mysql>select name as students_name from students;
mysql>select 2+1;
mysql>select 2+1 as sum;
limit子句:limit [offset(偏移量),count]
mysql>select name as student_name from students limit 2;
mysql>select name as student_name from students limit 2,3;
聚合:sum(),min(),max(),count()
mysql>select avg(age) from students;
mysql>select min(age) from students;
mysql>select max(age) from students;
mysql>select sum(age) from students;
mysql>select count(age) from students;
group by:分组
having qualification
mysql>select age,gender from students group by gender;
mysql>select avg(age) from students group by gender;
mysql>select count(CID1),CID1 from students group by CID1;
mysql>select count(cid1) as persons,cid from students group by cid1 having persons>=2;
多表查询:
连接:
交叉连接:笛卡尔乘积
自然连接:
外连接:左外连接... left join ... on ...,右外连接... right join ... on ...
自连接
mysql>select from students,course;
mysql>select from students,course where students.cid1=course.cid;
mysql>select students.name,course.cname from students,course where students,cid1=course.cid;
mysql>select s.name,c.cname from students as s,course as c where s.cid1=c.cid;
mysql>select students.name,course.cname from students left join course on students.cid1=course.cid;
mysql>select students.name,course.cname from students right join course on students.cid1=course.cid;
mysql>select c.name as stu,s.name as teacher from students as s,students as c where c.tid=s.sid;
子查询:
where ...> (select from ...)比较操作中使用子查询:子查询只能返回单个值
in/not in(select from ...):使用子查询
mysql>select name from students where age > (select avg(age) from students);
mysql>select name from students where age in (select age from tutors);
在from中使用子查询:
mysql>select name,age from (select name,age from students) as t where t.age >=20;
联合查询:
(select from ...)union(select from ...)
mysql>(select name,age from students) union (select tname,age from tutors);
1.挑选出course表中没有被students中cid2学习的课程名称
mysql>select cname from course where cid not in (select distinct cid2 from students where cid2 is not null);
2.挑选出没有教授任何课程的老师,每个老师以及所教授课程的对应关系在course表中
mysql>select tname from tutors where tid not in (select distinct tid from courses)
3.找出students表中cid1有两个或两个以上同学学习了的同一门课程的课程名称
mysql>select cname from course where cid in (select cid1 from students group by cid1 having count(cid1) >=2);
4.显示每一位老师及其所教授的课程,没有教授的课程的保持为null
mysql>select t.tname,c.cname from tutors as t left join course as c on t.tid=c.tid;
5.显示每位同学cid1课程的课程名及其讲授了相关课程的老师的名称
mysql>select name,cname,tname from students,course,tutors where students.cid1=course.cid and course.tid=tutors.tid;
视图:存储下来的select语句
基于基表的查询结果
view
create view
物化视图:select
mysql>create view sct as select name,cname,tname from students,course,tutors where students.cid1=course.cid and course.tid=tutors.tid;
mysql>show create view sct\G;
mysql -e 'select * from jiaowu.students'
mysql -e "insert into jiaowu.students(name,age,gender,cid1,cid2,tid,createtime) values('stu1',23,'F',4,1,6,'2013-04-26 17:56:00')"
广义查询:
DML:
delete
insert into
update
insert into tb_name(col1,col2,...)values(val1,val2,...)[,val1,val2,...),...]
字符型:单引号
数值型:不需要引号
日期时间型:
空值:null,‘ ’
mysql>insert into tutors set tname="tom",cender="F",age=30;
mysql>select from tutors;
mysql>select from tutors order by tid desc limit 1;
mysql>select last_insert_id();
mysql>desc students;
mysql>desc tutors;
mysql>select name,gender,age from students where age > 20;
mysql>insert into tutors set tname='tom',gender='F',age=30;
mysql>insert into tutors (tname,gender,age) select name,gender,age from students where age > 20;
REPLACE INTO
DELETE:
delete from tb_name where condition;
truncate tb_name:清空表,并重置autoincrement数量
truncate students
UPDATE:
update tb_name set col1...,col2=... where
连接管理器:
接受请求
创建线程
认证用户
建立安全连接
mysql>select CURRENT_TIME()
并发控制:
Mbox:MDA
c/s:100
10分钟:
多版本并发控制:MVCC
锁:
读锁:共享锁
写锁:独占锁
lock tables tb_name lock_type{read|write}
unlock tables
锁粒度:从大到小,MySQL服务器仅支持表级锁,行锁需要由存储引擎完成:
表锁:
页锁:
行锁:
mysql>lock tables tutors read;
事务:
RDBMS:ACID(原子性,一致性,隔离性,持久性)
myisam:
innodb:
事务日志:
重做日志redo log
撤消日志undo log
日志组
隔离性:
隔离级别:
read uncommitted:读未提交,即不用commit就执行成功了,其他人立即可以看到改变的结果
read committed:读提交,即只有commit之后才算执行成功,其他人才能看到改变的结果
repatable read:可重读,即在全部事务commit之前(即双方的事务都要进行提交),其他人看到的结果是一样的。
seriablizable:可串行,即对方只有commit以后,其他人才能进行操作
mysql>show global like '%iso%';
服务器变量:
全局变量:修改后不影响当前会话,只对新建的会话有效
会话变量:仅对当前会话有效,而且是立即生效
永久有效:修改配置文件
修改:set{session|global} var_name=‘’
mysql>set tx_isolation='read-uuncommitted';
多事务同时执行:彼此之间互相不影响的方式进行并发
事物之间交互:通过数据集
事务:cpu,I/O
RDBMS,
ACID:
automicity:原子性,事务所引起的数据库操作,要么都完成,要么都不执行;
consistency:一致性,A(3000)--》B(2000)
isolation:隔离性,靠事务调度来实现
事务调度:事务之间影响最小
mvcc:多版本并发控制
durability:一旦事务成功完成,系统必须保证任何故障都不会引起事务表示出不一致性;
1.事务提交之前就已经写出数据至持久存储;
2.结合事务日志完成;事务日志是顺序IO,数据文件是随机IO
事务的状态:
活动的:active
部分提交的:最后一条语句执行后
失败的:
终止的:
提交的:
事务:并发执行
1.提高吞吐量和资源利用率
2.减少等待时间
事务调度:
可恢复调度:
无级联调度
隔离级别:
read uncommitted(不需要提交就能生效)
read committed(必须要提交才能生效)
repeatable read
serializable
并发控制依赖的技术手段:
锁
时间戳
多版本和快照隔离
饿死
死锁
SQL,ODBC
start tansaction:启动事务
commit:提交
rollback:回滚
当commit之后代表此事务已经完结,进行下一个操作仍要重新启动事务
mysql>start transaction;
mysql>select * from tutors;
mysql>delete from tutors where tname like 'stu%';
mysql>rollback;
mysql>commit;
mysql>select @@autocommit;
如果没有明确启动事务:
autocommit:能实现自动提交,每一个操作都直接提交;
建议:明确使用事务,并且关闭自动提交
mysql>set autocommit=0;
保存点:savepoint
回滚至保存点:rollback to sid
mysql>savepoint ab;
mysql>rollback to ab;
mysql>select @@tx_isolation;
mysql>set tx_isolation='read-uncommitted';
mysql>start transaction;
mysql>update tutors set age=50 where tid=12;
mysql>set tx_isolation='read-committed';
mysql>commit;
mysql>start transaction
mysql>set tx_isolation='repeatable-read';
mysql>set tx_isolation='serializable';
MySQL:br/>用户
密码:password()
用户名@主机
账号:认证
权限:授权
user:用户账号、全局权限
db:库级别权限
host:废弃
tables_priv:表级别权限
columns_priv:列级别权限
procs_priv:存储过程和存储函数相关的权限
proxies_priv:代理用户权限
用户账号:br/>用户@主机
用户名:16字符以内
主机:
主机名:www.magedu.com
IP:192.168.1.25
网络地址:192.168.1.0/255.255.255.0
通配符:%,_:172.16.%.%,%.magedu.com
--skip-name-resolve
权限级别:
全局级别:super,
库级别:
表级别:delete,alter,trigger
列级别:select,insert,update
存储过程和存储函数
临时表:内存表
heap:16MB
触发器:主动数据库
insert,delete,update
create user username@host [identified by 'password']
mysql>create user catiuser@'%' indetified by 'cactiuser';
grant:授权
insert into mysql.user
show grant for
grant all privileges on [object_type].* to username@'%';
object_type:
table
function
procedure
grant execute on function db.abc to usrname@'%';
show grants for 'username@host';
grant option:
max_qureies_per_hour count
max_update_per_hour count
max_user_connections count
mysql>grant create on cactidb. to cactiuser@'%';
mysql>grant insert on cactidb. to cactiuser@'%';
mysql>grant select on cactidb. to cactiuser@'%';
mysql>grant alter on cactidb. to cactiuser@'%';
mysql>grant update(age) on cactidb.testtb to cactiuser@'%';
mysql>grant super on . to cactiuser@'%'
mysql>set global tx_isolation='read-uncommitied';
insert into mysql.user
mysql>flush privileges;
drop user username@'%'
rename user old_name to new_name
revoke:回收权限
mysql>revoke select on cactidb.* from cactiuser@'%';
启动mysqld_safe时传递两个参数:
--skip-grant-tables
--skip-networking
通过更新授权表方式直接修改其密码,而后移除此两个选项重启服务器
service mysqld stop
mysqld_safe --skip-grant-tables --skip-networking &
mysql>select User,Host,Password from user;
mysql>update user set password=password('123456') where user='root';
错误日志:long_error,log_warning
一般查询日志:general_log,general_log_file,log,log_output
慢查询日志:long_qurey_time,log_slow_queries={yes|no},slow_query_log,slow_query_log_file
log_output{table|file|none}
mysql>set global slow_query_log=1;
二进制日志:任何引起或可能引起数据库变化的操作:复制、即时点恢复,mysqlbinlog,
二进制日志的格式:
基于语句:statement
基于行:row
混合方式:mixed
二进制日志事件:
产生的时间
相对位置
二进制日志文件:
索引文件
二进制日志文件
查看当前正在使用的二进制日志文件:
mysql>show master status;
mysql>show binary logs;
mysql>insert into tutors(tname.gender,age) values('stu100','M',30);
mysql>show binlog events in 'mysql-bin.000001' [from position];
mysqlbinlog:
--start-datetime
--stop-datetime
--start-position
--stop-position
mysqlbinlog mysql-bin.000001
mysqlbinlog --start-position=107 --stop-position=358 mysql-bin.000001
mysqlbinlog --start-datetime='2013-04-29 15:14:39' mysql-bin.000001 > /root/a.sql
mysql>flush logs;实现日志滚动
mysql>purge binary logs to 'mysql-bin.000003';删除指定日志文件之前的日志文件
中继日志:在从服务器上,从主服务器的二进制日志文件中复制而来的事件,并保存为的日志文件
事务日志:ACID,将随机IO转换为顺序IO;事务性存储引擎用于保证原子性,一致性,隔离性和持久性
innodb_flush_log_at_trx_commit:
0:每秒钟同步一次,告诉内核别在内存中缓存,直接同步到磁盘中去
1:每事务同步,并执行磁盘flush操作
2:每事务同步,但不执行磁盘flush操作
myisam:不支持事务,表锁,不支持外键,支持B树索引,fulltext索引,空间索引,支持表压缩
innodb:支持事务,行级锁,B树索引,聚簇索引,自适应hash索引,表空间,raw磁盘设备
mrg_myisam
表类型
mysql>show global variables like ‘%log%’;
mysql>show global variables like '%long%';
mysql>set slow_query_log=on;
mysql>show engines;
IOPS: