數(shù)據(jù)庫(kù):1. 數(shù)據(jù)庫(kù)的表?yè)p壞判斷與 修復(fù)

登陸:mysql -uroot -p密碼
顯示與使用數(shù)據(jù)庫(kù): show databases; use 庫(kù)名;
顯示所有的數(shù)據(jù)表: show tables;
查看表結(jié)構(gòu): desc 表名;

一. 檢查數(shù)據(jù)表
檢查表: check table 表名; #可查看表是否損壞。
分析表: analyze table 表名;
修復(fù)表: repair table 表名; #修復(fù)被破壞的表
優(yōu)化表: optimize table 表名;#回收閑置的數(shù)據(jù)庫(kù)空間。

1. 優(yōu)化表 與 表大小碎片相關(guān)

   注:當(dāng)表上的數(shù)據(jù)行被刪除時(shí),所占據(jù)的磁盤空間并沒有立即被回收,使用了OPTIMIZE TABLE
命令后這些空間將被回收,并且對(duì)磁盤上的數(shù)據(jù)行進(jìn)行重排(注意:是磁盤上,而非數(shù)據(jù)庫(kù))。 
   使用點(diǎn):在批量刪除數(shù)據(jù)行之后,或定期(每周/每月一次)進(jìn)行一次數(shù)據(jù)表優(yōu)化操作即可。
試用范圍:OPTIMIZE TABLE只對(duì)MyISAM, BDB和InnoDB表起作用.
  注意點(diǎn):optimize在對(duì)表進(jìn)行操作的時(shí)候,會(huì)加鎖,所以不宜經(jīng)常在程序中調(diào)用。

看到數(shù)據(jù)碎片:

show table status;                #獲取表信息
show table status like ‘表名’ ;  #獲取某個(gè)表的詳細(xì)信息
show table status like ‘表名’ \G;  #獲取某個(gè)表的詳細(xì)信息 #加 \G 可以格式化輸出
數(shù)據(jù)總大?。?  DATA_LENGTH + INDEX_LENGTH  #表的數(shù)據(jù)量+索引占大小
實(shí)際表空間大小:TABLE_ROWS * AVG_ROW_LENGTH #行數(shù)*每行的實(shí)平均字節(jié)數(shù)
碎片大小:( DATA_LENGTH+INDEX_LENGTH-TABLE_ROWS*AVG_ROW_LENGTH)/1024/1024/
 所以:實(shí)際表的大小另一種算法:DATA_LENGTH + INDEX_LENGTH -Data_free;

xiawucha2.png

2. 修復(fù)表(先介紹下mysql三文件)

  • 創(chuàng)建表時(shí)會(huì)發(fā)生如下結(jié)果:
 (1)MYSQL創(chuàng)建一個(gè)磁盤文件,擴(kuò)展名為.frm, 用于保護(hù)表格式。
 (2)存儲(chǔ)引擎會(huì)為表再創(chuàng)建幾個(gè)特定的文件,   用于存儲(chǔ)表內(nèi)容。
          存儲(chǔ)引擎:InnoDB      磁盤文件 .idb
          存儲(chǔ)引擎:MyISAM      數(shù)據(jù).MYD , 索引 .MYI
          存儲(chǔ)引擎:CSV         數(shù)據(jù).CSV,  元數(shù)據(jù) .CSM
          存儲(chǔ)引擎:MEMORY      存儲(chǔ)引擎把表放在內(nèi)存里,而非磁盤上。
  • 格式 : repair table 表名 [選項(xiàng)]
    選項(xiàng)如下:
 QUICK    : 用在數(shù)據(jù)表還沒被修改的情況下,速度最快
 EXTENDED :試圖去恢復(fù)每個(gè)數(shù)據(jù)行,會(huì)產(chǎn)生一些垃圾數(shù)據(jù)行,萬般無奈的情況下用
 USE_FRM  :用在.MYI文件丟失或者頭部受到破壞的情況下。
            即利用.frm的定義來重建索引
  注: 當(dāng).MYI文件丟失或頭部受到破壞時(shí), repair table 表名 命令將無效,需要加上選項(xiàng)3。
  注:對(duì)于MyISAM引擎,想損壞表直接刪除索引文件(.MYI)即可。
  • 格式2: 用mysql內(nèi)建命令mysqlcheck來修復(fù)表, 優(yōu)化表。 先略

例子:/SE/MYSQL/庫(kù)名/ 有所有數(shù)據(jù)表的三種文件。

  首先: 刪除xiawucha_3000_table.MYI 索引文件;
  然后: 檢查數(shù)據(jù)表是否損壞: check  table  xiawucha_3000_table
  最后: 修復(fù)表。
xiawucha3.png
xiawucha4.png

二. 創(chuàng)建表選項(xiàng)
方式1: 直接創(chuàng)建

 create table  表名(\
            serial_num  類型  unsigned primary key   auto_increment ,\
            id         類型   NOT NULL ,\
            Version     類型   NOT NULL ,\
            time       類型   ,\
            dev        類型   NOT NULL ,\
            ....
            vsid       類型   NOT NULL,\
            INDEX     vsid_id(vsid) \
    ) engine=MyISAM default charset=utf8;
   注: serial_num列--》 主鍵 且 自增;
   注: 存儲(chǔ)引擎:engine=MyISAM
   注: 默認(rèn)編碼:default charset=utf8

方式2:create table 表2 like 表1;

