Глубокое понимание mysql ---- инструмент innodb_ruby

MySQL

учебник по гитхабу

innodb_ruby может в основном просматривать различные хранилища таблиц данных базы данных innodb, анализировать файлы innodb и изучать некоторое хранилище в нижней части базы данных.

Процесс установки

sudo gem install innodb_ruby

gem install --user-install innodb_ruby

innodb_space --help # 测试一下可以显示一堆帮助不

try see see

1. Проверьте, где находятся файлы хранилища вашей базы данных

mysql> show global variables like "%datadir%";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| datadir       | /var/lib/mysql/ |
+---------------+-----------------+
1 row in set (0.00 sec)

2. Войдите в каталог базы данных

Поскольку многие из следующих команд должны заполнить путь к файлу таблицы данных, каждый раз он пишется долго, я думаю, что это пустая трата времени, поэтому я сначала вхожу в каталог базы данных. Вы можете пропустить этот шаг.Когда вам нужно будет указать путь позже, можно указать абсолютный путь.

cd /var/lib/mysql/

3. Будьте готовы

Перестроить базу данных

mysql -uroot -p
mysql> create database test
mysql> use test

4. Различные команды имеют различные

опции

-f 加载表空间,如ibd文件
-s 加载系统表空间,如ibd
-T 指定表名
-I 指定索引名

Сначала создайте простую таблицу

mysql> CREATE TABLE innodb_ruby(
    c1 INT,
    c2 INT,
    c3 VARCHAR(10000),
    PRIMARY KEY (c1), 
    key idx(c2)
) CHARSET=ascii ROW_FORMAT=Compact;
Query OK, 0 rows affected (0.36 sec)

вставить данные

mysql> INSERT INTO innodb_ruby VALUES(1, 1, repeat('a', 7000)), (2, 2, repeat('b', 7000)), (3, 3, repeat('c', 7000)), (4, 4, repeat('d', 7000));
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

файловая структура системы

  1. Перечислите количество всех физических объектов.
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 system-spaces
name                            pages       indexes     
(system)                        8832        204
test/innodb_ruby                              2
...
  1. Список всей статистики индексов в табличном пространстве (системное пространство или табличное пространство для каждого файла)
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby space-indexes
id          name                            root        fseg        used        allocated   fill_factor 
94684       PRIMARY                         3           internal    1           1           100.00%     
94684       PRIMARY                         3           leaf        3           3           100.00%     
94685       idx                             4           internal    1           1           100.00%     
94685       idx                             4           leaf        0           0           0.00%  

id: идентификатор этого индекса

имя: имя индекса. PRIMARY представляет кластеризованный индекс, поскольку таблица InnoDB является кластеризованной таблицей, организованной индексом, а запись строки является кластеризованным индексом; idx — это имя вспомогательного индекса.

root: номер страницы корневого узла в индексе.

fseg: тип страницы. внутренний нелистовой узел; листовой листовой узел

used: страница, используемая индексом.

выделено: Страницы, выделенные индексом.

fill_factor: процент, используемый индексом

  1. Подсчитайте, сколько страниц каждый тип страницы занимает в общей сложности
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby space-page-type-regions
start       end         count       type                
0           0           1           FSP_HDR             
1           1           1           IBUF_BITMAP         
2           2           1           INODE               
3           7           5           INDEX               
8           8           1           FREE (ALLOCATED)
  1. Распечатайте общее количество страниц для каждого типа
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby space-page-type-summary
type                count       percent     description         
INDEX               5           55.56       B+Tree index        
FSP_HDR             1           11.11       File space header   
IBUF_BITMAP         1           11.11       Insert buffer bitmap
INODE               1           11.11       File segment inode  
ALLOCATED           1           11.11       Freshly allocated
  1. Подсчитайте информацию о насыщении всех страниц в табличном пространстве, каждая страница отображает цветные блоки (цветные по индексу/назначению) и регулирует размер в соответствии с объемом данных на странице.
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby space-extents-illustrate

  1. Подсчитайте информацию о насыщении всех страниц в табличном пространстве, и каждая страница отобразит цветной блок (окрашенный в соответствии с возрастом измененного LSN страницы).
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby space-extents-illustrate

структура файла подкачки

  1. Объясните назначение одной страницы
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 3 page-account
Accounting for page 3:
  Page type is INDEX (B+Tree index, table and index data stored in B+Tree structure).
  Extent descriptor for pages 0-63 is at page 0, offset 158.
  Extent is not fully allocated to an fseg; may be a fragment extent.
  Page is marked as used in extent descriptor.
  Extent is in free_frag list of space.
  Page is in fragment array of fseg 1.
  Fseg is in internal fseg of index 94684.
  Index root is page 3.
  Index is test/innodb_ruby.PRIMARY.
  1. Распечатать информацию о структуре страницы
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 3 page-dump
#<Innodb::Page::Index:0x0000000000ef65a0>:

