img

انتقال داده بین SQL Server 2014 و دیتابیس‌های اوراکل ۱۱g

/
/
/

در این مقاله یک دستورالعمل گام به گام را جهت کپی کردن سطرهای جدول بین یک SQL سرور ۲۰۱۴ و یک سرور دیتابیس اوراکل ۱۱g عنوان می‌کنیم. البته نحوه اجرای انتقال دوطرفه است یعنی انتقال از SQL سرور ۲۰۱۴ به سرور دیتابیس اوراکل ۱۱g و بالعکس.

راهکار
برای توسعه دهندگان هوش تجاری (BI) استفاده از SSIS برای انتقال داده‌ها بین دو سرور دیتابیس نامتجانس همچون SQL سرور و اوراکل متداول است. متاسفانه، ویژوال استودیو مربوط به SQL سرور ۲۰۱۴ هرگز توسط مایکروسافت در ورژنی که از انتقالات بین ورژن‌های دیتابیس‌های۶۴ بیتی SQL سرور و اوراکل پشتیبانی می‌کند، منتشر نشد. از آنجاییکه اوراکل ۱۱g یک دیتابیس ۶۴ بیتی است، پس نیاز به تکنولوژی انتقال ۶۴ بیتی دارد.
برای این کار می‌توانیم از یک سرورLinked  داخل نمونه SQL سرور ۲۰۱۴ ، ۶۴بیتی برای فعال کردن انتقال سطرهای جدول بین SQL سرور ۲۰۱۴ و اوراکل ۱۱g استفاده کنیم. Linked Server در SQL سرور ۲۰۱۴ که به دیتابیس اوراکل ۱۱g اشاره دارد امکان اجرای دستورهای DDL برای ایجاد و حذف جدول‌ها و نیز دستورهای DDL برای انتخاب و درج داده‌ها از یک دیتابیس به دیگری را فراهم می‌سازد.
و اینک ترفند گام به گام انتقال داده‌ها از یک دیتابیس SQL سرور ۲۰۱۴، ۶۴ بیتی به دیتابیس اوراکل ۱۱g و بالعکس.
۱- ساخت و تایید اجرای سرورLinked  در یک SQL سرور ۲۰۱۴، ۶۴ بیتی که به دیتابیس اوراکل ۱۱g اشاره دارد
۲- دسترسی به جدولی با سطرهایی  که شما بین سرورها کپی می‌کنید.برای مثال، دانلود فایل پشتیبان و بازگرداندن دیتابیس نمونه برای این ترفند
۳- اجرای کد SQL از طریق SQL Server Linked Server برای ساخت یک جدول هدف در اوراکل تا سطرهای داده‌‌ها را از سرور SQL دریافت کند
۴- ساکن کردن جدول تازه ساخته شده اوراکل با داده‌هایی از سرور SQL و تایید این موضوع که مقادیر کپی شده در اوراکل با داده‌های منبع اصلی در سرورSQL همخوانی دارند.
۵- کپی کردن داده‌ها از اوراکل در سرور SQL و تایید این موضوع که مقادیر کپی شده از اوراکل با داده‌های سورس اصلی از سرور SQL همخوانی دارند.
ساخت یک SQL Server Linked Server برای دسترسی به اوراکل پس از تنظیم سرورLinked ، باید بتوانید تایید کنید که پرس و جوی زیر ۳ سطر از داده‌ها را از  جدول EMPLOYEES در طرح HR از دیتابیس نمونه باز می‌گرداند. این مجموعه نتایج تایید می‌کند که سرورLinked  با دیتابیس اوراکل نمونه به درستی در تعامل است.

— No database context is required for this query
— but the OrclDB linked server must be created as described in
— Creating a SQL Server 2014 Linked Server for an Oracle 11g Database tip
— Confirm the successful creation of the OrclDB linked server
— It returns 3 rows
— DO NOT RUN SUBSEQUENT QUERIES UNTIL THIS QUERY SUCCEEDS

— Required caps for schema and table names
SELECT TOP 3 * FROM OrclDB..HR.EMPLOYEES

