innodb_file_format Barracuda

25

Saya punya beberapa pertanyaan untuk mereka yang lebih akrab. Sebagian besar contoh saya menjalankan Antelope meskipun memiliki dukungan untuk Barracuda.

Saya ingin bermain-main dengan beberapa meja innodb kompres. Pemahaman saya adalah ini hanya tersedia dalam format Barracuda.

  1. Saya melihat innodb_file_format dinamis sehingga saya bisa beralih tanpa bouncing. Adakah implikasi melakukan hal ini yang harus saya waspadai. Yang bisa saya katakan adalah itu berarti tabel baru atau diubah kemudian akan dibuat dengan format itu. Apakah ini semua benar?
  2. Saya berharap tidak harus melalui dan mengubah semua tabel saya. Apakah halal memiliki meja antelope dan barracude hidup berdampingan dalam tablespace yang sama? Bahkan jika itu berhasil, apakah ada gotcha yang harus diwaspadai?

Dari apa yang saya baca dan kumpulkan dari tes saya jawabannya adalah: Ya. Iya nih. Saya tidak yakin.

Memperbarui

Saya sudah menjalankan w / beberapa Dynamic dan beberapa tabel Terkompresi dalam berbagai kasus sejak posting ini tanpa masalah. Selanjutnya saya lalai membaca http://dev.mysql.com/doc/refman/5.5/en/innodb-file-format-identifying.html pada saat itu.

Setelah Anda mengaktifkan innodb_file_format, perubahan ini hanya berlaku untuk tabel yang baru dibuat dan bukan yang sudah ada. Jika Anda benar-benar membuat tabel baru, tablespace yang berisi tabel ditandai dengan format file "paling awal" atau "paling sederhana" yang diperlukan untuk fitur-fitur tabel. Misalnya, jika Anda mengaktifkan format file Barracuda, dan membuat tabel baru yang tidak dikompresi dan tidak menggunakan ROW_FORMAT = DYNAMIC, tablespace baru yang berisi tabel ditandai dengan menggunakan format file Antelope.

Jadi tabel akan dibuat sebagai Antelope bahkan jika Anda mengizinkan Barracuda. Pencampuran tidak dapat dihindari kecuali Anda menentukan setiap tabel sebagai row_format dinamis atau tabel terkompresi.

Tidak ada indikasi Anda harus melakukan dump dan reload lengkap ketika memperkenalkan tabel Barracuda pertama Anda (seperti yang disarankan saat meningkatkan versi utama mysql )

atxdba
sumber

Jawaban:

18

Jadi saya menjawab pertanyaan ini hampir terlambat 4 tahun:

  • Format file InnoDB disusun pada saat InnoDB independen dari Server MySQL (misalnya: MySQL 5.1 dapat menjalankan dua versi InnoDB yang berbeda).

  • Alasan mengapa Anda tidak ingin menjalankan Barracuda (pada 2012) adalah karena dapat mengurangi fleksibilitas dalam menurunkan versi MySQL (yaitu setelah upgrade gagal, Anda ingin kembali ke versi yang tidak dapat membaca format yang lebih baru). yaitu seharusnya tidak ada alasan teknis mengapa Antelope lebih baik.

  • Di MySQL 5.7 innodb_file_formatopsi tidak digunakan lagi. Karena MySQL dan InnoDB tidak lagi independen, dan dengan demikian InnoDB dapat menggunakan aturan upgrade MySQL dan kompatibilitas apa yang diperlukan. Tidak diperlukan pengaturan yang membingungkan!

  • Di MySQL 5.7, default beralih ke Barracuda/DYNAMIC. Karena semua rilis MySQL yang didukung saat ini dapat membaca format ini, aman untuk menjauh dari Antelope dan masih menawarkan penurunan versi.

  • Pada server MySQL 5.7, tabel Antelope akan ditingkatkan ke Barracuda/DYNAMICtabel yang akan dibangun kembali (OPTIMIZE TABLE dll). Itu kecuali mereka dibuat secara khusus ROW_FORMAT=oldrowformat.

  • Di MySQL 8.0, opsi innodb_file_formatdihapus.


