EN

SQL Server – Flytta databas med hjälp av synonymer

Idag ska vi titta på hur vi kan flytta en databas och med hjälp av synonymer kan vi underlätta övergången, tex om vi behöver göra en ”scale-out” och flytta en av flera databaser som hör ihop men vi vill göra en mjuk övergång eller så kan vi inte ändra anslutningen till nya servern.

En lösning är att generera synonymer som länkar tabeller, vyer, procedurer och funktion mot den nya SQL instans vi flyttar databasen till. Vi behöver även skapa en länkad server. Notera att remote queries medför vanligen en prestanda försämring, så planera väl, vi ska inte använda den här metoden om majoriteten av frågor körs från andra databaser.

Nedan genererar CREATE-script för alla tabeller, vyer, procedure och funktioner i dbo schemat, körs i den befintliga databasen. Skapa först en länkad server från gamla till nya servern.

USE BefintligDB

select name,'CREATE SYNONYM [dbo].[' + name + '] FOR [NYSQL\INSTANS].[FLYTTAD_DB].[dbo].[' + name + '];' from sys.all_objects where type = 'U' and name <> 'dtproperties' order by name
select name,'CREATE SYNONYM [dbo].[' + name + '] FOR [NYSQL\INSTANS].[FLYTTAD_DB].[dbo].[' + name + '];' from sys.all_objects where type = 'V' and object_id > 0 order by name
select name,'CREATE SYNONYM [dbo].[' + name + '] FOR [NYSQL\INSTANS].[FLYTTAD_DB].[dbo].[' + name + '];' from sys.all_objects where type = 'P' and object_id > 0 order by name
select name,'CREATE SYNONYM [dbo].[' + name + '] FOR [NYSQL\INSTANS].[FLYTTAD_DB].[dbo].[' + name + '];' from sys.all_objects where type = 'FN' and object_id > 0 order by name

Spara resultatet av ovan och utför flytten av databasen, tex kan du i förväg ha gjort en full backup och därefter göra en diff vid planerad nertid. Ta därefter bort gamla databasen och skapa en ny tom med samma namn. Kör CREATE-scriptet som du skapade tidigare. Testa att allt fungerar genom att tex göra en SELECT mot en tabell i BefintligDB. Du bör nu kunna se att en remote query körs via länkad server till NYSQL\INSTANS.FLYTTAD_DB.

Testa alltid den här typen av operationer först i test miljö innan du utför i produktionsmiljö.

/Fredrik

Lämna ett svar