تنظیم دمو یا طرز کار انتقال داده‌ها
فایل پشتیبان (SSandOracleDataExchange.bak) مربوط به این نکته را دانلود نمایید. فایل پشتیبان، مربوط به دیتابیسی است که شامل یک جدول با ۲۰۰۰۰ سطر و سه ستون با نام‌های  FIRST_NAME, LAST_NAME و BIRTH_DATE می‌باشد. این جدول در دیتابیسی با نام SSandOracleDataExchange ساخته شده است. نام جدول SQL_SERVER_DATA_FOR_ORACLE  می‌باشد.
شما می‌توانید از اسکریپت زیر برای بازگرداندن دیتابیس SSandOracleDataExchange  در سرور SQL 2014 ، ۶۴ بیتی استفاده نمایید. این اسکریپت به صورت مشروط  کپی دیتابیس را در صورتی که از قبل در سرور وجود داشته باشد، حذف می‌کند.
— Conditionally drop and then restore source database
— with data for copying between SQL Server and
— Oracle database servers
USE [master]
GO
IF EXISTS(select * from sys.databases where name=›SSandOracleDataExchange›)
DROP DATABASE SSandOracleDataExchange
RESTORE DATABASE SSandOracleDataExchange FROM
DISK = N›C:\SSandOracleDataExchange\SSandOracleDataExchange.bak›

پس از بازگرداندن دیتابیس، می‌توانید چند پرس و جوی جدید را اجرا کنید تا با جدول داخل دیتابیس آشنا شوید.
* اولین پرس وجوی زیر مقادیر ستون مربوط به سه سطر از جدول SQL_SERVER_DATA_FOR_ORACLE را نشان می‌دهد ( به نتیجه جستجو در تصویر زیر توجه کنید). مقادیر نام و نام خانوادگی از cross joining مشتق شده، یک زیرمجموعه از داده‌های آماری آمریکا در خصوص نام و نام خانوادگی. تاریخ تولد به صورت تصادفی در محدوده دلخواه در نام‌ها قرار داده شدند.
* دومین پرس و جو تایید می‌کند که ۲۰۰۰۰۰ سطر در جدول SQL_SERVER_DATA_FOR_ORACLE وجود دارند.
* سومین پرس و جو تایید می‌کند که تمام ۲۰۰۰۰۰ سطر در جدول منبع با ترکیب FIRST_NAME, LAST_NAME و مقادیر ستون BIRTH_DATE منحصر به فرد هستند.
USE SSandOracleDataExchange
GO

— Show values for 3 rows from the
— SQL_SERVER_DATA_FOR_ORACLE table
— in the SSandOracleDataExchange database
SELECT TOP 3 *
FROM [SQL_SERVER_DATA_FOR_ORACLE]

— There are 200000 rows in the
— SQL_SERVER_DATA_FOR_ORACLE
SELECT COUNT(*) Count_of_rows_in_SQL_SERVER_DATA_FOR_ORACLE
FROM [SQL_SERVER_DATA_FOR_ORACLE]

— Each of the 200000 rows has a distinct
— set of FIRST_NAME, LAST_NAME, and BIRTH_DATE values
SELECT COUNT(*) Count_of_distinct_rows_in_SQL_SERVER_DATA_FOR_ORACLE
FROM
(
SELECT
DISTINCT
FIRST_NAME
,LAST_NAME
,BIRTH_DATE
FROM [SQL_SERVER_DATA_FOR_ORACLE]
) for_distinct_rows
در اوراکل جدول هدف بسازید تا جدول‌ها را از سرور SQL دریافت نمایید
مرحله بعد در این دمو ساختن جدولی در دیتابیس نمونه اوراکل ۱۱g است برای دریافت سطرهایی از جدول SQL_SERVER_DATA_FOR_ORACLE در سرور SQL . هم سرور SQL  و هم اوارکل از دستور CREATE TABLE برای ساختن دیتابیس جدید استفاده می‌کنند. اگر نام جدولی که سعی می‌کنید بسازید از قبل در همان طرح دیتابیس وجود داشته باشد، این دستور fail می‌شود. بنابراین، باید قبل از فراخواندن دستور CREATE TABLE ببینید که آیا  نام جدول جدید برای جدول فعلی در طرح وجود دارد یا خیر.
با استفاده از سرور OrclDB Linked  ، حداقل دو روش وجود دارد که بفهمیم که که آیا نام جدول از قبل در طرح   HR دیتابیس نمونه که سرور Linked به آن وصل می‌شود، وجود دارد یا نه. از عبارت WHERE با نام بعدی جدول استفاده کنید تا مشخص شود آیا نام جدول جدید قبلاً برای جدول فعلی انتخاب شده است یا خیر. اگر نام جدول جدید از قبل برای جدول موجود تعیین نشده باشد، مقدار p1  در مجموعه نتایج مربوط به پرس و جوی زیر ۰ می‌شود. نمونه کد زیر ساختار مربوط به این روش را نشان می‌دهد. نام بعدی جدول جدید در دمو NAMESANDBIRTHDATES می‌باشد.

