Mysql从入门到放弃--存储引擎

一.索引压力测试

  • 先准备压力测试文件
    为了测试我们创建一个web01的库创建一个t1的表,然后导入50万行数据,脚本如下:
1.创建一个slap.sh的文件
vim slap.sh
2.编辑测试脚本
#!/bin/bash  
HOSTNAME="localhost" 
PORT="3306" 
USERNAME="root" 
PASSWORD="123" 
DBNAME="web01" 
TABLENAME="t1" 
#create database 
mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "drop database if exists ${DBNAME}" 
create_db_sql="create database if not exists ${DBNAME}" 
mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} -e "${create_db_sql}" 
#create table 
create_table_sql="create table if not exists ${TABLENAME}(stuid int not null primary key,stuname varchar(20) not null,stusex char(1)   
not null,cardid varchar(20) not null,birthday datetime,entertime datetime,address varchar(100)default null)" 
mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${create_table_sql}" 
#insert data to table 
i="1" 
while [ $i -le 500000 ]  
do  
insert_sql="insert into ${TABLENAME}  values($i,'alexsb_$i','1','110011198809163418','1990-05-16','2017-09-13','oldboyedu')" 
mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${insert_sql}" 
let i++  
done  
#select data  
select_sql="select count(*) from ${TABLENAME}" 
mysql -h ${HOSTNAME} -P${PORT} -u${USERNAME} -p${PASSWORD} ${DBNAME} -e "${select_sql}"
3.执行测试脚本
[root@web01 ~]# sh slap.sh 1>/dev/null 2>&1   --标准输出到空设备文件,标准错误输出也重定向到空设备文件
4.检查数据可用性
mysql> select count(*) from t1;
5.在没有优化之前我们使用mysqlslap来进行压力测试
mysqlslap --defaults-file=/etc/my.cnf \
--concurrency=100 --iterations=1 --create-schema='oldboy' \
--query="select * from oldboy.t1 where stuname='alexsb_100'" engine=innodb \
--number-of-queries=200000 -uroot -p123456 -verbose

二.存储引擎

  • 存储引擎的种类

InnoDB
MyISAM
MEMORY
ARCHIVE
FEDERATED
EXAMPLE
BLACKHOLE
MERGE
NDBCLUSTER
CSV
还可以使用第三方存储引擎。
插件类存储引擎,是在表级别设定的.
MySQL 5.5 以后默认存储引擎innodb
TokuDB ---->zabbix : insert 2-3 ,压缩比 8-10倍
myrocks

  • MySQL存储引擎介绍(1)
    在这里插入图片描述

  • MySQL存储引擎介绍(2)
    1.文件系统
    操作系统组织和存取数据的一种机制
    文件系统是一种软件

    2.类型ext2 3 4 ,xfs 数据
    不管使用什么文件系统,数据内容不会变化
    不同的是,存储空间、大小、速度。

    3.MySQL引擎
    可以理解为,MySQL的“文件系统”,只不过功能更加强大。

    4.MySQL引擎功能
    除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能。

  • Innodb存储引擎与MyISAM区别

InnodbMyISAM
MVCC(多版本并发控制)不支持
锁(行级别)表级别
外键不支持
事务不支持
热备温备
CSR(断电时,故障自动恢复)不支持
表的名字.frm,表的名字.ibd表的名字.frm,表的名字.MYD,表的名字.MYI
  • 查看存储引擎
show engines;                    
show create table world.city;

SELECT @@default_storage_engine;   --查看默认的存储引擎
show table status like 'city';
show table status like 'city'\G
  • Innodb存储引擎物理存储方式
    在这里插入图片描述
  • 表空间(TBS)管理模式:
来自于Oracle
共享表空间:----->类似于Oracle管理模式
独立表空间:每个表单独使用表空间存储

5.5默认:共享表空间
5.6以后:表默认管理模式是独立表空间,共享表空间也存在
  • 表空间存储数据分类
共享表空间: ibdata1 
存了什么?
系统数据
undo日志
磁盘临时表

独立表空间:
t1.ibd    ---->t1表的数据和索引
t1.frm    ---->t1表的列相关信息
  • 表空间操作
共享表空间:
我们建议,在初始化数据的时候就配置好
一般建议2-3,512M
/etc/my.cnf
innodb_data_file_path=ibdata1:76M;ibdata2:50M:autoextend
mysql_install_db 

独立表空间: 
一个表一个ibd文件,存储表数据和索引
show variables like 'innodb_file_per_table';

innodb 的表
表数据和索引:t1.ibd 
列的基本信息:t1.frm 
其他的属性信息:基表

alter table t1 discard tablespace;   将表的ibd文件删掉
alter table t1 import tablespace;    将idb文件导入回来
  • 企业案例
jira(bug追踪) 、 confluence(内部知识库)    ------>LNMT 

-------------------
联想服务器(IBM)   
磁盘500G 没有raid
centos 6.8
mysql 5.6.33  innodb引擎  独立表空间
备份没有,日志也没开
------------------

编译→制作rpm

/usr/bin/mysql

/var/lib/mysql

confulence   jira

所有软件和数据都在"/"
------------
断电了,启动完成后“/” 只读

fsck   重启

启动mysql启动不了。

结果:confulence库 在  , jira库不见了
------------
求助:
	这种情况怎么恢复?
	
我问:
	有备份没
求助:
	连二进制日志都没有,没有备份,没有主从
我说:
	没招了,jira需要硬盘恢复了。
求助:
	1、jira问题拉倒中关村了
	2、能不能暂时把confulence库(107张表)先打开用着	
	将生产库confulence,拷贝到1:1虚拟机上/var/lib/mysql,直接访问时访问不了的
	
问:有没有工具能直接读取ibd

我说:我查查,最后发现没有


我想出一个办法来:
create table xxx
alter table  confulence.t1 discard tablespace;
alter table confulence.t1 import tablespace;


虚拟机测试可行。

CREATE TABLE `city_new` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `Name` char(35) NOT NULL DEFAULT '',
  `CountryCode` char(3) NOT NULL DEFAULT '',
  `District` char(20) NOT NULL DEFAULT '',
  `Population` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  KEY `CountryCode` (`CountryCode`),
  KEY `idx_popu` (`Population`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;


面临的问题,confulence库中一共有107张表。
1、创建107和和原来一模一样的表。

他有2016年的历史库,我让他去他同事电脑上 mysqldump备份confulence库
mysqldump -uroot -ppassw0rd -B  confulence --no-data >test.sql

拿到你的测试库,进行恢复
	到这步为止,表结构有了。
	
2、表空间删除。
select concat('alter table ',table_schema,'.'table_name,' discard tablespace;') from information_schema.tables where table_schema='confluence' into outfile '/tmp/discad.sql';
	source /tmp/discard.sql
	
	执行过程中发现,有20-30个表无法成功。主外键关系
	很绝望,一个表一个表分析表结构,很痛苦。
	set foreign_key_checks=0 跳过外键检查。

	把有问题的表表空间也删掉了。
3、拷贝生产中confulence库下的所有表的ibd文件拷贝到准备好的环境中
	select concat('alter table ',table_schema,'.'table_name,' import tablespace;') from information_schema.tables where table_schema='confluence' into outfile '/tmp/discad.sql';
	
4、验证数据
	表都可以访问了,数据挽回到了出现问题时刻的状态(2-8

额外扩展

drop database world -----> rm -rf world
drop table city ----> rm -rf frm ibd 元数据

基于Linux文件句柄恢复rm的文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值