ınformatıon_schema veritabanı BELLEK depolama motorunu kullanarak geçici tablolar oluşur.
Örnek: İşte MySQL 5.5.12'deki (Windows Sürümü) BİLGİ_SCHEMA.TABLES tablosu
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)
Bu tablolar için fiziksel klasör yoktur, .frm dosyaları bile yoktur. Bunu mysqldump yapamazsınız. Düşüremezsin. Tablo ekleyemezsiniz. Tabloları ondan bırakamazsınız. Peki, tablolar nerede ???
BİLGİ_SCHEMA veritabanındaki tüm tablolar doğrudan bellekte MEMORY depolama motoru tabloları olarak saklanır. Bunlar tamamen MySQL'in içindedir, bu nedenle .frm mekanizmaları mysqld'de işlenir. Cevabımda, ilk olarak BİLGİ_SCHEMA.TABLES tablo düzenini gösterdim. Bellekte geçici bir tablo. Depolama motoru protokolleri kullanılarak manipüle edilir. Böylece, mysqld kapatıldığında, tüm information_schema tabloları bırakılır. Mysqld başlatıldığında, tüm information_schema tabloları TEMPORARY tabloları olarak oluşturulur ve mysql örneğindeki her tablo için meta verilerle yeniden doldurulur.
Informatıon_schema veritabanı önce size diğer depolama motorlarının tablolar hakkında meta verilere erişim sağlamak için MySQL 5.0 tanıtıldı. Örneğin, veritabanlarının bir listesini almak için VERİTABANLARI GÖSTER yapabilirsiniz . Bunları şu şekilde de sorgulayabilirsiniz:
SELECT schema_name database FROM information_schema.schemata;
Bir veritabanındaki tablo adlarını iki şekilde alabilirsiniz:
use mydb
show tables;
veya
SELECT table_name from information_schema.tables WHERE table_schema = 'mydb';
Kuruluşundan bu yana, MySQL BİLGİ_SCHEMA veritabanını (MySQL 5.1 itibariyle) işlem listesine sahip olacak şekilde genişletmiştir. Aslında en az 10 dakika çalışmakta olan uzun süren sorgular arayan işlem listesini sorgulayabilirsiniz:
SELECT * FROM information_schema.processlist WHERE time >= 600\G
Her ayrıntılı şeyi yapmak için BİLGİ_SCHEMA'yı kullanabilirsiniz: örneğin:
Belirli depolama motorlarını kullanarak tüm tabloların sayısını alın:
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;
MB olarak önerilen MyISAM Anahtar Arabellek Boyutunu alın
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;
GB cinsinden önerilen InnoDB Buffer Pool Size'i edinin
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;
MB ile Depolama Motoruna Göre Tüm Veritabanlarının Disk Kullanımını Alın
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;
İnanın bana, daha fazla tartışmama izin vermeyen BİLGİ_SCHEMA için daha harika kullanımlar var.
BİLGİ_SCHEMA'nın mysql çalışıyorsa ve aşağıdakileri yaparsanız o kadar hassas olduğunu lütfen unutmayın:
cd /var/lib/mysql
mkdir junkfolder
ve sonra mysql run içine gitmek
mysql> SHOW DATABASES;
Önemsiz klasörü veritabanlarından biri olarak göreceksiniz.
Bunun DBA'lar ve Geliştiriciler için çok hayati olduğunu bilmek. MySQL 5.0 Sertifikasyon Çalışması Kılavuzu kitabının Bölüm 20 (geliştiricileri) ve Bölüm 31 (DBA'lar)
Geliştirici ve DBA Sertifikasyon Sınavlarına hazırlanmak için oradalar. Kitabı alın, bu bölümleri iyi inceleyin ve MySQL'in BİLGİ_SCHEMA'sı ile harika şeyler yapabilirsiniz.
MySQL 5.5 sürümünden BİLGİ_SCHEMA veritabanı şimdi eklentiler, global değişkenler (durum ve statik), oturum değişkenleri (durum ve statik), depolama motoru durumu, performans ölçütleri enstrümantasyonu, tetikleme haritası, olaylar (programlanabilir) ve çok daha fazlasını içerir.
Maalesef bu WTMI gibi görünebilir, ancak BİLGİ_SCHEMA veritabanını kullanmanın büyük bir savunucusuyum.