— Displays p1 value 0 if Oracle table does not exist
EXEC (

SELECT COUNT(*) p1
FROM
(
SELECT table_name
FROM sys.user_tables
WHERE table_name = ‹›NAMESANDBIRTHDATES››
)
‹) at OrclDB
اگر جدول با نامی که شما در نظر گرفته‌اید از قبل وجود داشته باشد، می‌توانید از نام متفاوتی برای جدول جدید استفاده نمایید، نام جدول جدید را تغییر دهید، یا جدول موجود را حذف نمایید. دومین راه یعنی حذف جدول زمانی مناسب است که جدول موجود شامل مقادیر مرحله‌بندی منسوخ شده باشد که دیگر لازم نیستند. اسکریپت زیر نحوه حذف جدول موجود را با سرور Linked نشان می‌دهد. اگر جدول از قبل وجود نداشت، کادر SSMS Message ، تعداد سطرها را ۰ نشان می‌دهد و هیچ پیام خطایی از SQL Server وجود ندارد.
— Drop Oracle table if it does already exists
EXEC (‹DROP TABLE NAMESANDBIRTHDATES›) at OrclDB

پس از این که نام NAMESANDBIRTHDATES برای جدول جدید در دیتابیس نمونه مورد دسترس قرار گرفت، شما می‌توانید کد SQL زیر را فرابخوانید تا جدول جدید را بسازد. نوع داده‌های VARCHAR2 اوراکل، تعداد کاراکتر طول متغییر را تا ۴۰۰۰ کاراکتر و یک بایت بازای هر کاراکتر را نگاه می‌دارد. نوع داده‌‌های DATE  مقدار datetime را هم در اوراکل و هم سرور SQL نگه می‌دارد.
— Create Oracle table for holding data exported
— from SQL Server
EXECUTE  (

CREATE TABLE NAMESANDBIRTHDATES(
First_Name varchar2(50)
,Last_Name VARCHAR2(50)
,Birth_Date DATE)

)
at OrclDB
انتقال داده‌ها از سرور SQL به اوراکل
پس از ایجاد یک جدول هدف در اوراکل برای دریافت داده‌ها از سرور SQL، می‌توانید از دستور INSERT به همراه دستور SELECT برای مستقر کردن جدولی که ساخته‌اید در اوراکل استفاده نمایید. دستور INSERT ، سرور Linked در سرور SQL را به همراه نام طرح و نام جدول هدف در اوراکل ارجاع می‌دهد. دستور SELECT، جدول موجود در سرور SQL را از جدول منبع (SQL_SERVER_DATA_FOR_ORACLE)  در دیتابیس منبع SSandOracleDataExchange)  انتخاب می‌کند. اسکریپت زیر دیتابیس منبع را از یک دستور USE از پیش فراخوانده شده که متن دیتابیس را در SSandOracleDataExchange تنظیم می‌کند، ارجاع می‌دهد. اگر پرس وجوی SELECT در مقایسه با طرح پیش‌فرض، به داده‌هایی از  یک طرح متفاوت نیاز دارد، نام طرح دیگری را به عنوان پیشوند نام جدول مشخص نمایید.
— Insert data into Oracle table
— from SQL Server table
INSERT INTO OrclDB..HR.NAMESANDBIRTHDATES
SELECT [FIRST_NAME]
,[LAST_NAME]
,[BIRTH_DATE]
FROM [SQL_SERVER_DATA_FOR_ORACLE]
دستور INSERT and SELECT در بالا،  تعداد سطرهای تحت تاثیر قرار گرفته در کادر SSMS Messages رتا نشان می‌دهد. در این دمو، تعداد سطرهایی که تحت تاثیر قرار گرفته‌اند، ۲۰۰۰۰۰  می‌باشد. در کامپیوتری که در این دمو استفاده شده، دستور INSERT and SELECT در ۲ دقیقه و ۵۵ ثانیه تکمیل می‌شود.
پرس وجوی بعدی تعداد سطرهای  منطبق را از جدول لود شده در دیتابیس اوراکل در مقایسه با جدول سورس اصلی در دیتابیس سرور SQL تایید می‌کند. پرس وجوی تایید در ۳ ثانیه کامل می‌شود.

— Verified all rows in Oracle table match rows
— in SQL Server table
SELECT COUNT(*) [Count of rows matched from SQL Server to Oracle]
FROM
(
SELECT * FROM OrclDB..HR.NAMESANDBIRTHDATES

INTERSECT

SELECT [FIRST_NAME]
,[LAST_NAME]
,[BIRTH_DATE]
FROM [SQL_SERVER_DATA_FOR_ORACLE]
) matching_rows