MySQL 5.7 juga memperkenalkan opsiinnodb_default_row_format , yang standarnya adalah DINAMIK. Ini membahas poin dalam pembaruan Anda.

Morgan Tocker
sumber
11
Just give a try!!!

mysql> select version();
+------------+
| version()  |
+------------+
| 5.5.21-log |
+------------+
1 row in set (0.00 sec)

mysql> show variables like "%innodb_file%";
+--------------------------+----------+
| Variable_name            | Value    |
+--------------------------+----------+
| innodb_file_format       | Antelope |
| innodb_file_format_check | ON       |
| innodb_file_format_max   | Antelope |
| innodb_file_per_table    | ON       |
+--------------------------+----------+
4 rows in set (0.00 sec)

mysql> SET GLOBAL innodb_file_format = barracuda;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%innodb_file%";
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Barracuda |
| innodb_file_format_check | ON        |
| innodb_file_format_max   | Antelope  |
| innodb_file_per_table    | ON        |
+--------------------------+-----------+
4 rows in set (0.00 sec)

mysql> SET GLOBAL innodb_file_format_max = barracuda;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like "%innodb_file%";
+--------------------------+-----------+
| Variable_name            | Value     |
+--------------------------+-----------+
| innodb_file_format       | Barracuda |
| innodb_file_format_check | ON        |
| innodb_file_format_max   | Barracuda |
| innodb_file_per_table    | ON        |
+--------------------------+-----------+
4 rows in set (0.00 sec)

I had observed a single line logged in Error Log file :

[root@dhcppc0 Desktop]# tail -1 /usr/local/mysql/data/dhcppc0.err
120402 11:26:52 [Info] InnoDB: the file format in the system tablespace is
now set to Barracuda.

After switching to barracuda file format, I could also access my Database
and tables without any error :

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| opentaps1          |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use opentaps1;
Database changed
mysql> select count(*) from product;
+----------+
| count(*) |
+----------+
|     3244 |
+----------+
1 row in set (0.42 sec)

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

mysql> show engine innodb status\G
*************************** 1. row ***************************
Type: InnoDB
Name:
Status: 
=====================================
120402 11:36:29 INNODB MONITOR OUTPUT
=====================================
Per second averages calculated from the last 18446744073709534037 seconds
-----------------
BACKGROUND THREAD
-----------------
srv_master_thread loops: 12 1_second, 12 sleeps, 1 10_second, 2 background,
2 flush
srv_master_thread log flush and writes: 12
----------
SEMAPHORES
----------
OS WAIT ARRAY INFO: reservation count 5, signal count 5
Mutex spin waits 2, rounds 60, OS waits 2
RW-shared spins 3, rounds 90, OS waits 3
RW-excl spins 0, rounds 0, OS waits 0
Spin rounds per wait: 30.00 mutex, 30.00 RW-shared, 0.00 RW-excl
------------
TRANSACTIONS
------------
Trx id counter F01
Purge done for trx's n:o < 0 undo n:o < 0
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION F00, not started
MySQL thread id 1, OS thread handle 0x7f38309f9710, query id 28 localhost
root
show engine innodb status
--------
FILE I/O
--------
I/O thread 0 state: waiting for completed aio requests (insert buffer
thread)
I/O thread 1 state: waiting for completed aio requests (log thread)
I/O thread 2 state: waiting for completed aio requests (read thread)
I/O thread 3 state: waiting for completed aio requests (read thread)
I/O thread 4 state: waiting for completed aio requests (read thread)
I/O thread 5 state: waiting for completed aio requests (read thread)
I/O thread 6 state: waiting for completed aio requests (write thread)
I/O thread 7 state: waiting for completed aio requests (write thread)
I/O thread 8 state: waiting for completed aio requests (write thread)
I/O thread 9 state: waiting for completed aio requests (write thread)
Pending normal aio reads: 0 [0, 0, 0, 0] , aio writes: 0 [0, 0, 0, 0] ,
ibuf aio reads: 0, log i/o's: 0, sync i/o's: 0
Pending flushes (fsync) log: 0; buffer pool: 0
554 OS file reads, 7 OS file writes, 7 OS fsyncs
-0.01 reads/s, 16384 avg bytes/read, -0.00 writes/s, -0.00 fsyncs/s
-------------------------------------
INSERT BUFFER AND ADAPTIVE HASH INDEX
-------------------------------------
Ibuf: size 1, free list len 0, seg size 2, 0 merges
merged operations:
insert 0, delete mark 0, delete 0
discarded operations:
insert 0, delete mark 0, delete 0
Hash table size 276707, node heap has 15 buffer(s)
-0.15 hash searches/s, -0.12 non-hash searches/s
---
LOG
---
Log sequence number 221536390
Log flushed up to   221536390
Last checkpoint at  221536390
0 pending log writes, 0 pending chkp writes
10 log i/o's done, -0.00 log i/o's/second
----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 137363456; in additional pool allocated 0
Dictionary memory allocated 3476070
Buffer pool size   8192
Free buffers       7635
Database pages     542
Old database pages 220
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 0, not young 0
-0.00 youngs/s, -0.00 non-youngs/s
Pages read 542, created 0, written 1
-0.01 reads/s, -0.00 creates/s, -0.00 writes/s
Buffer pool hit rate 980 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead -0.00/s, evicted without access -0.00/s, Random read ahead
-0.00/s
LRU len: 542, unzip_LRU len: 0
I/O sum[0]:cur[238], unzip sum[0]:cur[0]
--------------
ROW OPERATIONS
--------------
0 queries inside InnoDB, 0 queries in queue
1 read views open inside InnoDB
Main thread process no. 2937, id 139879303665424, state: waiting for server
activity
Number of rows inserted 0, updated 0, deleted 0, read 3244
-0.00 inserts/s, -0.00 updates/s, -0.00 deletes/s, -0.18 reads/s
----------------------------
END OF INNODB MONITOR OUTPUT
============================
1 row in set (0.00 sec)
Gopinath
sumber
9

