THÔNG TIN được thực hiện trong MySQL như thế nào?


14

Về mặt lý thuyết, Information_SCHema là một tập hợp các khung nhìn được chỉ định trong tiêu chuẩn SQL cho phép người dùng kiểm tra siêu dữ liệu của hệ thống. Làm thế nào nó được thực hiện trong MySQL?

Khi tôi kết nối với bản cài đặt mới, tôi thấy hai cơ sở dữ liệu: mysqlinformation_schema. Sau khi sử dụng các SHOW CREATE TABLEcâu lệnh trên information_schemacơ sở dữ liệu, có vẻ như nó không được triển khai dưới dạng tập hợp các khung nhìn mà thay vào đó là các bảng cơ sở. Giả định này có đúng không? Hoặc có các bảng hệ thống khác được ẩn khỏi người dùng?


Cảm ơn rất nhiều về +1 :) Một lần làm rõ cuối cùng. Sau những gì bạn đã nói, có đúng không khi nói rằng thông tin siêu dữ liệu được đọc trực tiếp từ các tệp .frm thực tế tương ứng với các bảng thực sự được cụ thể hóa? Vì vậy, khi máy chủ khởi động, nó sẽ đọc thông tin đó từ các bảng và tạo ra Information_SCHema. Sau đó, nếu BẢNG ANALYZE hoặc INDEX TẠO hoặc nói chung bất kỳ câu lệnh DDL nào được thực thi, thì THÔNG TIN_SCHema được cập nhật tương ứng?
ivotron

@ Pivotron: Điều này đúng !!! Có các bảng trong Information_SCHema ghi lại các thay đổi lược đồ như COLUMNS, STATISTICS, TABLE_CONSTRAINTS, v.v. Bởi vì Information_SCHema là tất cả trong bộ nhớ, việc ghi lại tất cả các thay đổi DDL là gần như tức thời.
RolandoMySQLDBA

Câu trả lời:


30

Cơ sở dữ liệu Information_SCHema được tạo thành từ các bảng tạm thời bằng cách sử dụng công cụ lưu trữ MEMORY.

Ví dụ: Dưới đây là bảng Information_SCHema.TABLES trong MySQL 5.5.12 (Phiên bản 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)

Không có thư mục vật lý cho các bảng đó, thậm chí không có tệp .frm. Bạn không thể mysqldump nó. Bạn không thể thả nó. Bạn không thể thêm bảng vào nó. Bạn không thể thả bảng từ nó. Vậy, những cái bàn ở đâu ???

Tất cả các bảng trong cơ sở dữ liệu Information_SCHema được lưu trữ trực tiếp trong bộ nhớ dưới dạng bảng công cụ lưu trữ MEMOR. Chúng hoàn toàn bên trong MySQL, vì vậy các cơ chế .frm được xử lý trong mysqld. Trong câu trả lời của tôi, lần đầu tiên tôi chỉ ra cách bố trí bảng của Information_SCHema.TABLES. Đó là một bảng tạm thời trong bộ nhớ. Nó được chế tác bằng cách sử dụng các giao thức công cụ lưu trữ. Do đó, khi mysqld bị tắt, tất cả các bảng information_schema sẽ bị hủy. Khi mysqld được khởi động, tất cả các bảng information_schema được tạo dưới dạng bảng TẠM THỜI và được sao lưu bằng siêu dữ liệu cho mỗi bảng trong thể hiện mysql.

Cơ sở dữ liệu Information_SCHema được giới thiệu lần đầu tiên trong MySQL 5.0 để cung cấp cho bạn quyền truy cập vào siêu dữ liệu về các bảng của các công cụ lưu trữ khác. Ví dụ: bạn có thể thực hiện HIỂN THỊ cơ sở dữ liệu để có danh sách cơ sở dữ liệu. Bạn cũng có thể truy vấn chúng như thế này:

SELECT schema_name database FROM information_schema.schemata;

Bạn có thể truy xuất tên bảng trong cơ sở dữ liệu theo hai cách:

use mydb
show tables;

hoặc là

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

Kể từ khi thành lập, MySQL đã mở rộng cơ sở dữ liệu Information_SCHema để có danh sách quy trình (kể từ MySQL 5.1). Bạn thực sự có thể truy vấn danh sách quy trình tìm kiếm các truy vấn chạy dài vẫn đang chạy ít nhất 10 phút:

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

Bạn có thể sử dụng THÔNG TIN_SCHema để thực hiện mọi việc phức tạp: chẳng hạn như:

Nhận số lượng của tất cả các bảng bằng cách sử dụng các công cụ lưu trữ cụ thể:

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;

Nhận Kích thước bộ đệm chính MyISAM được đề xuất tính bằng 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;

Nhận Kích thước nhóm bộ đệm InnoDB được đề xuất theo 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;

Nhận sử dụng đĩa của tất cả các cơ sở dữ liệu bằng công cụ lưu trữ trong 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;

Tin tôi đi, vẫn còn nhiều cách sử dụng tuyệt vời hơn cho Information_SCHema mà thời gian không cho phép tôi thảo luận thêm.

Xin lưu ý rằng Information_SCHema nhạy cảm đến mức nếu mysql đang chạy và bạn làm như sau:

cd /var/lib/mysql
mkdir junkfolder

và sau đó đi vào mysql chạy

mysql> SHOW DATABASES;

Bạn sẽ thấy rác thải là một trong những cơ sở dữ liệu.

Biết nó rất quan trọng đối với các DBA và Nhà phát triển. Chương 20 (nhà phát triển) và Chương 31 (DBA) của cuốn sách Hướng dẫn nghiên cứu chứng chỉ MySQL 5.0

nhập mô tả hình ảnh ở đây

có mặt để chuẩn bị cho các kỳ thi chứng chỉ dành cho nhà phát triển và DBA. Nhận sách, nghiên cứu kỹ các chương đó và bạn có thể làm những điều tuyệt vời với THÔNG TIN_SCHema của MySQL.

Cơ sở dữ liệu Information_SCHema kể từ MySQL 5.5, hiện có các plugin, biến toàn cục (trạng thái và tĩnh), biến phiên (trạng thái và tĩnh), trạng thái công cụ lưu trữ, thiết bị đo lường hiệu suất, bản đồ kích hoạt, sự kiện (có thể lập trình) và nhiều hơn nữa.

Xin lỗi, điều này có vẻ giống như WTMI nhưng tôi là một người ủng hộ lớn cho việc sử dụng cơ sở dữ liệu Information_SCHema.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.