mysql --help|grep my.cnf
存储引擎是基于数据库的,而不是表
innodb : 在线事务处理 oltp,定义没有显示主键时,rowid后台生成作为主键
查看支持的存储引擎:show engines\G;
复制表: create table xixi_bak engine=myisam as select * from xixi;
unix域嵌套字连接: show variables like 'socket'; ------进程间通信(IPC)的一种方式
show variables like 'innodb_version'\G
1、参数文件:实例启动那找数据库文件,并且某些初始化参数,定义内存结构大学等设置
类比ora参数文件: 键值对
show variables like 'innodb_buffer%'\G;
参数文件分为动态(临时)和静态(永久):
动态参数set实例运行中更改,
set read_buffer_size=524848;
select @@session.read_buffer_size\G;
select @@global.read_buffer_size\G;
上面只改了当前会话,另外一个会话登录,是修改前的值。
set @@global.read_buffer_size=10488576; 修改所有,退出重新登录即可。
如果想要永久有效:改参数文件。
2、日志文件:记录实例对条件响应时写入文件,错误日志,二进制日志,慢查询日志,连接日志
error log:show variables like 'log_error'\G;
binlog 二进制:恢复 审计 复制(主master、primart 从slave standby),建议任何时候都开启,恢复功能。
show variables like 'datadir';
max_binlog_size: 单个二进制文件最大值,超过就+1,后缀为.index --mybinlog.000002
innodb存储引擎有binlog_cache_size 基于会话,每个会话都分配,事务未提交记录到此,提交后写入binlog。不能过大,也不能过小。
show variables like 'binlog_cache_size'; --缓冲大小
show global status like 'binlog_cache%'; --记录临时文件次数和缓冲次数。
mysql> show variables like 'binlog_cache_size';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| binlog_cache_size | 32768 |
+-------------------+-------+
mysql> show global status like 'binlog_cache';
mysql> show global status like 'binlog_cache%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| Binlog_cache_disk_use | 0 | ----事务缓冲二进制不够就用临时文件空间次数,为0说明ok。
| Binlog_cache_use | 3 |
+-----------------------+-------+ ----记录了缓冲写二进制的次数。
slow query log: 所有查询,用处不大。
show variables like 'long_query_time'\G; 查看域值,超过就好定义为慢。
log查询日志:
socket文件:unix域套接字使用 show variables like 'socket'\G;
pid文件:mysql实例的进程id文件 show variables like 'pid_file'\G;
作用是:在数据文件是同一份,但端口不同的情况下,防止同一个数据库被启动多次。
重做日志文件:不能太大,太大恢复旧,太小事务导致切换频繁,影响性能。 ---重做日志是innodb专有的(记录每个页的物理情况),二进制是所有mysql所有存储引擎都有的(逻辑日志)。
表结构文件:
存储引擎文件:
约束: primary key unique key foreign key default not null
触发器约束
mysql 当两个字段想减时,如果其中一个或两个字段的类型的unsigned无签名类型,如果想减的值
小于0则会报错(BIGINT UNSIGNED value is out of range)
create table usercash(
userid int not null,
cash int unsigned not null);
insert into usercash select 1,1000; --插入数据
update usercash set cash=cash-(-20) where userid=1; --但是不符合业务逻辑,消费减去-20块。
----------------------------------------------通过触发器约束这个行为。
create table usercash_err_log (
userid int not null,
old_cash int unsigned not null,
new_cash int unsigned not null,
user varchar(30),
time datetime);
---在更新usercash前,检查大的大于小的,错误就插入usercash_err_log,原表不变。
-- 没有操作之前的状态数据都保存old关键字中
-- 而操作之后的状态都放到了new中
delimiter ;
delimiter $$
create trigger tgr_usercash_update before update on usercash
for each row
begin
if new.cash-old.cash > 0 then
insert into usercash_err_log
select old.userid,old.cash,new.cash,user(),now();
set new.cash = old.cash;
end if;
end;
$$
delimiter ;
---------------------------------------------
delete from usercash;
insert into usercash select 1,1000;
update usercash set cash = cash - (-20) where userid=1;
select * from usercash;
select * from usercash_err_log;
update usercash set cash = cash - (+20) where userid=1;
select * from usercash;
select * from usercash_err_log;
-----------网上案例
delimiter $$
-- 表示在插入之前的触发器
CREATE TRIGGER a_b before INSERT on my_order for each ROW
BEGIN
-- 取出库存 并存放到变量中
select inv from my_good where id = new.good_id into @inv;
-- 判断取出的库存是否满足进单 如果库存小于当前订单中的商品数量
if @inv < new.good_num THEN
-- 中断操作
-- 根据触发器的特点 出错就会将之前的插入成功的失效
-- 所以在判断内写错的语句即可
INSERT into XXX values("xxx");
end if;
END
$$
delimiter;
外键约束
create table parent(
id int not null,
primary key (id)
) engine=innodb;
create table child(
id int,
parent_id int,
foreign key (parent_id) references parent(id)
) engine=innodb;
show create table child\G;
视图
通过视图约束,约束
查看视图,视图是虚表,查看表语句: show tables;
通过视图插入数据到原表。
create table t (id int);
create view v_t as select * from t where id <10;
insert into v_t select 20;
select * from v_t;
---v_t 加上with check option参数约束
---修改直接create变为alter即可。
alter view v_t as select * from t where id<10 with check option;
insert into v_t select 30;
select * from v_t;
insert into v_t select 3;
select * from v_t;
innodb有2种标准行级锁:
共享锁: s lock: 允许事务读一行数据
排他锁: x lock, 允许事务删除或更新一行数据。
重做日志文件实现事务的持久性,内存中的重做日志缓冲(redo log buffer),易失的
重做日志文件(redo log file),持久性的。---记录的物理日志比逻辑日志(logbin)快。
undo: 事务失败(逻辑日志),rollback利用undo信息回到修改之前的样子。
-------但是回滚后表空间会增大,不会恢复到原来样子。
mysql默认是自动提交(auto commit),执行后提交。
显示开启提交: begin 或者 start transaction 或者set autocommit=0; 禁用自动提交。
不好的事务习惯
1、循环中提交
create table t1(xixi char,haha char(90));
delimiter $$
create procedure load1(count int unsigned)
begin
declare s int unsigned default 1;
declare c char(80) default repeat('a',80);
while s <= count do
insert into t1 select null,c;
commit;
set s=s+1;
end while;
end;
$$
delimiter ;
mysql> call load1(10000);
Query OK, 0 rows affected (39.06 sec) --一万次提交,写了一万次重做日志
--其实也默认commit了
delimiter;
delimiter $$
create procedure load2(count int unsigned)
begin
declare s int unsigned default 1;
declare c char(80) default repeat('a',80);
while s<=count do
insert into t1 select null,c;
set s=s+1;
end while;
end;
$$
delimiter ;
mysql> call load2(10000);
Query OK, 1 row affected (38.43 sec)
--手动commit了
delimiter $$
create procedure load3(count int unsigned)
begin
declare s int unsigned default 1;
declare c char(80) default repeat('a',80);
start transaction;
while s<=count do
insert into t1 select null,c;
set s=s+1;
end while;
commit;
end;
$$
delimiter ;
mysql> call load3(10000);
Query OK, 0 rows affected (0.27 sec) ---一次事务提交
2、避免自动提交
set autocommit=0;
1、hot、cold,warm backup
2、逻辑备份(语句),裸文件备份(物理)
增量备份:记录lsn备份页
冷备:复制走,恢复赋值回去
--master-data [=value]:
默认为空
1:转存文件中记录change master
2:change master被写mysql注释。chang master to也是会写到dump文件里面去的,但是这个语句是被注释的状态。
合适cpu:oltp(在线事务处理--交易系统)和olap (在线分析处理)
oltp:交易量大,语句简单,复杂查询少。 64位多核cpu
内存:最优
硬盘、raid:raid10最好
操作系统:linux,freebsd,64位系统