Information_SCHEMA ใช้งานอย่างไรใน MySQL?


14

INFORMATION_SCHEMA ตามทฤษฎีแล้วเป็นชุดของมุมมองที่ระบุในมาตรฐาน SQL ที่อนุญาตให้ผู้ใช้ตรวจสอบข้อมูลเมตาของระบบ มันนำมาใช้ใน MySQL ได้อย่างไร?

เมื่อฉันเชื่อมต่อกับติดตั้งใหม่ผมเห็นสองฐานข้อมูล: และmysql information_schemaหลังจากใช้SHOW CREATE TABLEคำสั่งบนinformation_schemaฐานข้อมูลดูเหมือนว่าไม่ได้ใช้งานเป็นชุดของมุมมอง แต่ใช้กับตารางฐานแทน สมมติฐานนี้ถูกต้องหรือไม่ หรือมีตารางระบบอื่น ๆ ที่ซ่อนอยู่จากผู้ใช้?


ขอบคุณมากสำหรับ +1 :) หนึ่งการชี้แจงครั้งสุดท้าย หลังจากสิ่งที่คุณพูดถูกต้องหรือไม่ที่จะระบุว่าข้อมูลเมตาดาต้าถูกอ่านโดยตรงจากไฟล์. frm จริงที่ตรงกับตารางที่ปรากฏจริงหรือไม่ ดังนั้นเมื่อเซิร์ฟเวอร์บูทเครื่องจะอ่านข้อมูลนั้นจากตารางและสร้าง INFORMATION_SCHEMA จากนั้นหากมีการวิเคราะห์ ANALYZE TABLE หรือ CREATE INDEX หรือโดยทั่วไปคำสั่ง DDL ใด ๆ Information_SCHEMA จะถูกอัพเดตตามนั้นหรือไม่?
ivotron

@ivotron: ถูกต้อง !!! มีตารางใน Information_SCHEMA ที่บันทึก schema เปลี่ยนแปลงเช่น COLUMNS, สถิติ, Table_CONSTRAINTS และอื่น ๆ เนื่องจาก INFORMATION_SCHEMA อยู่ในหน่วยความจำทั้งหมดการบันทึกการเปลี่ยนแปลง DDL ทั้งหมดจึงเกือบจะทันที
RolandoMySQLDBA

คำตอบ:


30

INFORMATION_SCHEMAฐานข้อมูลถูกสร้างขึ้นจากตารางชั่วคราวโดยใช้เครื่องมือการจัดเก็บหน่วยความจำ

ตัวอย่าง: นี่คือตาราง INFORMATION_SCHEMA.TABLES ใน MySQL 5.5.12 (เวอร์ชั่น 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)

ไม่มีฟิสิคัลโฟลเดอร์สำหรับตารางเหล่านั้นไม่ใช่แม้แต่ไฟล์. frm คุณไม่สามารถ mysqldump คุณไม่สามารถวางได้ คุณไม่สามารถเพิ่มตารางเข้าไปได้ คุณไม่สามารถวางตารางจากมัน ดังนั้นตารางอยู่ที่ไหน ???

ตารางทั้งหมดในฐานข้อมูล INFORMATION_SCHEMA จะถูกเก็บไว้ในหน่วยความจำโดยตรงเป็นตารางเอนจินการเก็บข้อมูล MEMORY พวกมันทั้งหมดภายใน MySQL ดังนั้นกลไก. frm ถูกจัดการใน mysqld ในคำตอบของฉันฉันแรกแสดงเค้าโครงตารางของ INFORMATION_SCHEMA.TABLES มันเป็นตารางชั่วคราวในหน่วยความจำ มันถูกจัดการโดยใช้โปรโตคอลเอ็นจิ้นการจัดเก็บ ดังนั้นเมื่อ mysqld ปิดตัวลงตาราง data_schema ทั้งหมดจะถูกดร็อป เมื่อเริ่ม mysqld ตาราง data_schema ทั้งหมดจะถูกสร้างเป็นตารางชั่วคราวและ repopulated ด้วย metadata สำหรับทุกตารางในอินสแตนซ์ mysql

INFORMATION_SCHEMAฐานข้อมูลเป็นครั้งแรกใน MySQL 5.0 เพื่อให้คุณสามารถเข้าถึงข้อมูลเมตาเกี่ยวกับตารางของเครื่องมือเก็บข้อมูลอื่น ๆ ตัวอย่างเช่นคุณสามารถแสดง SHOW DATABASESเพื่อรับรายการฐานข้อมูล คุณสามารถสอบถามพวกเขาเช่นนี้:

SELECT schema_name database FROM information_schema.schemata;

คุณสามารถดึงชื่อตารางในฐานข้อมูลได้สองวิธี:

use mydb
show tables;

หรือ

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

ตั้งแต่เริ่มต้น MySQL ได้ขยายฐานข้อมูล INFORMATION_SCHEMA เพื่อให้มีรายการกระบวนการ (ตั้งแต่ MySQL 5.1) คุณสามารถเคียวรีรายการกระบวนการที่กำลังค้นหาเคียวรีที่รันนานซึ่งยังคงรันอยู่อย่างน้อย 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;

รับขนาดบัฟเฟอร์ของ MyISAM ที่แนะนำเป็น 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;

รับขนาดบัฟเฟอร์ InnoDB ที่แนะนำเป็น 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;

รับการใช้งานดิสก์ของฐานข้อมูลทั้งหมดโดยเครื่องมือจัดเก็บข้อมูลเป็น 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 run

mysql> SHOW DATABASES;

คุณจะเห็นโฟลเดอร์ขยะเป็นหนึ่งในฐานข้อมูล

การรู้ว่ามันมีความสำคัญมากสำหรับ DBA และนักพัฒนา บทที่ 20 (นักพัฒนาซอฟต์แวร์) และบทที่ 31 (DBA) ของหนังสือคู่มือMySQL 5.0 คู่มือการศึกษา

ป้อนคำอธิบายรูปภาพที่นี่

มีการเตรียมการสำหรับนักพัฒนาและการสอบรับรอง DBA รับหนังสือศึกษาบทเหล่านั้นอย่างดีและคุณสามารถทำสิ่งที่ยอดเยี่ยมด้วย MySQL's INFORMATION_SCHEMA

ฐานข้อมูล INFORMATION_SCHEMA ตั้งแต่ MySQL 5.5 ตอนนี้มีปลั๊กอิน, ตัวแปรทั่วโลก (สถานะและสแตติก), ตัวแปรเซสชั่น (สถานะและสแตติก), สถานะของเครื่องมือจัดเก็บ, เครื่องมือวัดประสิทธิภาพ, แผนที่ทริกเกอร์, กิจกรรม (โปรแกรม) และอีกมากมาย

ขออภัยนี่อาจดูเหมือน WTMI แต่ฉันเป็นผู้สนับสนุนรายใหญ่ในการใช้ฐานข้อมูล INFORMATION_SCHEMA

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.