fil header:
{:checksum=>3506321879,
 :offset=>3,
 :prev=>nil,
 :next=>nil,
 :lsn=>25811855781,
 :type=>:INDEX,
 :flush_lsn=>0,
 :space_id=>2456}

fil trailer:
{:checksum=>1027768186, :lsn_low32=>42052005}

page header:
{:n_dir_slots=>2,
 :heap_top=>162,
 :garbage_offset=>0,
 :garbage_size=>0,
 :last_insert_offset=>154,
 :direction=>:right,
 :n_direction=>2,
 :n_recs=>3,
 :max_trx_id=>0,
 :level=>1,
 :index_id=>94684,
 :n_heap=>5,
 :format=>:compact}

fseg header:
{:leaf=>
  <Innodb::Inode space=<Innodb::Space file="test/innodb_ruby.ibd", page_size=16384, pages=9>, fseg=2>,
 :internal=>
  <Innodb::Inode space=<Innodb::Space file="test/innodb_ruby.ibd", page_size=16384, pages=9>, fseg=1>}

sizes:
  header           120
  trailer            8
  directory          4
  free           16210
  used             174
  record            42
  per record     14.00

page directory:
[99, 112]

system records:
{:offset=>99,
 :header=>
  {:next=>126,
   :type=>:infimum,
   :heap_number=>0,
   :n_owned=>1,
   :min_rec=>false,
   :deleted=>false,
   :length=>5},
 :next=>126,
 :data=>"infimum\x00",
 :length=>8}
{:offset=>112,
 :header=>
  {:next=>112,
   :type=>:supremum,
   :heap_number=>1,
   :n_owned=>4,
   :min_rec=>false,
   :deleted=>false,
   :length=>5},
 :next=>112,
 :data=>"supremum",
 :length=>8}

garbage records:

records:
{:format=>:compact,
 :offset=>126,
 :header=>
  {:next=>140,
   :type=>:node_pointer,
   :heap_number=>2,
   :n_owned=>0,
   :min_rec=>true,
   :deleted=>false,
   :nulls=>[],
   :lengths=>{},
   :externs=>[],
   :length=>5},
 :next=>140,
 :type=>:clustered,
 :key=>[{:name=>"c1", :type=>"INT", :value=>1}],
 :row=>[],
 :sys=>[],
 :child_page_number=>5,
 :length=>8}

{:format=>:compact,
 :offset=>140,
 :header=>
  {:next=>154,
   :type=>:node_pointer,
   :heap_number=>3,
   :n_owned=>0,
   :min_rec=>false,
   :deleted=>false,
   :nulls=>[],
   :lengths=>{},
   :externs=>[],
   :length=>5},
 :next=>154,
 :type=>:clustered,
 :key=>[{:name=>"c1", :type=>"INT", :value=>2}],
 :row=>[],
 :sys=>[],
 :child_page_number=>6,
 :length=>8}

{:format=>:compact,
 :offset=>154,
 :header=>
  {:next=>112,
   :type=>:node_pointer,
   :heap_number=>4,
   :n_owned=>0,
   :min_rec=>false,
   :deleted=>false,
   :nulls=>[],
   :lengths=>{},
   :externs=>[],
   :length=>5},
 :next=>112,
 :type=>:clustered,
 :key=>[{:name=>"c1", :type=>"INT", :value=>4}],
 :row=>[],
 :sys=>[],
 :child_page_number=>7,
 :length=>8}
  1. Совокупные записи страниц
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 3 page-records
Record 126: (c1=1) → #5
Record 140: (c1=2) → #6
Record 154: (c1=4) → #7

Каждая строка представляет собой страницу данных, c1=1 означает, что минимальное значение c1 равно 1, а #5 означает, что это 5-я страница.

  1. Просмотр записей каталога страниц
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 7 page-directory-summary
slot    offset  type          owned   key
0       99      infimum       1       
1       112     supremum      5       

Данные слишком малы, пожалуйста, введите больше данных

mysql> insert into innodb_ruby values(5,500,'eeee'), (6,600,'ffff'), (7, 700, 'gggg'), (8, 800, 'hhhh'), (9, 900, 'iiii'), (10, 1000, 'jjjj'), (11, 1100, 'kkkk'), (12, 1200, 'llll'), (13, 1300, 'mmmm'), (14, 1400, 'nnnn'), (15, 1500, 'oooo'), (16, 1600, 'pppp');
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 7 page-directory-summary
slot    offset  type          owned   key
0       99      infimum       1       
1       7220    conventional  4       (c1=7)
2       7348    conventional  4       (c1=11)
3       112     supremum      6

нижнее минимальное значение, верхнее максимальное значение, 1~8 Другие данные 4~8

  1. Детализируйте содержимое страницы
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 7 page-illustrate

структура индекса

  1. Пройдите все дерево B+, чтобы просмотреть индекс

