1. 程式人生 > >AIX下采用dd方式進行資料遷移的過程,供參考

AIX下采用dd方式進行資料遷移的過程,供參考

簡化需求: 主機A,IBM P570,連EMC 儲存,AIX 5.3,oracle資料庫(9.2.0.7) 資料庫使用者 oracle9 兩個目錄 /oracle 存放資料庫執行的程式檔案 /data1   存放資料庫的資料檔案,假設是200GB。 資料庫沒有使用裸裝置,使用的是檔案系統。 主機B,IBM P590,連HDS 儲存, AIX5.3,假設是個剛裝完系統的空環境。 現在需要把主機A上資料庫遷移到主機B上去,也就說主機A遷到主機B,儲存從EMC儲存遷移到HDS儲存。 前期工作: 1.在主機B上新建資料庫使用者oracle9,當然屬性要求和A上的oracle9使用者一模一樣。 通過複製主機A上的/oracle目錄到B上,然後調整,比如說listener.ora需要調整IP地址等等,或者在B上新建一個數據庫例項也行,先把資料庫環境搭建起來。 2.主機方面,A要連HDS儲存,也就是說A現在同時連線了EMC儲存和HDS儲存。 利用HDS的儲存建立vg,lv,fs,建立新的檔案系統/data2,當然了/data2肯定是要大於等於200GB了 下面是利用dd遷移/data1檔案系統的步驟 1.當然是把資料庫停下來了 2.umount /data1   umount /data2 3.dd命令,從lvdata1通過dd方式把資料傳送到lvdata2上,開5個dd程序,每個程序資料量40GB,當然最後一個程序就不限制40GB了,把lvdata1上的資料傳完為止,通過tail -f nohup.out可以檢視進度。 nohup dd if=/dev/rlvdata1  of=/dev/rlvdata2  bs=4096k count=10000  &                            
nohup dd if=/dev/rlvdata1  of=/dev/rlvdata2  bs=4096k skip=10000  seek=10000   count=10000 &    
nohup dd if=/dev/rlvdata1  of=/dev/rlvdata2  bs=4096k skip=20000  seek=20000   count=10000 &    
nohup dd if=/dev/rlvdata1  of=/dev/rlvdata2  bs=4096k skip=30000  seek=30000   count=10000 &    
nohup dd if=/dev/rlvdata1  of=/dev/rlvdata2  bs=4096k skip=40000  seek=40000   &                4.通過topas可以檢視相關磁碟的IO,以及總的傳輸速度 通過ps可以檢視dd程序的數目,(其實是10個,因為smt(併發多執行緒)的原因) 當然了,每次開幾個dd程序可以通過測試確定,開多了也不一定好,總的速度反而有可能下降,這跟儲存的配置和效能有關係)。 5.傳輸結束後, fsck /dev/lvdata2 6.mount /data1 mount /data2 df -k 對比/data1,/data2總的大小,使用率是否一模一樣。 這裡有兩個問題, 1)就是lvcb的覆蓋問題,後面會討論 2)就是即使/data2原先分配的是300GB,這裡顯示的還是200GB,大家可以考慮一下是為什麼。 這裡先不進行檔案系統擴容了,等後面再擴。 7.umount /data1 umount /data2 varyoffvg vgdata2 exportvg vgdata2 產生的現象就是/etc/filesystem裡面已經不存在/data2 的entry。 同時/dev下面關於vgdata2和lvdata2的定義也都不存在了。 lspv檢視的也不存在vgdata2的資訊了 然後rmdev -dl hdisk** (hdisk**是指hds儲存盤,原先屬於vgdata2的盤) 8.將HDS儲存從主機A上撤出,分配給主機B。 cfgmgr -v lspv (通過pvid號識別新增加的磁碟) importvg -v vgdata2 hdisk** 檢視/etc/filesystems裡面存在了/data1的entry。 9.修改/etc/filesystems內容,log = /dev/loglv**,要更改,因為這裡的loglv**並不是lvdata2對應的loglv,而是原先的lvdata1對應的loglv。 10.通過lsvg -l vgdata2檢視相應的lv資訊 11.fsck /dev/lvdata2 mount /dev/lvdata2  /data1 df -k  看看fs的大小和使用率和原先的記錄是否符合。 smit chjfs2擴檔案系統(如果原先/data2是300GB的話,這裡擴100GB) df -k  12.資料庫有關配置更改之後,就可以啟動資料庫,測試應用了。 這裡還可以討論另外一個問題,就是lvdata2的lvcb被覆蓋掉了,變成了lvdata1的lvcb,這可以通過 getlvcb -AT lvdata1 getlvcb -AT lvdata2 來檢視,那麼importvg卻是正確識別到了vgdata2包含的lv的資訊,這就像chinadns所說的importvg讀取的實際上是vgda的資訊(importvg將vgda資訊import到odm中).但是mount點和loglv的資訊是讀取的lvcb的。所以 這就涉及到另外一個問題:就是如何同步vgda和lvcb的資訊。 大家可以看一下這篇文章: 就是可以使用putlvcb命令更新lv頭的lvcb,同時它將自動更新vgda中的vgda資訊, The putlvcb command writes the control block information into block 0 of the
logical volume lvname. Only the fields specified are written. putlvcb can be
used to write a new control block or update an existing one. 就是人為更改lvcb的lvid,mount point,loglv。 當然資料遷移也可以使用其他辦法,比如cplv,或者mirror,不只侷限於dd之類的,這裡就不累述了。 對於CPLV中的LVCB問題,網上也有不少文章的論述: 總的結論是: cplv
不會把邏輯捲開始的512位元組複製到新邏輯卷中,因為這512個位元組是lvcb,但是它會用新的屬性寫新邏輯卷的lvcb 比如說有兩個lv, lvtest1,上面建有檔案系統/test1,lvtest2,上面建有檔案系統/test2 cplv從lvtest1複製到lvtest2後。

