MySQL
創(chuàng)新互聯(lián)成立與2013年,先為普蘭等服務(wù)建站,普蘭等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為普蘭企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
查看表結(jié)構(gòu)簡單命令。
一、簡單描述表結(jié)構(gòu),字段類型desc
tabl_name;
顯示表結(jié)構(gòu),字段類型,主鍵,是否為空等屬性,但不顯示外鍵。
二、查詢表中列的注釋信息
select
*
from
information_schema.columns
where
table_schema
=
'db'
#表所在數(shù)據(jù)庫
and
table_name
=
'tablename'
;
#你要查的表
三、只查詢列名和注釋
select
column_name,
column_comment
from
information_schema.columns
where
table_schema
='db'
and
table_name
=
'tablename'
;
四、#查看表的注釋
select
table_name,table_comment
from
information_schema.tables
where
table_schema
=
'db'
and
table_name
='tablename'
ps:二~四是在元數(shù)據(jù)表中查看,我在實際操作中,常常不靈光,不知為什么,有了解的大俠請留印。
五、查看表生成的DDL
show
create
table
table_name;
查看某個表的建表語句,可以使用phpmyadmin查看,首先選擇這個表所在的數(shù)據(jù)庫。
比如:ecshop庫,里面有個ecs_goods表,那么查看goods表的建表語句為:
show create table ecs_goods
把這條sql語句復(fù)制到
把顯示的結(jié)果復(fù)制到其它機(jī)器上運行,就建好一張goods表了。
MySQL 是一個關(guān)系型數(shù)據(jù)庫,由瑞典?MySQL AB 公司開發(fā),目前屬于?Oracle?旗下公司。MySQL 最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS (Relational Database Management System,關(guān)系數(shù)據(jù)庫管理系統(tǒng)) 應(yīng)用軟件之一。MySQL 是一種關(guān)聯(lián)數(shù)據(jù)庫管理系統(tǒng),關(guān)聯(lián)數(shù)據(jù)庫將數(shù)據(jù)保存在不同的表中,而不是將所有數(shù)據(jù)放在一個大倉庫內(nèi),這樣就增加了速度并提高了靈活性。MySQL 所使用的 SQL 語言是用于訪問數(shù)據(jù)庫的最常用標(biāo)準(zhǔn)化語言。MySQL 軟件采用了雙授權(quán)政策(本詞條"授權(quán)政策"),它分為社區(qū)版和商業(yè)版,由于其體積小,速度快,總體擁有成本低,尤其是開放源碼這一特點,一般中小型網(wǎng)站的開發(fā)都選擇 MySQL 作為網(wǎng)站數(shù)據(jù)庫。由于其社區(qū)版的性能卓越,搭配?PHP,Linux和?Apache?可組成良好的開發(fā)環(huán)境,經(jīng)過多年的web技術(shù)發(fā)展,在業(yè)內(nèi)被廣泛使用的一種web服務(wù)器解決方案之一,稱之為LAMP。
Online DDL 工具:pt-osc
對于 MySQL Online DDL 目前主流的有三種工具:
原生 Online DDL;
pt-osc(online-schema-change),
gh-ost
本文主要講解 pt-online-schema-change 的使用以及三種工具的簡單對比。
一、原理及限制
1.1 原理
1.?創(chuàng)建一個與原表結(jié)構(gòu)相同的空表,表名是?_new?后綴;
2. 修改步驟 1 創(chuàng)建的空表的表結(jié)構(gòu);
3. 在原表上加三個觸發(fā)器:delete/update/insert,用于 copy 數(shù)據(jù)過程中,將原表中要執(zhí)行的語句在新表中執(zhí)行;
4. 將原表數(shù)據(jù)以數(shù)據(jù)塊(chunk)的形式 copy 到新表;
5. rename 原表為 old 表,并把新表 rename 為原表名,然后刪除舊表;
6. 刪除觸發(fā)器。
MySQL8.0 開始支持原? DDL(atomic DDL),數(shù)據(jù)字典的更新,存儲引擎操作,寫?進(jìn)制日志結(jié)合成了一個事務(wù)。在沒有原?DDL之前,DROP TABLE test1,test2;如遇到server crash,可能會有test1被drop了,test2沒有被drop掉。下面來看下在MySQL8.0之前和MySQL8.0 數(shù)據(jù)字典的區(qū)別
在MySQL8.0 之前,Data Dictionary除了存在與.FRM, .TRG, .OPT ?件外,還存在于系統(tǒng)表中(MyISAM ?事務(wù)引擎表中),在MySQL8.0 ,Data Dictionary 全部存在于Data Dictionary Storage Engine(即 InnoDB表中),這使crash recovery 維持原?性成為了可能
存儲引擎?持
目前,只有InnoDB存儲引擎?持原子DDL,為了實現(xiàn)原子DDL,Innodb要寫DDL logs 到 mysql.innodb_ddl_log 表,這是?個隱藏在mysql.ibd 數(shù)據(jù)字典表空間?的數(shù)據(jù)字典表。要看mysql.innodb_ddl_log 中的內(nèi)容,需要
SET GLOBAL?LOG_ERROR_VERBOSITY=3;(MySQL 8.0 默認(rèn)為2,error log 記錄Errors and
warnings,不不記錄notes)
SET GLOBAL innodb_print_ddl_logs=1;
CREATE TABLE?t1 (c1 INT)?ENGINE?=?InnoDB;
查看error log
[Note] [MY-011066] InnoDB: DDL log?insert?: [DDL?record:?DELETE SPACE,?id=30,
thread_id=25, space_id=9, old_file_path=./test/t1.ibd]
[Note] [MY-011066]?InnoDB:?DDL log?delete?:?by id?30
[Note] [MY-011066]?InnoDB:?DDL log?insert?: [DDL?record: REMOVE?CACHE,?id=31,
thread_id=25, table_id=1066, new_file_path=test/t1]
[Note] [MY-011066]?InnoDB:?DDL log?delete?:?by id?31
[Note] [MY-011066]?InnoDB:?DDL log?insert?: [DDL?record: FREE,?id=32, thread_
id=25, space_id=9, index_id=143, page_no=4]
[Note] [MY-011066]?InnoDB:?DDL log delete?:?by id?32
[Note] [MY-011066]?InnoDB:?DDL log?post ddl :?begin for thread id?: 25
[Note] [MY-011066]?InnoDB:?DDL log?post ddl :?end for thread id?: 25
原子DDL 操作步驟
準(zhǔn)備:創(chuàng)建所需的對象并將DDL?志寫入 mysql.innodb_ddl_log表中。DDL日志定義了如何前滾和回滾DDL操作。
執(zhí)行:執(zhí)?DDL操作。例如,為CREATE TABLE操作執(zhí)?創(chuàng)建。
提交:更新數(shù)據(jù)字典并提交數(shù)據(jù)字典事務(wù)。
Post-DDL:重播并從mysql.innodb_ddl_log表格中刪除DDL?志。為確保回滾可以安全執(zhí)??不引?不?致性,在此最后階段執(zhí)??件操作(如重命名或刪除數(shù)據(jù)文件)。這一階段還從 mysql.innodb_dynamic_metadata的數(shù)據(jù)字典表刪除的動態(tài)元數(shù)據(jù)為了DROP TABLE,TRUNCATE和其它重建表的DDL操作。
?論事務(wù)是提交還是回滾,DDL日志都會mysql.innodb_ddl_log在Post-DDL階段重播并從表中刪除 。mysql.innodb_ddl_log如果服務(wù)器在DDL操作期間暫停,DDL?志應(yīng)該只保留在表中。在這種情況下,DDL?志會在恢復(fù)后重播并刪除。
在恢復(fù)情況下,當(dāng)服務(wù)器重新啟動時,可能會提交或回退DDL事務(wù)。如果在重做?志和?進(jìn)制日志中存在DDL操作的提交階段期間執(zhí)?的數(shù)據(jù)字典事務(wù),則該操作被認(rèn)為是成功的并且被前滾。否則,在InnoDB重放數(shù)據(jù)字典重做日志時回滾不完整的數(shù)據(jù)字典事務(wù) ,并且回滾DDL事務(wù)。
原?DDL ?持類型
? DROP TABLES , all tables dropped or none
? DROP SCHEMA, all entities in the schema are dropped, or none
? Note that atomic DDL statements will be rolled back or committed even in case of crash, e.g. RENAME TABLES
? CREATE TABLE would be successfully committed or rolled back (no orphan ibd left)
? TRUNCATE TABLE (including InnoDB tables with FTS AUX tables) would be successfully committed or rolled back
? RENAME TABLES, all or none
? ALTER TABLE successful or not done
示例
請點擊輸入圖片描述
請點擊輸入圖片描述
結(jié)論
在MySQL8.0之前,alter table 操作在server crash的情況下,會遺留.frm,.ibd文件。MySQL8.0 能實現(xiàn)原?DDL(包括 DROP TABLE, DROP SCHEMA, CREATE TABLE, TRUNCATE TABLE, ALTER TABLE),alter table 操作,在server crash的情況下,不會遺留.frm,.ibd臨時文件。讓我們?起期待MySQL8.0 GA的到來吧!
一、簡單描述表結(jié)構(gòu),字段類型
desc tabl_name;
顯示表結(jié)構(gòu),字段類型,主鍵,是否為空等屬性,但不顯示外鍵。
例如:desc table_name
二、查詢表中列的注釋信息
select * from information_schema.columns
where table_schema = 'db' #表所在數(shù)據(jù)庫
and table_name = 'tablename' ; #你要查的表
例如:
可以自動選擇你需要信息
三、只查詢列名和注釋
select column_name, column_comment from information_schema.columns where table_schema ='db' and table_name = 'tablename' ;
例如:
四、#查看表的注釋
select table_name,table_comment from information_schema.tables where table_schema = 'db' and table_name ='tablename'
例如:
五、查看表生成的DDL
show create table table_name;
例如:
這個命令雖然顯示起來不是太容易看, 這個不是問題可以用\G來結(jié)尾,使得結(jié)果容易閱讀;該命令把創(chuàng)建表的DDL顯示出來,于是表結(jié)構(gòu)、類型,外鍵,備注全部顯示出來了。
我比較喜歡這個命令:輸入簡單,顯示結(jié)果全面。