индекс первичного ключа

root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -I PRIMARY index-recurse
ROOT NODE #3: 3 records, 42 bytes
  NODE POINTER RECORD ≥ (c1=1) → #5
  LEAF NODE #5: 1 records, 7029 bytes
    RECORD: (c1=1) → (c2=1, c3="aaa...")
  NODE POINTER RECORD ≥ (c1=2) → #6
  LEAF NODE #6: 2 records, 14058 bytes
    RECORD: (c1=2) → (c2=2, c3="bbb...")
    RECORD: (c1=3) → (c2=3, c3="ccc...")
  NODE POINTER RECORD ≥ (c1=4) → #7
  LEAF NODE #7: 13 records, 7413 bytes
    RECORD: (c1=4) → (c2=4, c3="ddd...")
    RECORD: (c1=5) → (c2=500, c3="eeee")
    RECORD: (c1=6) → (c2=600, c3="ffff")
    RECORD: (c1=7) → (c2=700, c3="gggg")
    RECORD: (c1=8) → (c2=800, c3="hhhh")
    RECORD: (c1=9) → (c2=900, c3="iiii")
    RECORD: (c1=10) → (c2=1000, c3="jjjj")
    RECORD: (c1=11) → (c2=1100, c3="kkkk")
    RECORD: (c1=12) → (c2=1200, c3="llll")
    RECORD: (c1=13) → (c2=1300, c3="mmmm")
    RECORD: (c1=14) → (c2=1400, c3="nnnn")
    RECORD: (c1=15) → (c2=1500, c3="oooo")
    RECORD: (c1=16) → (c2=1600, c3="pppp")

нормальный индекс

root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -I idx index-recurse
ROOT NODE #4: 16 records, 224 bytes
  RECORD: (c2=1) → (c1=1)
  RECORD: (c2=2) → (c1=2)
  RECORD: (c2=3) → (c1=3)
  RECORD: (c2=4) → (c1=4)
  RECORD: (c2=500) → (c1=5)
  RECORD: (c2=600) → (c1=6)
  RECORD: (c2=700) → (c1=7)
  RECORD: (c2=800) → (c1=8)
  RECORD: (c2=900) → (c1=9)
  RECORD: (c2=1000) → (c1=10)
  RECORD: (c2=1100) → (c1=11)
  RECORD: (c2=1200) → (c1=12)
  RECORD: (c2=1300) → (c1=13)
  RECORD: (c2=1400) → (c1=14)
  RECORD: (c2=1500) → (c1=15)
  RECORD: (c2=1600) → (c1=16)

Можно видеть, что обычный индекс фактически указывает непосредственно на индекс первичного ключа.

  1. Вывести смещение каждой записи на индексной странице
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -I PRIMARY index-record-offsets
page_offset         record_offset       
5                   128                 
6                   128                 
6                   7157                
7                   128                 
7                   7156                
7                   7188                
7                   7220                
7                   7252                
7                   7284                
7                   7316                
7                   7348                
7                   7380                
7                   7412                
7                   7444                
7                   7476                
7                   7508  
  1. Вывести сводную информацию для всех индексных страниц на заданном уровне.
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -I PRIMARY -l 0 index-level-summary
page    index   level   data    free    records min_key 
5       94684   0       7029    9223    1       c1=1
6       94684   0       14058   2194    2       c1=2
7       94684   0       7413    8835    13      c1=4
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -I PRIMARY -l 1 index-level-summary
page    index   level   data    free    records min_key 
3       94684   1       42      16210   3       c1=1

структура записи

  1. Учитывая смещение записи, вывести подробное описание записи и содержащихся в ней данных.
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 5 -R 128 record-dump
Record at offset 128

Header:
  Next record offset  : 112
  Heap number         : 2
  Type                : conventional
  Deleted             : false
  Length              : 8

System fields:
  Transaction ID: 2860579
  Roll Pointer:
    Undo Log: page 897, offset 272
    Rollback Segment ID: 34
    Insert: true

Key fields:
  c1: 1

Non-key fields:
  c2: 1
  c3: "aaaa..."

запись истории

  1. Показать журнал отмен для заданного смещения
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 -T test/innodb_ruby -p 5 -R 128 record-history
Transaction   Type                Undo record
(n/a)         insert              (c1=1) → ()
  1. Показать все измененные записи отмены
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 undo-history-summary
Page    Offset  Transaction   Type                Table
572     10435   2848487       delete              
...

Узнать больше

  1. Статистика табличного пространства
root@localhost:/var/lib/mysql$ innodb_space -s ibdata1 space-lists
name                length      f_page      f_offset    l_page      l_offset    
free                53          0           3318        0           3278        
free_frag           19          0           398         0           1238        
full_frag           3           0           158         0           2238        
full_inodes         1           2           38          2           38          
free_inodes         13          1789        38          595         38

Справочная статья:www.ywnds.com/?p=13677