MySQL में INFORMATION_SCHEMA को कैसे लागू किया जाता है?


14

INFORMATION_SCHEMA, सिद्धांत में, SQL मानक में निर्दिष्ट विचारों का एक सेट है जो उपयोगकर्ता को सिस्टम के मेटाडेटा का निरीक्षण करने की अनुमति देता है। यह MySQL में कैसे लागू किया गया है?

जब मैं एक नई स्थापना से जुड़ता हूं तो मुझे दो डेटाबेस दिखाई देते हैं: mysqlऔर information_schema। डेटाबेस SHOW CREATE TABLEपर बयानों का उपयोग करने के बाद information_schema, ऐसा लगता है कि इसे विचारों के एक सेट के रूप में लागू नहीं किया गया है, बल्कि आधार तालिकाओं के साथ। क्या यह धारणा सही है? या अन्य सिस्टम टेबल हैं जो उपयोगकर्ता से छिपे हुए हैं?


+1 :) एक अंतिम स्पष्टीकरण के लिए बहुत बहुत धन्यवाद। आपने जो कहा है, उसके बाद यह बताना सही है कि मेटाडेटा की जानकारी वास्तविक से वास्तविक रूप से पढ़ी जाती है। इसलिए जब सर्वर बूट होता है तो वह उस सूचना को तालिकाओं से पढ़ता है और INFORMATION_SCHEMA बनाता है। फिर अगर कोई ANALYZE TABLE या CREATE INDEX या सामान्य तौर पर किसी DDL स्टेटमेंट को निष्पादित किया जाता है, तो INFORMATION_SCHEMA को तदनुसार अपडेट किया जाता है?
ivotron

@ एक्सट्रॉन: यह सही है !!! INFORMATION_SCHEMA में तालिकाएँ हैं जो रिकॉर्ड स्कीमा जैसे COLUMNS, STATISTICS, TABLE_CONSTRAINTS, और इसके बाद में परिवर्तन करती हैं। क्योंकि INFORMATION_SCHEMA सभी मेमोरी में है, सभी DDL परिवर्तनों की रिकॉर्डिंग लगभग तात्कालिक है।
रोलैंडम्यूसीडीडीबीए

जवाबों:


30

INFORMATION_SCHEMA डेटाबेस स्मृति भंडारण इंजन का उपयोग कर अस्थायी तालिकाओं से बना है।

उदाहरण: यहाँ MySQL 5.5.12 (Windows संस्करण) में तालिका INFORMATION_SCHEMA.TABLES है।

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)

उन तालिकाओं के लिए कोई भौतिक फ़ोल्डर नहीं है, यहां तक ​​कि .frm फाइलें भी नहीं। आप इसे mysqldump नहीं कर सकते। आप इसे छोड़ नहीं सकते। आप इसमें तालिकाओं को नहीं जोड़ सकते। आप इससे टेबल नहीं गिरा सकते। तो, टेबल कहाँ हैं ???

INFORMATION_SCHEMA डेटाबेस की सभी तालिकाओं को मेमोरी स्टोरेज इंजन टेबल के रूप में सीधे मेमोरी में स्टोर किया जाता है। वे MySQL के लिए पूरी तरह से आंतरिक हैं, इसलिए .sm तंत्र mysqld में संभाला जाता है। अपने जवाब में, मैंने सबसे पहले INFORMATION_SCHEMA.TABLES का टेबल लेआउट दिखाया। यह स्मृति में एक अस्थायी तालिका है। इसे स्टोरेज इंजन प्रोटोकॉल का उपयोग करके हेरफेर किया जाता है। इस प्रकार, जब mysqld शटडाउन होता है, तो सभी information_schema तालिकाओं को गिरा दिया जाता है। जब mysqld शुरू किया जाता है, तो सभी information_schema तालिकाएँ TEMPORARY तालिकाओं के रूप में बनाई जाती हैं और mysql उदाहरण में हर तालिका के लिए मेटाडेटा के साथ फिर से खोल दी जाती हैं।

INFORMATION_SCHEMA डेटाबेस पहले MySQL 5.0 में पेश किया गया था आप अन्य भंडारण इंजन के टेबल के बारे में मेटाडेटा तक पहुंच प्रदान करना। उदाहरण के लिए, आप डेटाबेस की एक सूची प्राप्त करने के लिए शो डेटा का उपयोग कर सकते हैं। आप उनके लिए इस तरह क्वेरी भी कर सकते हैं:

SELECT schema_name database FROM information_schema.schemata;

आप डेटाबेस में तालिका के नाम दो तरीकों से प्राप्त कर सकते हैं:

use mydb
show tables;

या

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

अपनी स्थापना के बाद से, MySQL ने प्रक्रिया सूची (MySQL 5.1 के अनुसार) के लिए INFORMATION_SCHEMA डेटाबेस का विस्तार किया है। आप वास्तव में लंबे समय तक चलने वाले प्रश्नों की तलाश में प्रक्रिया सूची को क्वेरी कर सकते हैं जो अभी भी कम से कम 10 मिनट चल रहे हैं:

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

आप हर विस्तृत काम करने के लिए INFORMATION_SCHEMA का उपयोग कर सकते हैं: जैसे:

विशिष्ट संग्रहण इंजनों का उपयोग करके सभी तालिकाओं की गिनती प्राप्त करें:

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 में अनुशंसित MyISAM कुंजी बफर आकार प्राप्त करें

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 में अनुशंसित InnoDB बफर पूल आकार प्राप्त करें

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 में स्टोरेज इंजन द्वारा सभी डेटाबेस का डिस्क उपयोग प्राप्त करें

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;

मेरा विश्वास करो, INFORMATION_SCHEMA के लिए अभी भी अधिक अद्भुत उपयोग हैं कि समय मुझे आगे चर्चा करने की अनुमति नहीं देता है।

कृपया ध्यान रखें कि INFORMATION_SCHEMA इतना संवेदनशील है कि यदि mysql चल रहा है और आप निम्न कार्य करते हैं:

cd /var/lib/mysql
mkdir junkfolder

और फिर mysql रन में जाएं

mysql> SHOW DATABASES;

आप डेटाबेस में से एक के रूप में जंकफ़ोल्डर देखेंगे।

यह जानना डीबीए और डेवलपर्स के लिए बहुत महत्वपूर्ण है। पुस्तक MySQL 5.0 प्रमाणन अध्ययन गाइड के अध्याय 20 (डेवलपर्स) और अध्याय 31 (डीबीए)

यहाँ छवि विवरण दर्ज करें

डेवलपर और डीबीए प्रमाणन परीक्षा की तैयारी के लिए हैं। पुस्तक प्राप्त करें, उन अध्यायों का अच्छी तरह से अध्ययन करें, और आप MySQL के INFORMATION_SCHEMA के साथ महान कार्य कर सकते हैं।

MySQL 5.5 के रूप में INFORMATION_SCHEMA डेटाबेस, अब प्लगइन्स, वैश्विक चर (स्थिति और स्थैतिक), सत्र चर (स्थिति और स्थैतिक), भंडारण इंजन की स्थिति, प्रदर्शन मैट्रिक्स इंस्ट्रूमेंटेशन, ट्रिगर मैप, घटनाओं (प्रोग्राम) और बहुत कुछ सुविधाएँ।

क्षमा करें, यह WTMI की तरह लग सकता है, लेकिन मैं INFORMATION_SCHEMA डेटाबेस का उपयोग करने का एक बड़ा प्रस्तावक हूं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.