Mysql从入门到放弃--存储引擎_Petrus_shuai的博客-程序员宅基地

技术标签: 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区别

Innodb MyISAM
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的文件

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/luan7liem/article/details/90523282

智能推荐

makefile 中定义宏位置需要注意一下-程序员宅基地

1 CUR_DIR = $(shell pwd) 2 3 CFLAGS = -g -Wall 4 GCC = gcc 5 GXX = g++ 6 7 TARGET = exe.out 8 9 SRC_FILES += $(shell find $(CUR_DIR) -name *.cc) \10 += $(shell find $(CU

经典基础面试题-程序员宅基地

最近发现自己好多原来学过的东西都忘记了,是时候该补补复习一下了。先来几个题目问下自己。(1)字符串里的查找用什么算法?(2)Dijstra算法(3)红黑树(4)有这样一个数据结构:有一个新定义的队列结构,可以push和pop,你还可以知道这个数据结构里的最小值是多少。所有操作(push、pop和得出最小值)都要在常数时间内完成。请你设计这个数据结构。 (5)怎样在1000000

Python拼接字符串的7种方法总结_format_str:str='--->'.join(words); ^ syntaxerror: -程序员宅基地

前言忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串。相信不少同学会有同感。在Python中,我们经常会遇到字符串的拼接问题,几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型。而拼接字符串是必备的一种技能。今天,我跟大家一起来学习Python拼接字符串的七种方式。下面话不多说了,来一起看看详细的介绍吧1、来自C语言的%方式print(’%s %..._format_str:str='--->'.join(words); ^ syntaxerror: invalid syntax

Windows环境下编译Bundler,CMVS,PMVS(补充)_windows cmvs-pmvs-程序员宅基地

首先引入在CYGWIN平台上使用Bundlerhttp://blog.csdn.net/u010922186/article/details/41845485,该博客已经很详细的介绍了Windows环境下编译Bundler,CMVS,PMVS,个人在编译过程中,就出现的一些问题做一些补充。_windows cmvs-pmvs

python 用户登录程序-程序员宅基地

"""用户登陆程序需求: 1. 输入用户名和密码; 2. 判断用户名和密码是否正确? (name='root', passwd='westos') 3. 为了防止暴力破解, 登陆仅有三次机会, 如果超过三次机会, 报错提示;""" # 为了让登陆代码循环三次for i in range(3): name = input("用户名:") pa...

安装mongodb4.x版本的坑[windows]_mogodb 4.x 版本需要什么jar-程序员宅基地

在4.x的版本中,使用自定义安装无法成功!不考虑磁盘空间的话,直接默认下去就行。下面给出...一定程度上自定义的方法1.首选选择complete到下面界面中,把这两个目录改到非C盘下。注意一定要根目录,非根目录还是会出现和自定义安装一样的问题。后面的一路next就ok了。最后检查服务中安装成功。..._mogodb 4.x 版本需要什么jar

随便推点

NX机电概念设计学习笔记(2)碰撞传感器 传输面 发送器入口出口 变换器_nx碰撞传感器和碰撞体如何实现控制-程序员宅基地

碰撞传感器:当有物体与传感器发生碰撞时产生反应碰撞传感器设置方式:点击碰撞体传感器,选择要设置为传感器的对象,选择形状,指示线为碰撞范围,如果需要传感器有更大的范围可以手动更改形状属性。选择自定义,指定点为圆柱面圆心,高度100mm,还可以通过点对话框继续调整点的位置传输面:赋予碰撞体功能,使传输面上的刚体发生移动。传输面设置方式:需要先将物体设置为碰撞体,点击传输面,选择面,选择矢量方向,设置速度。对象源:生成物体(及刚体)对象源设置..._nx碰撞传感器和碰撞体如何实现控制

2019高交会智慧医疗健康展探寻未来医疗五大趋势_医疗健康 展会分析-程序员宅基地

中国公益在线深圳11月14日电(张强)了解中国大健康产业发展,紧跟5G智慧医疗、AI+医疗、可穿戴医疗、医疗大数据、医疗机器人、智慧养老等医疗行业热点,由博闻创意会展统筹组织的“第二十一届高交会智慧医疗健康展”,汇聚了医疗行业知名品牌及全球买家,重点展示国内外企业在智慧医疗以及大健康领域的突破。中国智慧医疗的市场需求正不断扩大。据预测,2020年中国智慧医疗市场规模将超过1000亿元人民币..._医疗健康 展会分析

利用PCL库构建Mesh三维模型-程序员宅基地

利用PCL库,简简单单地构建一个Mesh三维模型。从输入左右影像和相机内参开始,输出Mesh模型。_mesh三维模型

AndroidHttp通信 HTTP Client与HttpURLConnection的区别-程序员宅基地

转:http://blog.csdn.net/xyz_lmn/article/details/12200133分类: android 网络编程2013-10-08 18:53 4782人阅读 评论(6) 收藏 举报目录(?)[+]Apache HTTP Client DefaultHttpClient

IOS控件学习:UILabel常用属性与用法-程序员宅基地

#import "ViewController.h"#import @interface ViewController ()@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad]; //学习内容 /* 1.控件 UIView UILabel UITex

L0090 Pairwise average candidates 提案和代码阅读-程序员宅基地

提案内容:从当前merge list 里面拿出几对求平均,结果放入list中,替代HEVC中的联合MV?。例如{(0, 1), (0, 2), (1, 2), (0, 3), (1, 3), (2, 3)}。每一个参考帧list的mv是分别计算的,这一对mv分以下几种情况: 1.两个mv都可用,求平均; 2.只有一个mv可用,用该mv; 3.无mv可用,禁止。结果:长度分为6,8,10,在RA CLASS D& F 上约有0.5%的bit-rate节省,在LB上cl...

推荐文章

热门文章

相关标签