Ko'proq

SQL Server Express-da ArcSDE geodatabase ma'lumotlar bazasini zaxiralash uchun Python-dan foydalanayapsizmi?

SQL Server Express-da ArcSDE geodatabase ma'lumotlar bazasini zaxiralash uchun Python-dan foydalanayapsizmi?


SQL Server Express-da saqlangan ArcSDE ma'lumotlar bazalarining zaxira nusxasini yaratish uchun Python-dan foydalanish mumkinmi? Men Arcobjects-dan foydalanadigan maxsus bajariladigan dasturdan foydalanmoqdaman

IDataServerManagerAdmin.BackupGeodatabase ()

lekin, men Python-dan foydalanishni afzal ko'raman. Amalga oshiriladigan dastur bizning IT xodimlarimizni biroz asabiylashtiradi.


Ma'lumotlar bazasi serverida geodatabazaning zaxira nusxasini yaratish ArcCatalog va Arcobjects (IDataServerManagerAdmin.BackupGeodatabase ()) yordamida amalga oshirilishi mumkin. Afsuski, u python yoki Arcpy-ga ta'sir qilmaydi.

Shunday qilib, zaxira nusxasini yaratish jarayonini avtomatlashtirish uchun MS SQL Server-da saqlangan protsedurani yaratishingiz va keyin saqlangan protsedurani chaqirish uchun ommaviy fayl yaratishingiz kerak. Nihoyat, ommaviy faylni rejalashtiring.

Saqlangan protsedura