#  getlvcb -AT lvtest1

         AIX LVCB

         intrapolicy = m

         copies = 1

         interpolicy = m

         lvid = 00cd9fd100004c000000011f6da92d6d.1

lvname = lvtest1

         label = /test1

         machine id = D9FD14C00

         number lps = 8

         relocatable = y

         strict = y

         stripe width = 0

         stripe size in exponent = 0

         type = jfs2

         upperbound = 32

         fs = vfs=jfs2:log=/dev/loglv08:mount=true:options=rw:account=false

         time created  = Fri Feb 13 11:26:14 2009

         time modified = Fri Feb 13 11:27:14 2009

# getlvcb -AT lvtest2

         AIX LVCB

         intrapolicy = m

         copies = 1

         interpolicy = m

         lvid = 00cd9fd100004c000000011f6daad4cf.1

 lvname = lvtest2

         label = /test1

         machine id = D9FD14C00

         number lps = 8

         relocatable = y

         strict = y

         stripe width = 0

         stripe size in exponent = 0

         type = jfs2

         upperbound = 32

         fs = vfs=jfs2:log=/dev/loglv09:mount=true:options=rw:account=false

         time created  = Fri Feb 13 11:26:42 2009

         time modified = Fri Feb 13 12:04:40 2009

從上面的結果可以看出,只有label被改變了,其他都沒有改變。

關於lvcb,下面再補充幾個命令,供參考用。

邏輯卷控制塊(LVCB)儲存著邏輯卷的重要資訊,它位於在邏輯捲開始,佔用了512個位元組。邏輯卷控制塊包括的資訊有:邏輯卷建立日期、邏輯卷的映象拷貝數和安裝點(如果在邏輯捲上建立了一個JFS檔案系統,才有安裝點)。使用命令/usr/sbin/getlvcb能夠獲得邏輯卷的LVCB。

如果想看lvcb按位元組存放的東西,可以用od

# od -c /dev/hd1|more
0000000    A   I   X       L   V   C   B  \0  \0   j   f   s   2  \0  \0
0000020   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000040   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0   0   0   0   8   3   6
0000060    1   5   0   0   0   0   d   6   0   0   0   0   0   0   0   1
0000100    1   d  \0   h   d   1  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
0000120   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0000200   \0  \0  \0   F   r   i       O   c   t       2   4       0   7
0000220    :   2   5   :   4   9       2   0   0   8  \n  \0  \0  \0  \0
0000240   \0   S   a   t       N   o   v           8       2   2   :   2
0000260    9   :   4   2       2   0   0   8  \n  \0  \0  \0  \0  \0   8
0000300    3   6   1   5   D   6   0   0  \0   y   m   c  \0   y  \0
0000320   \0  \b  \0 002   /   h   o   m   e  \0  \0  \0  \0  \0  \0  \0
0000340   \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0  \0
*
0000520   \0  \0  \0  \0   v   f   s   =   j   f   s   2   :   l   o   g
0000540    =   /   d   e   v   /   h   d   8   :   m   o   u   n   t   =
0000560    t   r   u   e   :   c   h   e   c   k   =   t   r   u   e   :
0000600    v   o   l   =   /   h   o   m   e   :   f   r   e   e   =   f
0000620    a   l   s   e   :   q   u   o   t   a   =   u   s   e   r   q
................