Jika Anda benar-benar ingin bermain dengan InnoDB menggunakan format Barracuda, Anda harus mysqldump semuanya menjadi sesuatu seperti /root/MySQLData.sql. Itu membuat format file data independen.

Gunakan instance MySQL lain dengan ibdata1 baru dan innodb_file_per_table (opsional, preferensi pribadi saya). Ubah format file dengan ibdata1 kosong. Kemudian, muat ulang /root/MySQLData.sql dan mainkan dengan datanya.

Saya telah mendengar sedikit cerita horor tentang PostgreSQL harus mengubah pengaturan untuk mendapatkan database 8.2.4 agar dapat bekerja dengan 9.0.1 binari. Kisah yang sama bisa berlaku jika kita mencoba membuat kedua format file berada di tablespace sistem yang sama (ibdata1) dan / atau .ibdfile jika kita mengetahui pengaturan tersebut.

Sejauh menjadi halal ...

  • Tidak seorang pun harus menyimpan daging dan susu di kulkas yang sama
  • Tidak seorang pun harus meletakkan seekor lembu jantan dan seekor keledai di bawah kuk yang sama (Ulangan 22:10)
  • Tidak seorang pun harus menyimpan Antelopedan Barracudadi dalam ibdata1 yang sama

UPDATE 2013-07-05 14:26 EDT

Saya baru saja menjawab pertanyaan ini di ServerFault: Mengatur Kompresi MySQL INNODB KEY_BLOCK_SIZE . Ini membuat saya melihat ke belakang untuk setiap pertanyaan yang saya jawab di DBA StackExchange telah membahas Barracudaformat dan saya menemukan posting lama saya ini. Saya akan menempatkan informasi yang sama di sini ...

Menurut Dokumentasi MySQL tentang InnoDB Compression untuk Barracuda

Kompresi dan Pool Buffer InnoDB

Dalam tabel InnoDB terkompresi, setiap halaman terkompresi (apakah 1K, 2K, 4K atau 8K) sesuai dengan halaman terkompresi 16K byte. Untuk mengakses data dalam sebuah halaman, InnoDB membaca halaman yang dikompresi dari disk jika belum ada di buffer pool, kemudian membuka kompres halaman ke bentuk 16K byte aslinya. Bagian ini menjelaskan bagaimana InnoDB mengelola kumpulan buffer sehubungan dengan halaman tabel terkompresi.

