zoukankan      html  css  js  c++  java
  • InnoDB 存储引擎简介

    InnoDB 核心特性

    MVCC(Multi-Version Concurrency Control,多版本并发控制),事务处理,行级锁,热备份,自动故障恢复( Crash Safe Recovery)

    存储引擎相关命令

    查看默认存储引擎

    # 查看当前数据库配置的存储引擎
    mysql> SELECT @@default_storage_engine;
    +--------------------------+
    | @@default_storage_engine |
    +--------------------------+
    | InnoDB                   |
    +--------------------------+
    1 row in set (0.00 sec)
    

    查看表的存储引擎

    # 查看哪些表时innodb存储引擎
    mysql> select TABLE_SCHEMA,TABLE_Name,ENGINE from tables where ENGINE='innodb';
    
    # 查看哪些表时myisam存储引擎
    mysql> select TABLE_SCHEMA,TABLE_Name,ENGINE from tables where ENGINE='myisam';
    
    # 查看表信息
    mysql> select * from information_schema.tables where table_name='test11'G
    # 查看指定表的存储引擎
    mysql> show create table city;
    
    # 查看列信息
    mysql> select * from COLUMNS where COLUMN_NAME='name'G
    

    修改存储引擎

    # 临时设置
    mysql> set @@default_storage_engine=myisam;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> SELECT @@default_storage_engine;
    +--------------------------+
    | @@default_storage_engine |
    +--------------------------+
    | MyISAM                   |
    +--------------------------+
    1 row in set (0.00 sec)
    
    # 永久修改
    [root@db03 mysql]# vim /etc/my.cnf
    [mysqld]
    default_storage_engine=myisam
    
    #建表时指定存储引擎
    mysql> create table innodb(id int) ENGINE=innodb;
    

    InnoDB 表空间介绍

    MySQL5.5 版本以后出现共享表空间概念,表空间的管理模式的出现是为了数据库的存储更容易扩展,MySQL5.6 版本中默认的是独立表空间

    共享表空间(ibdata1)

    对于系统创建的表,会采用此种模式,此外还存储着临时表、事务日志等信息

    存储的内容

    • 系统表结构,表数据
    • undo log
    • InooDB 表结构,即使存储到独立表空间的数据表,也会将表结构存放一份到共享表空间
    • 临时表数据

    优点
    可以将表空间分成多个文件存放到各个磁盘上(表空间文件大小不受表大小的限制,如一个表可以分布在不同的文件上)。数据和文件放在一起方便管理。

    缺点
    所有的数据和索引存放到一个文件中,虽然可以把一个大文件分成多个小文件,但是多个表及索引在表空间中混合存储,这样对于一个表做了大量删除操作后表空间中将会有大量的空隙,特别是对于统计分析,日值系统这类应用最不适合用共享表空间。

    配置共享表空间

    # 将共享表空间分开存储, 配置 autoextend,自动扩展 ibdata2 文件大小
    [root@db03 data]# vim /etc/my.cnf
    [mysqld]
    innodb_data_file_path=ibdata1:76M;tmp/ibdata2:50M:autoextend
    

    查看共享表空间

    mysql> show variables like '%path%';
    +----------------------------------+----------------------------------------+
    | Variable_name                    | Value                                  |
    +----------------------------------+----------------------------------------+
    | innodb_data_file_path            | ibdata1:76M;tmp/ibdata2:50M:autoextend |
    

    独立表空间

    对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理

    优点:每个表都有自己独立的表空间,数据分开存储

    缺点:单表空间不能过大,不能大于100G

    # 独立表空间的文件存储方式
    [root@db01 ~]# ll /application/mysql/data/world/
    -rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd
    
    # 命令行查看是否开启独立表空间
    mysql> show variables like '%per_table%';
    innodb_file_per_table=ON
    

    企业案例(InnoDB 表结构需要存储到共享表空间)

    模拟断电,数据表损坏

    # 1.将db03上的数据库数据目录下的 world传到一台新数据库的数据目录下
    [root@db03 data]# scp -r world 172.16.1.52:/usr/local/mysql/data/
    
    # 2.到db02上授权目录
    [root@db02 data]# chown -R mysql.mysql world/
    
    # 3.登录数据库查看,数据已损坏
    mysql> show tables;
    +-----------------+
    | Tables_in_world |
    +-----------------+
    | city            |
    | country         |
    | countrylanguage |
    +-----------------+
    11 rows in set (0.00 sec)
    
    mysql> select * from city;
    ERROR 1146 (42S02): Table 'world.city' doesn't exist
    

    修复数据表

    # 1.找到建表语句,创建一个新表
    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 `inx_name` (`Name`),
      KEY `index_popu` (`Population`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;
    
    # 2.移除新表的表空间
    mysql> alter table city_new discard tablespace;
    Query OK, 0 rows affected (0.09 sec)
    
    # 3.损坏表空间的数据文件复制给新表
    [root@db02 world]# cp city.ibd city_new.ibd
    [root@db02 world]# chown -R mysql.mysql city_new.ibd
    
    # 4.新表读取表空间
    mysql> alter table city_new import tablespace;
    Query OK, 0 rows affected, 1 warning (0.22 sec)
    
    # 5.运维修改数据库名
    # 删除表空间
    mysql> drop table city;
    ERROR 1051 (42S02): Unknown table 'world.city'
    # 物理删除表数据
    [root@db02 world]# rm city.ibd 
    rm: remove regular file ‘city.ibd’? y
    # 数据库改名
    mysql> alter table city_new rename city;
    Query OK, 0 rows affected (0.11 sec)
    
    记录成长过程
  • 相关阅读:
    C#泛型
    C#接口
    C#委托和事件
    Unity Ray 射线
    C#学习基础
    Graph | Eulerian path
    Careercup | Chapter 8
    Leetcode | Pow(x, n)
    Leetcode | Gray code
    分布式缓存
  • 原文地址:https://www.cnblogs.com/zzzwqh/p/13347959.html
Copyright © 2011-2022 走看看