BİLGİ_SCHEMA MySQL'de nasıl uygulanır?


14

BİLGİ_SCHEMA, teorik olarak, SQL standardında kullanıcının sistemin meta verilerini incelemesine izin veren bir dizi görünümdür. Bu MySQL'de nasıl uygulanır?

Yeni bir kuruluma bağlandığımda iki veritabanı görüyorum: mysqlve information_schema. Veritabanında SHOW CREATE TABLEifadeleri kullandıktan sonra information_schema, bir görünüm kümesi olarak değil, bunun yerine temel tablolarla uygulanmış gibi görünüyor. Bu varsayım doğru mu? Veya kullanıcıdan gizlenmiş başka sistem tabloları var mı?


+1 için çok teşekkürler :) Son bir açıklama. Söyledikten sonra, meta veri bilgilerinin doğrudan gerçekleşen tablolara karşılık gelen gerçek .frm dosyalarından okunduğunu belirtmek doğru mu? Böylece sunucu önyükleme yaptığında bu bilgileri tablolardan okur ve BİLGİ_SCHEMA'sını oluşturur. Daha sonra bir ANALYZE TABLOSU veya CREATE INDEX veya genel olarak herhangi bir DDL ifadesi yürütülürse, BİLGİ_SCHEMA buna göre güncellenir mi?
ivotron

@ivotron: Bu doğru !!! BİLGİ_SCHEMA'da COLUMNS, STATISTICS, TABLE_CONSTRAINTS vb. Gibi şema değişikliklerini kaydeden tablolar vardır. BİLGİ_SCHEMA'nın tamamı bellekte olduğundan, tüm DDL değişikliklerinin kaydedilmesi neredeyse anında gerçekleşir.
RolandoMySQLDBA

Yanıtlar:


30

ı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)

resim açıklamasını buraya girin

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.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.