經過iostat命令發現某塊磁盤的io使用率常常保持在100%,經過blkid命令獲取linux raid存儲盤符和掛載點的關係後,最後發現是掛載點上的一個數據庫表空間在佔用大io。html
postgres@dbmaster:~$ iostat -xm 3 |grep -v dm avg-cpu: %user %nice %system %iowait %steal %idle 11.68 0.00 3.82 8.63 0.00 75.87 Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util sda 0.00 0.69 0.29 1.54 0.00 0.01 18.01 0.00 1.45 4.34 0.91 0.57 0.10 sdb 0.00 0.77 3.51 2.63 0.42 0.57 329.19 0.03 4.23 0.61 9.07 0.52 0.32 sdc 0.00 12.98 31.28 283.84 1.17 5.46 43.07 0.10 2.88 21.27 0.85 0.57 18.00 sdd 0.00 0.08 0.01 0.95 0.00 0.42 889.72 0.34 358.73 65.53 361.07 4.14 0.40 sde 0.42 13.04 58.26 766.30 1.60 6.63 20.45 0.71 0.86 4.56 0.58 0.89 73.57 sdf 0.11 8.62 56.90 217.50 3.02 2.50 41.15 0.63 2.28 10.76 0.07 0.89 24.46
如今知道個別磁盤io使用率很高,接下來就是須要修改個別表索引的表空間到空閒磁盤中。linux
經過alter index直接移動索引會鎖住其它更新操做,大索引的移動須要很長時間,在生產環境中不可取。能夠經過如下方式解決:ios
1。經過create index concurrently在新的表空間重建和原表空間定義同樣的索引(名字不一樣)。sql
2。刪除原表空間的索引。數據庫
create index concurrently的介紹能夠參考這篇文章:http://my.oschina.net/Kenyon/blog/93465post
下面是原來一個表的索引詳情,須要把除了主鍵外在indextbs上的索引移動到默認表空間。url
Indexes:
"article_111_pkey" PRIMARY KEY, btree (aid), tablespace "indextbs"
"article_111_url_hash" UNIQUE CONSTRAINT, btree (url_hash), tablespace "indextbs"
"article_111_bid_titlehash_idx" btree (bid, title_hash), tablespace "indextbs"
......spa
一、移動article_111_bid_titlehash_idx索引.net
CREATE INDEX CONCURRENTLY article_111_bid_title_hash_idx ON article_111 USING btree (bid, title_hash COLLATE pg_catalog."default") TABLESPACE pg_de fault ; drop index article_111_bid_titlehash_idx ;
二、移動article_111_url_hash索引postgresql
這個索引有一個惟一性約束,和前面方法有些區別。
CREATE UNIQUE INDEX CONCURRENTLY article_111_urlhash_idx ON article_111 USING btree (url_hash) ; alter table article_111 drop constraint article_111_url_hash,add unique using index article_111_urlhash_idx ;
參考網址:
http://www.sijitao.net/1823.html
http://www.postgresql.org/docs/9.1/static/sql-altertable.html