怎樣在加密Amazon Redshift集群時(shí)遷移元數(shù)據(jù)
推薦 + 挑錯(cuò) + 收藏(0) + 用戶評論(0)
一位客戶來向我們求助,讓我們幫助其來擴(kuò)展和修改它們的 Amazon Redshift集群。在響應(yīng)它們請求的過程中,我們利用了 AWSLabs GitHub倉庫中可用的若干種工具。下面就解釋了你可以如何像我們那樣使用其中的一些工具(這并不是想詳細(xì)地描述那個(gè)文庫的內(nèi)容)。
那位客戶正在收購另一家比它自身規(guī)模稍小的生產(chǎn)企業(yè)。兩家企業(yè)都有一個(gè)BI基礎(chǔ)設(shè)施,它們相信,將各自的平臺進(jìn)行聯(lián)合將會降低成本,簡化操作。它們想將被收購組織的倉庫搬到現(xiàn)有的Amazon Redshift集群中,但是還有一個(gè)新的要求。由于被收購企業(yè)一些項(xiàng)目的性質(zhì),它們有一項(xiàng)加密數(shù)據(jù)的合同義務(wù)。
Amazon Redshift支持靜態(tài)數(shù)據(jù)加密,數(shù)據(jù)庫中數(shù)據(jù)的加密,以及關(guān)聯(lián)快照的加密。要啟動加密功能,在創(chuàng)建數(shù)據(jù)庫時(shí)必須選擇加密。要想在數(shù)據(jù)庫創(chuàng)建后加密數(shù)據(jù)庫,必須建立一個(gè)新的數(shù)據(jù)庫,將內(nèi)容從未加密集群搬移到新集群,在新集群中對內(nèi)容進(jìn)行加密。
將你的應(yīng)用的數(shù)據(jù)表內(nèi)容搬移是很簡單的,因?yàn)锳mazon Redshift提供了實(shí)現(xiàn)這種目標(biāo)的一個(gè)UNLOAD特性。
要想確定待卸載的數(shù)據(jù)表,考慮運(yùn)行如下所示的一個(gè)查詢命令:
SELECT tablename FROM pg_tables WHERE schemaname = ‘public’;
注意,模式名稱需要被擴(kuò)展來反映你在集群的何處創(chuàng)建了對象。在源集群中運(yùn)行UNLOAD,在新集群中進(jìn)行拷貝就可以遷移應(yīng)用數(shù)據(jù)了。相當(dāng)簡單!
UNLOAD (‘SELECT * FROM sample_table’) TO ‘s3://mybucket/sample/sample_Table_’ credentials ‘a(chǎn)ws_access_key_id=;aws_secret_access_key=’ manifest;
該命令將一個(gè)SELECT語句的結(jié)果拆分成一組文件,每個(gè)節(jié)點(diǎn)一個(gè)或多個(gè)文件,簡化了數(shù)據(jù)的平行重載過程。它也創(chuàng)建了一個(gè)清單文件,可確保COPY命令向加密集群中加載了所有的必須文件,而且只是必須的文件。在COPY命令中使用清單文件是一種推薦的做法。
你仍然可以使用Amazon Redshift Unload/Copy utility(Amazon Redshift卸載/復(fù)制工具)將這一過程繼續(xù)簡化。這一工具將數(shù)據(jù)從源集群中導(dǎo)出到S3中的一個(gè)位置,使用Amazon KMS服務(wù)對數(shù)據(jù)進(jìn)行加密。它也可以將數(shù)據(jù)導(dǎo)入到另一Amazon Redshift集群中,并清除S3中的數(shù)據(jù)。
對很多應(yīng)用來講,Amazon Redshift包含的不僅僅是應(yīng)用數(shù)據(jù)。Amazon Redshift支持創(chuàng)建數(shù)據(jù)庫用戶,用戶組,和向用戶和用戶組分配特權(quán)。準(zhǔn)確地重新創(chuàng)建這些數(shù)據(jù)可能是易出錯(cuò)的,除非所有數(shù)據(jù)都使用腳本進(jìn)行創(chuàng)建,且每個(gè)腳本都是受源代碼控制的。幸運(yùn)的是,創(chuàng)建腳本,直接從源集群遷移這些數(shù)據(jù),在加密集群中運(yùn)行這些腳本來復(fù)制你所需的數(shù)據(jù),是非常簡單的。
在實(shí)際創(chuàng)建腳本前,我們開始的最佳位置就是AWSLabs GitHub倉庫。在AdminViews目錄中,已經(jīng)有若干有用的腳本。你可以為模式,數(shù)據(jù)表,和視圖創(chuàng)建DDL。你也可以按用戶獲取模式,視圖和表特權(quán)清單,查看用戶所屬的用戶組。所有這些都是有用的信息,但是你想做的是,在你的源數(shù)據(jù)庫中創(chuàng)建SQL語句,并在你的新的加密數(shù)據(jù)庫中執(zhí)行這些語句。
你可以如下圖所示,從pg_user表中獲取用戶列表:
SELECT ‘CREATE USER ’|| usename || ‘;’ FROM pg_user WHERE usename 《》 ‘rdsdb’; Produces: CREATE USER acctowner; CREATE USER mrexample; CREATE USER counterexample; CREATE USER mrspremise; CREATE USER mrsconclusion;
你應(yīng)該向你創(chuàng)建的賬戶分配密碼。沒有方法用來從源數(shù)據(jù)庫中提取現(xiàn)有的密碼,所以必須創(chuàng)建新的密碼。
從GitHub下載代碼,展開src目錄,在AdminViews目錄中找到腳本。在你的Amazon Redshift集群中創(chuàng)建一個(gè)名為admin的模式,運(yùn)行每一個(gè)以v_開始的腳本來創(chuàng)建視圖。你可以如下所示,用SQL語句訪問創(chuàng)建的視圖:
SELECT * FROM admin.v_generate_schema_ddl; Schema name: Admin ddl: Create schema admin
運(yùn)行v_generate_group_DDL.SQL腳本,在新數(shù)據(jù)庫中創(chuàng)建用戶組:
SELECT ‘CREATE GROUP ’|| groname ||‘;’ FROM pg_group; Produces: CREATE GROUP chosen; CREATE GROUP readonly;
用戶歸屬于用戶組。你可以使用v_get_users-in_group腳本獲取這些關(guān)聯(lián):
SELECT ‘ALTER GROUP ’ ||groname||‘ ADD USER ’||usename||‘;’ FROM admin.v_get_users_in_group; Produces: ALTER GROUP chosen ADD USER mrsconclusion; ALTER GROUP readonly ADD USERmrexample; ALTER GROUP readonly ADD USERmrspremise;
可以運(yùn)行適當(dāng)?shù)哪_本直接從腳本中生成模式,視圖和數(shù)據(jù)表DDL:
v_generate_schema_DDL.SQL, v_generate_table_DDL.SQL v_generate_view_DDL.SQL
你需要在新數(shù)據(jù)庫中為每個(gè)模式設(shè)置適當(dāng)?shù)奶貦?quán)。你可以運(yùn)行如下腳本,在現(xiàn)有數(shù)據(jù)庫中獲取相關(guān)的信息:
SELECT * FROM admin.v_get_schema_priv_by_user WHERE schemaname NOT LIKE ‘pg%’ AND schemaname 《》 ‘information_schema’ AND usename 《》 ‘johnlou’ AND usename 《》 ‘rdsdb’;
在這里你可以看到賦予每個(gè)用戶的多個(gè)不同權(quán)限,這些用戶已經(jīng)被賦予了模式特權(quán)。想要創(chuàng)建運(yùn)行于新數(shù)據(jù)庫中的SQL,你可以使用一個(gè)UDF(用戶定義的函數(shù))為結(jié)果集合中的每一行創(chuàng)建一系列特權(quán)。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%