Bagaimana INFORMATION_SCHEMA diterapkan di MySQL?


14

Secara teori, INFORMATION_SCHEMA adalah serangkaian pandangan yang ditentukan dalam standar SQL yang memungkinkan pengguna untuk memeriksa metadata sistem. Bagaimana ini diterapkan di MySQL?

Ketika saya terhubung ke instalasi baru saya melihat dua database: mysqldan information_schema. Setelah menggunakan SHOW CREATE TABLEpernyataan pada information_schemadatabase, sepertinya itu tidak diimplementasikan sebagai seperangkat pandangan tetapi dengan tabel dasar sebagai gantinya. Apakah asumsi ini benar? Atau ada tabel sistem lain yang disembunyikan dari pengguna?


Terima kasih banyak untuk +1 :) Satu klarifikasi terakhir. Setelah apa yang Anda katakan, apakah benar untuk menyatakan bahwa informasi metadata dibaca langsung dari file .frm aktual yang sesuai dengan tabel yang sebenarnya terwujud? Jadi ketika server melakukan boot, ia membaca info itu dari tabel dan membuat INFORMATION_SCHEMA. Kemudian jika ANALYZE TABLE atau INDEX CREATE atau secara umum pernyataan DDL dijalankan, INFORMATION_SCHEMA diperbarui sesuai?
ivotron

@ivotron: Ini benar !!! Ada tabel di INFORMATION_SCHEMA yang merekam perubahan skema seperti COLUMNS, STATISTICS, TABLE_CONSTRAINTS, dan sebagainya. Karena INFORMATION_SCHEMA semuanya ada dalam memori, perekaman semua perubahan DDL hampir seketika.
RolandoMySQLDBA

Jawaban:


30

Basis data INFORMATION_SCHEMA terdiri dari tabel sementara menggunakan mesin penyimpanan MEMORY.

Contoh: Ini adalah tabel INFORMATION_SCHEMA.TABLES di MySQL 5.5.12 (Versi Windows)

mysql> show create table information_schema.tables\G
*************************** 1. row ***************************
       Table: TABLES
Create Table: CREATE TEMPORARY TABLE `TABLES` (
  `TABLE_CATALOG` varchar(512) NOT NULL DEFAULT '',
  `TABLE_SCHEMA` varchar(64) NOT NULL DEFAULT '',
  `TABLE_NAME` varchar(64) NOT NULL DEFAULT '',
  `TABLE_TYPE` varchar(64) NOT NULL DEFAULT '',
  `ENGINE` varchar(64) DEFAULT NULL,
  `VERSION` bigint(21) unsigned DEFAULT NULL,
  `ROW_FORMAT` varchar(10) DEFAULT NULL,
  `TABLE_ROWS` bigint(21) unsigned DEFAULT NULL,
  `AVG_ROW_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `MAX_DATA_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `INDEX_LENGTH` bigint(21) unsigned DEFAULT NULL,
  `DATA_FREE` bigint(21) unsigned DEFAULT NULL,
  `AUTO_INCREMENT` bigint(21) unsigned DEFAULT NULL,
  `CREATE_TIME` datetime DEFAULT NULL,
  `UPDATE_TIME` datetime DEFAULT NULL,
  `CHECK_TIME` datetime DEFAULT NULL,
  `TABLE_COLLATION` varchar(32) DEFAULT NULL,
  `CHECKSUM` bigint(21) unsigned DEFAULT NULL,
  `CREATE_OPTIONS` varchar(255) DEFAULT NULL,
  `TABLE_COMMENT` varchar(2048) NOT NULL DEFAULT ''
) ENGINE=MEMORY DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

Tidak ada folder fisik untuk tabel itu, bahkan file .frm. Anda tidak dapat melakukan mysqldump. Anda tidak bisa menjatuhkannya. Anda tidak dapat menambahkan tabel ke dalamnya. Anda tidak dapat menjatuhkan tabel dari itu. Jadi, di mana tabelnya ???

Semua tabel dalam database INFORMATION_SCHEMA disimpan langsung di memori sebagai tabel mesin penyimpanan MEMORY. Mereka sepenuhnya internal untuk MySQL, sehingga mekanisme .frm ditangani di mysqld. Dalam jawaban saya, saya pertama kali menunjukkan tata letak tabel INFORMATION_SCHEMA.TABLES. Ini adalah tabel sementara di memori. Itu dimanipulasi menggunakan protokol mesin penyimpanan. Jadi, ketika mysqld dimatikan, semua tabel information_schema dihapus. Ketika mysqld dimulai, semua tabel information_schema dibuat sebagai tabel TEMPORARY dan diisi ulang dengan metadata untuk setiap tabel dalam instance mysql.