例子1: create table t2 as  select * from t1 where 1=2; 或者 limit 0;
特點(diǎn):as賦值表的方式,只復(fù)制表結(jié)構(gòu),沒有復(fù)制索引。復(fù)制數(shù)據(jù)。
例子2: create table t2 like t1 ;
特點(diǎn):like 創(chuàng)建出來的新表包含源表的完整表結(jié)構(gòu)和索引信息。
特點(diǎn):與原表區(qū)別: 表名不同, 沒有源表的數(shù)據(jù)。
二者的用途:
as: 用來創(chuàng)建相同表結(jié)構(gòu)并復(fù)制源表數(shù)據(jù)。
like:用來創(chuàng)建完整表結(jié)構(gòu)和全部索引(并不復(fù)制數(shù)據(jù))。

方式3:mysql使用MRG_MyISAM(MERGE)實(shí)現(xiàn)水平分表

比如在方式1的最后一句替換如下:
 ENGINE=MRG_MyISAM DEFAULT CHARSET=utf8 INSERT_METHOD=NO UNION=(‘表1’,`表2`)
  其中:INSERT_METHOD屬性說明:
       0 /no不允許插入(最好用NO)   #即:該表不可以插入數(shù)據(jù)。
       FIRST 插入到UNION中的第一個(gè)表
       LAST 插入到UNION中的最后一個(gè)表
  其中:MRG_MYISAM用來實(shí)現(xiàn)分表(讀寫分離)
  其中:UNION 用于把多個(gè)表的查詢結(jié)果組合到一個(gè)結(jié)果集合中。
  即:該表為主表,是其余多個(gè)表的集合,該表只可查詢,不可以插入。
該例子來源于網(wǎng)絡(luò)
1.首先:創(chuàng)建3張子表
  CREATE TABLE `customer1` (
     `id`    int(11)     NOT NULL   AUTO_INCREMENT,
     `name`  varchar(50) DEFAULT    NULL,
     `sex`   int(1)      NOT NULL   DEFAULT '0',
     PRIMARY KEY (`id`)
  ) ENGINE=MyISAM DEFAULT CHARSET=utf8; #創(chuàng)建表1

  create  table  customer2  like  customer1;  #創(chuàng)建表2

  create  table  customer3  like  customer1;  #創(chuàng)建表3

2. 然后:創(chuàng)建主表,ENGINE指定為MRG_MyISAM( INSERT_METHOD設(shè)置為NO 只讀)
 CREATE TABLE `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `sex` int(1) NOT NULL DEFAULT '0',
  KEY `id` (`id`)
 )  ENGINE=MRG_MyISAM  DEFAULT CHARSET=utf8 
 INSERT_METHOD=NO   UNION=(`customer1`,`customer2`,`customer3`);

3.  最后插入數(shù)據(jù):
   只能往三個(gè)子表插入數(shù)據(jù),不可往主表插入數(shù)據(jù)。

注:三個(gè)子表的數(shù)據(jù),都可以從主表中查詢。
水平分表可能存在的問題:
 1. 自增建的問題 AUTO_INCREMENT:
  首先:AUTO_INCREMENT 是對(duì)一張表而言的,后插入該表的日志該建的值會(huì)連續(xù)增大。
  然后: 當(dāng)分表后,從一張表到另一張表,兩者的自增建是獨(dú)立的,所以需要獲取前張表的
   自增建的值最大值作為下一張表的初始值。

 2. 表的切換問題:
 情景1: 當(dāng)前一張子表達(dá)到一定大小/一定時(shí)間,會(huì)換另一張表;如果表的數(shù)量沒有限制,
   只需要保證 重啟后,還能將最新的數(shù)據(jù)存入重啟前的當(dāng)前表 (或存入一張新表)。
 情景2: 當(dāng)對(duì)表的數(shù)量(或大?。┯邢拗茣r(shí),需要記錄當(dāng)前存儲(chǔ)的表,并保障重啟后還能存入
    當(dāng)前表;且在存入下一張表前,需要先將下一張表清空。

三. 刪除表

方式1:  drop  table 表名;  或者 drop table  if exists `表名`;

特點(diǎn): drop將表格直接刪除,沒有辦法找回。刪除內(nèi)容和定義,釋放空間。

方式2:truncate table 表名;
 特點(diǎn): 刪除表中的所有數(shù)據(jù),不能與where一起使用。
 truncate是DDL語(yǔ)言, 操作立即生效,自動(dòng)提交,原數(shù)據(jù)不放到 rollback segment中,
     不能回滾。刪除內(nèi)容、釋放空間但不刪除表的結(jié)構(gòu)(定義)。
方式3:
    刪除整張表數(shù)據(jù): delete from 表名; 
    刪除表的部分?jǐn)?shù)據(jù):delete from 表名 where ....;
特點(diǎn): 屬于DML語(yǔ)言,每次刪除一行,都在事務(wù)日志中為所刪除的每行記錄一項(xiàng); 
      刪除表中數(shù)據(jù)而不刪除表的結(jié)構(gòu)(定義),同時(shí)也不釋放空間。  

區(qū)別:對(duì)于“事務(wù)”--》truncate是不可以rollback的,但是delete是可以:
因?yàn)椋簍runcate刪除整表數(shù)據(jù)隱式提交),delete是一行一行的刪除。

執(zhí)行速度: drop > truncate > delete。 其中:
    drop刪除數(shù)據(jù),結(jié)構(gòu),釋放空間;
    Truncate 并不刪除結(jié)構(gòu)(表和索引所占用的空間會(huì)恢復(fù)到初始大小); 
    delete只刪除數(shù)據(jù)(表和索引所占用的空間不變)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容