USE [master] GO / ****** Object: StoredProcedure [dbo]. [Sp_BackupDatabases] ****** / GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo]. [Sp_BackupDatabases] @databaseName sysname null, @backupType CHAR (1), @backupLocation nvarchar (200) AS NOCOUNT yoqilgan; @DBs TABLE-ni e'lon qiling (ID int IDENTITY PRIMARY KEY, DBNAME nvarchar (500)) - HAMMA ma'lumotlar bazalari zaxiralash uchun tanlangan bo'lsa, faqat onlayn bo'lgan ma'lumotlar bazalarini tanlang - Agar ma'lumotlar bazasi zaxiralash uchun tanlangan bo'lsa, uni tanlang @DBs-dan INSERT INTO @DBs (DBNAME) nomini tanlang master.sys.databases-dan bu erda holat = 0 VA name = @ DatabaseName Yoki @DatabaseName NULL ORDER BY Name - Ismni zaxiralashga hojat bo'lmagan ma'lumotlar bazalarini filtrlang. backupType = 'F' DBNAME IN ('tempdb', 'Northwind', 'pubs', 'AdventureWorks') bo'lgan @DB-larni o'chirishni boshlaydi, BOShQA IF END @ backupType = 'D' BEGIN @DB-larni DBNAME IN ('tempdb', 'Northwind', 'pubs', 'master', 'AdventureWorks') BOShQA TUG'ILSA, agar @ backupType = 'L' DBNAME IN ('tempdb', 'Northwind', 'pubs', 'master', 'bo'lgan @DB-larni o'chirishni boshlang AdventureWorks ') BOShQA BOSHNI QAYTISH tugaydi - o'zgaruvchilarni e'lon qiling DECLARE @BackupName varchar (100) DECLARE @BackupFile varchar (100) DECLARE @DBNAME varchar (300) DECLARE @sqlCommand NVARCHAR (1000) DECLARE @dateTOE NVAR (NATE) yilda t - Ma'lumotlar bazalarini birma-bir aylantiring SELECT @Loop = min (ID) FROM @DBs @Loop NULL BEGIN ETMAYDI - Ma'lumotlar bazasi nomlari [dbname] formatida bo'lishi kerak, chunki ba'zilari o'z nomlarida SET - yoki _ ga ega. @DBNAME = '[' + (DBNAME-ni QAYERDA ID = @Loop) + ']' - joriy sana va vaqtni belgilang n yyyyhhmmss format SET @dateTime = REPLACE (CONVERT (VARCHAR, GETDATE (), 101) , '/', ") + '_' + ALMASH (CONVERT (VARCHAR, GETDATE (), 108), ':',") - to'liq, farqli va logli zaxira nusxalari uchun  filename.extension formatida zaxira fayl nomini yarating. IF @backupType = 'F' SET @BackupFile = @ backupLocation + REPLACE (REPLACE (@DBNAME, '[', "), ']',") + '_FULL _' + @ dateTime + '.BAK' ELSE IF @backupType = 'D' SET @BackupFile = @ backupLocation + REPLACE (REPLACE (@DBNAME, '[', "), ']',") + '_DIFF _' + @ dateTime + '.BAK' ELSE IF @backupType = 'L' SET @BackupFile = @ backupLocation + REPLACE (REPLACE (@DBNAME, '[', "), ']',") + '_LOG _' + @ dateTime + '.TRN' - zaxira nusxasini IF-da saqlash uchun nom bering. @backupType = 'F' SET @BackupName = REPLACE (REPL.) ACE (@DBNAME, '[', "), ']',") + 'uchun to'liq zaxira' + @dateTime IF @backupType = 'D' SET @BackupName = REPLACE (REPLACE (@DBNAME, '[', ") ), ']', ") + '' + @dateTime IF uchun differentsial zaxira IF @backupType = 'L' SET @BackupName = REPLACE (REPLACE (@DBNAME, '[',"), ']', ") + ' '+ @dateTime uchun zaxira nusxasi - bajariladigan dinamik SQL buyrug'ini yarating IF @backupType =' F 'BEGIN SET @sqlCommand =' BACKUP DATABASE '+ @ DBNAME +' TO DISK = "+ @ BackupFile +" INIT, NAME = bilan "+ @ BackupName +", NOSKIP, NOFORMAT 'END, agar @backupType =' D 'SET BOSHLADI @sqlCommand =' Zaxira ma'lumotlar bazasi '+ @ DBNAME +' DISK = "+ @ BackupFile +" DIFFERENTIAL, INIT, NAME = "+ @ BackName bilan ", NOSKIP, NOFORMAT 'END BO'LSA, agar @backupType =' L 'BOSHLANADI @sqlCommand =' Zaxira nusxasi '+ @ DBNAME +' TO DISK =" + @ BackupFile + "INIT bilan, NAME =" + @ BackupName + ", NOSKIP, NOFORMAT ' END - hosil qilingan SQL buyrug'ini bajaring EXEC (@sqlCommand) - Keyingi ma'lumotlar bazasini tanlang SELECT @Loop = min (ID) FROM @DBs from ID> @Loop END

Ommaviy fayl

  1. Windows autentifikatsiya dasturidan foydalangan holda SQLEXPRESS mahalliy nomidagi barcha ma'lumotlar bazalarining to'liq zaxira nusxalari uchun

    sqlcmd -S. EXPRESS -E -Q "EXEC sp_BackupDatabases @ backupLocation = 'D: SQLBackups ', @ backupType = 'F'"

  2. SQLLogin va uning paroli yordamida SQLEXPRESS mahalliy nomidagi barcha ma'lumotlar bazalarining zaxira nusxalarini zaxiralash

    sqlcmd -U SQLLogin -P paroli -S. SQLEXPRESS -Q "EXEC sp_BackupDatabases @backupLocation = 'D: SQLBackups', @ BackupType = 'D'"

Va uni Windows Task Scheduler yordamida rejalashtiring.

Malumot: SQL Server Express-da SQL Server ma'lumotlar bazalarining zaxira nusxalarini rejalashtirish va avtomatlashtirish


@Farid Cherning javobiga qo'shilaman, ideal holda buni tashqi skriptli zaxira o'rniga SQL-ga asoslangan zaxira orqali amalga oshirishingiz kerak. Ammo, agar siz python orqali ma'lumotlarni zaxiralashga qaror qilsangiz, men ehtimol ikkita echim haqida o'ylashim mumkin. Iltimos, unutmang, ularning ikkalasi ham ma'lumotlar bazasining zaxira nusxalari emas. Biroq, ular ma'lumotlar bazasidan tashqi ma'lumotlarni saqlashlari mumkin, shuning uchun ma'lumotlar bazasi yo'qolgan taqdirda, siz yangi SDE ma'lumotlar bazasini yaratishingiz va zaxiralangan ma'lumotlarni unga nusxalashingiz mumkin.

Variant 1) SDE ma'lumotlar bazangizdan FileGDB-ga boshqa saytdagi boshqa kompyuterda bo'lishi mumkin bo'lgan bir tomonlama nusxani yarating (arxivlash yoki an'anaviy versiya asosida nusxalash). Keyin python-dan nusxani kerakli vaqtda sinxronlashtirish uchun arcpy-dan foydalanadigan python skriptini rejalashtirishingiz mumkin. Buning ba'zi cheklovlari shundaki, u faqat bitta versiyaning zaxira nusxasini yaratadi (qaysi versiyada nusxasini yaratgan bo'lsangiz ham). Shuningdek, ma'lumotlar bazangiz sxemasini o'zgartirganingizda (maydonlarni qo'shish / o'zgartirish va / yoki xususiyatlar sinflarini / jadvallarini qo'shish / o'zgartirish), siz sxema o'zgarishlarini sinxronlashtirishingiz va / yoki nusxasini qayta yaratishingiz kerak bo'ladi - sxemani o'zgartirish. Bundan tashqari, zaxira nusxasini yaratishni xohlagan barcha xususiyat sinflari versiya sifatida ro'yxatdan o'tkazilishi yoki arxivlashni yoqishi kerak, qaysi nusxa turini ishlatishingizga qarab.