Untuk meminimalkan I / O dan untuk mengurangi kebutuhan untuk membuka kompresi halaman, terkadang buffer pool berisi bentuk halaman database yang terkompresi dan tidak terkompresi. Untuk memberikan ruang bagi halaman database lain yang diperlukan, InnoDB dapat “mengusir” dari buffer pool halaman yang tidak terkompresi, sambil meninggalkan halaman yang dikompresi dalam memori. Atau, jika halaman belum diakses untuk sementara waktu, bentuk halaman yang dikompres dapat ditulis ke disk, untuk mengosongkan ruang untuk data lainnya. Dengan demikian, pada waktu tertentu, kumpulan buffer dapat berisi bentuk halaman terkompresi dan tidak terkompresi, atau hanya bentuk halaman terkompresi, atau keduanya.

InnoDB melacak halaman mana yang harus disimpan dalam memori dan yang akan diusir menggunakan daftar (LRU) yang paling baru-baru ini digunakan, sehingga data yang "panas" atau sering diakses cenderung tetap berada dalam memori. Ketika tabel terkompresi diakses, InnoDB menggunakan algoritma LRU adaptif untuk mencapai keseimbangan yang tepat dari halaman terkompresi dan tidak terkompresi dalam memori. Algoritma adaptif ini sensitif terhadap apakah sistem berjalan dengan cara I / O-terikat atau CPU-terikat. Tujuannya adalah untuk menghindari menghabiskan terlalu banyak waktu pemrosesan halaman yang tidak dikompres ketika CPU sedang sibuk, dan untuk menghindari melakukan kelebihan I / O ketika CPU memiliki siklus cadangan yang dapat digunakan untuk membuka halaman terkompresi (yang mungkin sudah ada dalam memori). Ketika sistem terikat I / O, algoritma lebih memilih untuk mengusir salinan halaman yang tidak terkompresi daripada kedua salinan, untuk membuat lebih banyak ruang bagi halaman disk lain untuk menjadi penghuni memori. Ketika sistem terikat dengan CPU, InnoDB lebih memilih untuk mengusir halaman terkompresi dan tidak terkompresi, sehingga lebih banyak memori dapat digunakan untuk halaman "panas" dan mengurangi kebutuhan untuk membuka kompresi data dalam memori hanya dalam bentuk terkompresi.

Perhatikan bahwa Penyangga InnoDB Pool harus memuat halaman data dan halaman indeks dibaca untuk memenuhi permintaan. Saat membaca tabel dan indeksnya untuk pertama kali, halaman yang dikompresi harus tidak dikompresi hingga 16K. Itu berarti Anda akan memiliki konten data dua kali lebih banyak di kumpulan buffer, halaman data terkompresi dan tidak terkompresi.

Jika duplikasi konten data ini terjadi di Buffer Pool, Anda perlu meningkatkan innodb_buffer_pool_size dengan faktor linier kecil tingkat kompresi baru. Begini caranya:

SKENARIO

  • Anda memiliki DB Server dengan Kelompok Penyangga 8G
  • Anda menjalankan kompresi dengan key_block_size=8
    • 8adalah 50.00%dari16
    • 50.00%dari 8Gadalah4G
    • naikkan innodb_buffer_pool_sizeke 12G( 8G+ 4G)
  • Anda menjalankan kompresi dengan key_block_size=4
    • 4adalah 25.00%dari16
    • 25.00%dari 8Gadalah2G
    • naikkan innodb_buffer_pool_sizeke 10G( 8G+ 2G)
  • Anda menjalankan kompresi dengan key_block_size=2
    • 2adalah 12.50%dari16
    • 12.50%dari 8Gadalah1G
    • naikkan innodb_buffer_pool_sizeke 9G( 8G+ 1G)
  • Anda menjalankan kompresi dengan key_block_size=1
    • 1adalah 06.25%dari16
    • 06.25%dari 8Gis 0.5G( 512M)
    • naikkan innodb_buffer_pool_sizeke 8704M( 8G( 8192M) + 512M)

MORAL CERITA : Pool Buffer InnoDB hanya membutuhkan ruang bernapas tambahan saat menangani data terkompresi dan halaman indeks.

RolandoMySQLDBA
sumber