The INFORMATION_SCHEMA database yang pertama kali diperkenalkan pada MySQL 5.0 untuk memberikan akses ke metadata tentang tabel mesin penyimpanan lainnya. Misalnya, Anda bisa melakukan SHOW DATABASES untuk mendapatkan daftar basis data. Anda juga dapat meminta mereka seperti ini:

SELECT schema_name database FROM information_schema.schemata;

Anda bisa mengambil nama tabel dalam database dengan dua cara:

use mydb
show tables;

atau

SELECT table_name from information_schema.tables WHERE table_schema = 'mydb';

Sejak awal, MySQL telah memperluas database INFORMATION_SCHEMA untuk memiliki daftar proses (pada MySQL 5.1). Anda benar-benar dapat meminta daftar proses mencari kueri berjalan lama yang masih berjalan setidaknya 10 menit:

SELECT * FROM information_schema.processlist WHERE time >= 600\G

Anda dapat menggunakan INFORMATION_SCHEMA untuk melakukan setiap hal rumit: seperti:

Dapatkan jumlah semua tabel menggunakan mesin penyimpanan khusus:

SELECT COUNT(1) TableCount,IFNULL(engine,'Total') StorageEngine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','mysql')
AND engine IS NOT NULL
GROUP BY engine WITH ROLLUP;

Dapatkan Ukuran Penyangga Kunci MyISAM yang direkomendasikan dalam MB

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw<0,0,IF(pw>3,0,pw)))+0.49999),
SUBSTR(' KMG',IF(pw<0,0,IF(pw>3,0,pw))+1,1)) recommended_key_buffer_size
FROM (SELECT SUM(index_length) KBS FROM information_schema.tables WHERE
engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql')) A,
(SELECT 2 pw) B;

Dapatkan Ukuran Kolam Penyangga InnoDB yang disarankan dalam GB

SELECT CONCAT(ROUND(KBS/POWER(1024,IF(pw<0,0,IF(pw>3,0,pw)))+0.49999),
SUBSTR(' KMG',IF(pw<0,0,IF(pw>3,0,pw))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,(SELECT 3 pw) B;

Dapatkan Penggunaan Disk dari semua Database Dengan Mesin Penyimpanan dalam MB

SELECT Statistic,DataSize "Data Size",IndexSize "Index Size",TableSize "Table Size"
FROM (SELECT IF(ISNULL(table_schema)=1,10,0) schema_score,
IF(ISNULL(engine)=1,10,0) engine_score,
IF(ISNULL(table_schema)=1,'ZZZZZZZZZZZZZZZZ',table_schema) schemaname,
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=2,"Storage for All Databases",
IF(ISNULL(B.table_schema)+ISNULL(B.engine)=1,CONCAT("Storage for ",B.table_schema),
CONCAT(B.engine," Tables for ",B.table_schema))) Statistic,
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') DataSize,
CONCAT(LPAD(REPLACE(FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') IndexSize,
CONCAT(LPAD(REPLACE(FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') TableSize
FROM (SELECT table_schema,engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY table_schema,engine WITH ROLLUP) B,
(SELECT 2 pw) A) AA ORDER BY schemaname,schema_score,engine_score;

Percayalah, masih ada kegunaan yang lebih baik untuk INFORMATION_SCHEMA bahwa waktu tidak mengizinkan saya untuk membahas lebih lanjut.

Harap diingat bahwa INFORMATION_SCHEMA sangat sensitif sehingga jika mysql berjalan dan Anda melakukan hal berikut:

cd /var/lib/mysql
mkdir junkfolder

dan kemudian pergi ke jalankan mysql

mysql> SHOW DATABASES;

Anda akan melihat folder sampah sebagai salah satu basis data.

Mengetahui hal itu sangat vital bagi DBA dan Pengembang. Bab 20 (pengembang) dan Bab 31 (DBA) dari buku Panduan Studi Sertifikasi MySQL 5.0

masukkan deskripsi gambar di sini

hadir untuk mempersiapkan Ujian Sertifikasi Pengembang dan DBA. Dapatkan bukunya, pelajari bab-bab itu dengan baik, dan Anda bisa melakukan hal-hal hebat dengan INFORMATION_SCHEMA MySQL.

Database INFORMATION_SCHEMA pada MySQL 5.5, sekarang menampilkan plugin, variabel global (status dan statis), variabel sesi (status dan statis), status mesin penyimpanan, instrumentasi metrik kinerja, peta pemicu, peristiwa (dapat diprogram) dan banyak lagi.

Maaf ini mungkin tampak seperti WTMI tapi saya pendukung besar menggunakan database INFORMATION_SCHEMA.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.