มีวิธีการคืนค่าการสำรองฐานข้อมูล SQL Server 2012 เป็น SQL Server 2008 หรือไม่
ฉันพยายามแนบไฟล์แล้วมันไม่ทำงาน
มีวิธีการคืนค่าการสำรองฐานข้อมูล SQL Server 2012 เป็น SQL Server 2008 หรือไม่
ฉันพยายามแนบไฟล์แล้วมันไม่ทำงาน
คำตอบ:
คุณมีสองทางเลือก:
ตัวเลือก A : ฐานข้อมูล Script out ในโหมดความเข้ากันได้โดยใช้ตัวเลือก Generate script:
หมายเหตุ: ถ้าคุณสคริปต์ฐานข้อมูลด้วยสคีมาและข้อมูลทั้งนี้ขึ้นอยู่กับขนาดข้อมูลของคุณสคริปต์จะมีขนาดใหญ่และไม่ถูกจัดการโดย SSMS, sqlcmd หรือ osql (อาจเป็น GB เช่นกัน)
ตัวเลือก B:
สคริปต์ออกตารางแรกก่อนด้วยดัชนีทั้งหมด, FK, ฯลฯ และสร้างตารางเปล่าในฐานข้อมูลปลายทาง - ตัวเลือกที่มี SCHEMA เท่านั้น (ไม่มีข้อมูล)
ใช้ BCP เพื่อแทรกข้อมูล
bcp out ข้อมูลโดยใช้สคริปต์ด้านล่าง ตั้งค่า SSMS ใน Text Mode และคัดลอกผลลัพธ์ที่สร้างโดยสคริปต์ด้านล่างในไฟล์ bat
-- save below output in a bat file by executing below in SSMS in TEXT mode
-- clean up: create a bat file with this command --> del D:\BCP\*.dat
select '"C:\Program Files\Microsoft SQL Server\100\Tools\Binn\bcp.exe" ' /* path to BCP.exe */
+ QUOTENAME(DB_NAME())+ '.' /* Current Database */
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))+'.'
+ QUOTENAME(name)
+ ' out D:\BCP\' /* Path where BCP out files will be stored */
+ REPLACE(SCHEMA_NAME(schema_id),' ','') + '_'
+ REPLACE(name,' ','')
+ '.dat -T -E -SServerName\Instance -n' /* ServerName, -E will take care of Identity, -n is for Native Format */
from sys.tables
where is_ms_shipped = 0 and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
/*and schema_name(schema_id) <> 'unwantedschema' */ /* Optional to exclude any schema */
order by schema_name(schema_id)
เรียกใช้ไฟล์ bat ที่จะสร้างไฟล์. dat ในโฟลเดอร์ที่คุณระบุ
รันสคริปต์ด้านล่างบนเซิร์ฟเวอร์ปลายทางด้วย SSMS ในโหมดข้อความอีกครั้ง
--- Execute this on the destination server.database from SSMS.
--- Make sure the change the @Destdbname and the bcp out path as per your environment.
declare @Destdbname sysname
set @Destdbname = 'destinationDB' /* Destination Database Name where you want to Bulk Insert in */
select 'BULK INSERT '
/*Remember Tables must be present on destination database */
+ QUOTENAME(@Destdbname) + '.'
+ QUOTENAME(SCHEMA_NAME(SCHEMA_ID))
+ '.' + QUOTENAME(name)
+ ' from ''D:\BCP\' /* Change here for bcp out path */
+ REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '')
+ '.dat'' with ( KEEPIDENTITY, DATAFILETYPE = ''native'', TABLOCK )'
+ char(10)
+ 'print ''Bulk insert for ' + REPLACE(SCHEMA_NAME(schema_id), ' ', '') + '_' + REPLACE(name, ' ', '') + ' is done... '''
+ char(10) + 'go'
from sys.tables
where is_ms_shipped = 0
and name <> 'sysdiagrams' /* sysdiagrams is classified my MS as UserTable and we dont want it */
and schema_name(schema_id) <> 'unwantedschema' /* Optional to exclude any schema */
order by schema_name(schema_id)
รันเอาต์พุตโดยใช้ SSMS เพื่อแทรกข้อมูลกลับเข้าไปในตาราง
นี่เป็นวิธี bcp ที่รวดเร็วมากเนื่องจากใช้โหมดเนทีฟ
Some SSIDs and linked servers didn't go across properly
@aucuparia เซิร์ฟเวอร์ที่เชื่อมโยงจะต้องทำการสคริปต์ด้วยตนเอง SSID สามารถ trnasfered ได้โดยใช้ sp_helprevlogin งาน SQLAgent, แพคเกจ ssis ฯลฯ ควรย้ายตามความต้องการของคุณ จุดประสงค์ของวิธีนี้คือการรับข้อมูลให้เร็วที่สุดเมื่อคุณกำลังลดระดับหรือรวมฐานข้อมูล 2 ตัว
ไม่คุณไม่สามารถย้อนกลับไปข้างหน้าได้ คุณสามารถสร้างฐานข้อมูลเปล่าในปี 2008 จากนั้นใช้วิซาร์ดสร้างสคริปต์ใน Management Studio เพื่อเขียนสคริปต์สกีมาและข้อมูล (หรือเครื่องมือเปรียบเทียบบุคคลที่สามจาก Red Gate และอื่น ๆ ) ตรวจสอบให้แน่ใจว่าคุณตั้งค่าเวอร์ชันเป้าหมายที่ถูกต้องเป็น 2008 และคุณจะต้องคัดแยกสิ่งที่เข้ากันไม่ได้ (เช่น OFFSET หรือ FORMAT) ที่คุณอาจใช้ในปี 2012
ไม่มีวิธีที่รองรับในการทำเช่นนี้เนื่องจาก SQL Server ไม่อนุญาตความเข้ากันได้ชนิดนี้
สิ่งที่คุณสามารถทำได้คือ
คืนค่าฐานข้อมูลใน SQL 2012
สร้างสคริปต์สำหรับวัตถุและข้อมูล
หากคุณไม่มี SQL Server 2012 คุณสามารถใช้เครื่องมือของบุคคลที่สามเพื่ออ่านข้อมูลสำรองและแยกข้อมูลและโครงสร้าง
ในกรณีนี้เพียงสร้างฐานข้อมูลเปล่าใน SQL 2008 และใช้เครื่องมือเช่นApexSQL DiffและApexSQL Data Diffเพื่อซิงโครไนซ์วัตถุและข้อมูล คุณสามารถค้นหาสิ่งเหล่านี้ได้จากผู้ค้ารายใหญ่อื่น ๆ เช่น Red-Gate หรือ Idera