انتقال داده‌ها از اوراکل به سرورSQL
اسکریپت زیر روش کپی کردن سطرها از یک جدول در اوراکل در جدولی در سرور SQL را نشان می‌دهد. اسکریپت با حذف مشروط جدول هدف
(ORACLE_DATA_FOR_SQL_SERVER) در سرور SQL آغاز می‌شود. توجه کنید که ساختار در این اسکریپت از دستور INTO clause of a SELECT     برای مستقر کردن جدول هدف استفاده می‌کند. در این صورت نیاز به اجرای دستور CREATE TABLE حذف می‌گردد. با رفتن از سرور SQL به اوراکل، این اسکریپت ۲۰۰۰۰۰ سطر را به جدول جدید می‌افزاید. در مورد عملکرد، جدول هدف سرور SQL ظرف ۵ ثانیه مستقر می‌گردد.
— Drop SQL Server table for receiving rows
— from Oracle if it already exists
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = N›ORACLE_DATA_FOR_SQL_SERVER›)
DROP TABLE ORACLE_DATA_FOR_SQL_SERVER

— Copy rows from Oracle table to SQL Server table
— Required caps for schema and table names
SELECT * INTO ORACLE_DATA_FOR_SQL_SERVER FROM OrclDB..HR.NAMESANDBIRTHDATES
تایید انتقال داده‌‌ها از طریق مقایسه سطرها در جدول ORACLE_DATA_FOR_SQL_SERVER با داده‌های منبع اصلی در جدول SQL_SERVER_DATA_FOR_ORACLE آسان است. این آزمایش فرض را بر این می‌گذارد که مقادیر در جدول منبع ORACLE از قبل، سطرها را در جدول منبع اصلی سرور SQL مطابقت داده است( که  قبلاً تایید شد). پرس وجوی زیر  روش انجام این کار را نشان می‌دهد. تمام ۲۰۰۰۰۰ سطر در مقایسه مقادیر جدول ORACLE با مقادیر منبع اصلی جدول SQL Server کاملاً مطابقت می‌کنند؛ این پرس و جوی تایید در ۱ ثانیه کامل می‌شود.
— Verified all rows copied from Oracle table match rows
— in original source SQL Server table
SELECT COUNT(*) [Count of rows matched from Oracle to SQL Server]
FROM
(
SELECT * FROM ORACLE_DATA_FOR_SQL_SERVER
INTERSECT
SELECT [FIRST_NAME]
,[LAST_NAME]
,[BIRTH_DATE]
FROM [SQL_SERVER_DATA_FOR_ORACLE]
) matching_rows
مراحل بعدی
– از فایل پشتیبان دیتابیس و فایل اسکریپت SQL مربوط با این مقاله استفاده کنید تا تایید شود که می‌توانید همین نتایج را بدست بیاورید.
– همچنین ارجاع دادن نکته قبلی در ساخت سرورLinked در سرور SQL 2014 در خصوص دیتابیس نمونه که با اوراکل ۱۱g ارسال می‌شود، می‌تواند مفید باشد. در این صورت می‌توانید توانایی خود را برای استفاده از سرورهای Linked به عنوان یک جایگزین برای انتقالات پروژه‌های SSIS 64 بیتی بین سرور  SQL 2014 و اوراکل و ۱۱g تایید کنید. این قابلیت مهم و حیاتی است چراکه پروژه‌های SSIS مربوط به سرور SQL 2014 از انتقالات داده‌های ۶۴بیتی حمایت نمی کنند.
– توجه کنید که نرخ انتقال هنگام رفتن از اوراکل به سرور SQL در مقایسه با رفتن از سرور SQL به اوراکل بسیار سریعتر بود. نتیجه ( انتقال ۲۰۰۰۰۰ سطر در ۵ ثانیه) نشان می‌دهد که روش سرور Linked برای انتقال داده‌ها بخصوص برای کپی کردن داده‌ها از اوراکل به سرور SQLمناسب است. عملکرد کندتر برای انتقال سطرها از سرور SQL به اوراکل ( انتقال ۲۰۰۰۰۰ سطر در ۲ دقیقه و ۵۵ ثانیه) ممکن است یک راهکار دراز مدت قابل قبول برای تامین نیازمندیهای انتقال سطر باشد و یا نباشد. اگر نیست، زمانی که بدنبال یک روش جایگزین سریعتر هستید، می‌توانید حداقل از روش سرور لینک شده به طور موقت استفاده کنید.

نظر بدهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

It is main inner container footer text