Variant 2) Siz SDE-da har qanday xususiyatlar sinfi, xususiyatlar to'plami, asboblar qutisi, jadval va boshqalarni aylanib o'tadigan python skriptini olish uchun skript yozishingiz mumkin (yoki forumlarda qidirishingiz va saytlarga yordam berishingiz va buning uchun mavjud kodni to'plashingiz mumkin). ma'lumotlar bazasini va ma'lumotlar to'plamini FileGDB-ga nusxalash. Ushbu marshrutdan foydalanganda ba'zi narsalardan ehtiyot bo'lish kerak: agar sizda munosabatlar sinflari mavjud bo'lsa, ehtiyot bo'ling, chunki ArcGIS-da nusxa ko'chirish vositalari tegishli ma'lumotlar bilan bir nechta qiziqarli narsalarni qilishi mumkin, shuning uchun sizning skriptingiz barcha ma'lumotlar to'g'ri ko'chirilganligiga ishonch hosil qilishi kerak (menda ba'zi bir namunaviy kod, agar siz haqiqatan ham ushbu yo'nalishga borishni istasangiz, men sizga yordam beraman). Buning cheklovlari quyidagicha: agar siz buni nazariy jihatdan bir nechta ma'lumot versiyalari uchun qilishingiz mumkin bo'lsa, siz har bir tahrirlash versiyasi uchun alohida FileGDB zaxira nusxasini yaratishingiz kerak bo'ladi, bu sizning zaxira harddrive bo'sh joy talablarini va zaxira nusxasini ishga tushirish uchun zarur bo'lgan vaqt katta bo'lishi mumkin / juda tez. Bundan tashqari, ushbu zaxira qilish usuli zaxira qilish uchun zarur bo'lganidan ancha uzoq vaqt talab qilishi mumkin. Bundan tashqari, har safar zaxira nusxasini yaratmoqchi bo'lganingizda butun ma'lumotlar bazasini qayta yozishni talab qiladi, shuning uchun qattiq diskda diskda ishlashning ko'p sarflanishi bo'lishi mumkin (server / kompyuter uchun ishlamay qolganda rejalashtirilgan bo'lishi kerak) va kerak bo'ladi albatta, FGDB qattiq holatdagi diskka yoki flesh-diskka zaxira nusxasini yaratmaslik kerak, chunki bu jarayon ma'lumotlar bazasining chastotasi va hajmiga qarab diskdagi yozish cheklovlarini nisbatan tez oshirishi mumkin. Bundan tashqari, ushbu usul (qanday nusxa ko'chirish vositalaridan foydalanganingizga qarab) GlobalID maydon qiymatlarini saqlab qolishi mumkin, ammo ularni saqlash kafolatlanmaydi, shuning uchun saqlanib qolgan globalidlar siz uchun zarur bo'lsa, uni ishlatmang.

Shunga qaramay, yana bir javobda tasvirlangan rejalashtirilgan ommaviy fayl usuli yordamida ma'lumotlar bazasining haqiqiy zaxira nusxasini olish uchun SQL-ga asoslangan zaxira nusxasini ishlatishni qat'iy tavsiya qilaman, ammo agar siz Python orqali mutlaqo biror narsa qilishingiz kerak bo'lsa, umid qilamanki, yuqoridagi ma'lumotlar sizga bir nechta fikrlarni beradi bilan ishlash.


Videoni tomosha qiling: Introduction to ArcSDE