Pagaidi! Pagaidi! Tiesa, Å”is nav vÄl viens raksts par SQL Server dublÄjumu veidiem. Es pat nerunÄÅ”u par atkopÅ”anas modeļu atŔķirÄ«bÄm un to, kÄ rÄ«koties ar aizauguÅ”u baļķi.
VarbÅ«t (tikai varbÅ«t) pÄc Ŕī ieraksta izlasÄ«Å”anas jÅ«s varÄsiet pÄrliecinÄties, ka dublÄjums, kas no jums tiek noÅemts, izmantojot standarta lÄ«dzekļus, tiks noÅemts rÄ«tvakar, labi, 1.5 reizes ÄtrÄk. Un tikai tÄpÄc, ka izmantojat nedaudz vairÄk BACKUP DATABASE parametru.
Ja ziÅas saturs jums bija skaidrs, atvainojiet. IzlasÄ«ju visu, ko Google nokļuva frÄzei āhabr sql server backupā, un nevienÄ rakstÄ neatradu pieminÄtu, ka dublÄÅ”anas laiku var kaut kÄ ietekmÄt ar parametriem.
Uzreiz vÄrsÅ”u jÅ«su uzmanÄ«bu uz Aleksandra GladÄenko komentÄru (
RažoÅ”anÄ nekad nemainiet parametrus BUFFERCOUNT, BLOCKSIZE, MAXTRANSFERSIZE. Tie ir radÄ«ti tikai Å”Ädu rakstu rakstÄ«Å”anai. PraksÄ jÅ«s Ätri atbrÄ«vosities no atmiÅas problÄmÄm.
Protams, bÅ«tu forÅ”i bÅ«t gudrÄkajam un publicÄt ekskluzÄ«vu saturu, taÄu diemžÄl tas tÄ nav. Å ai tÄmai ir veltÄ«ti raksti/raksti gan angļu, gan krievu valodÄ (es vienmÄr esmu neizpratnÄ, kÄ tos pareizi nosaukt). Å eit ir daži no tiem, ar kuriem es saskÄros:
TÄpÄc, lai sÄktu, es pievienoÅ”u nedaudz noÅemtu REZERVES sintaksi no
BACKUP DATABASE { database_name | @database_name_var }
TO <backup_device> [ ,...n ]
<...>
[ WITH { <...>
| <general_WITH_options> [ ,...n ] } ]
[;]
<general_WITH_options> [ ,...n ]::=
<...>
--Media Set Options
<...>
| BLOCKSIZE = { blocksize | @blocksize_variable }
--Data Transfer Options
BUFFERCOUNT = { buffercount | @buffercount_variable }
| MAXTRANSFERSIZE = { maxtransfersize | @maxtransfersize_variable }
<...>
<ā¦> - tas nozÄ«mÄ, ka tur kaut kas bija, bet es to noÅÄmu, jo tagad tas neattiecas uz tÄmu.
KÄ jÅ«s parasti veidojat dublÄjumu? KÄ viÅi "mÄca", kÄ izveidot rezerves kopijas miljardos rakstu? KopumÄ, ja man ir nepiecieÅ”ams veikt vienreizÄju kÄdas ne pÄrÄk lielas datu bÄzes dublÄjumu, es automÄtiski ierakstÄ«Å”u apmÄram Å”Ädu:
BACKUP DATABASE smth
TO DISK = 'D:Backupsmth.bak'
WITH STATS = 10, CHECKSUM, COMPRESSION, COPY_ONLY;
--Š»Š°Š“Š½Š¾, CHECKSUM Ń Š½Š°ŠæŠøŃŠ°Š» ŃŠ¾Š»ŃŠŗŠ¾ ŃŃŠ¾Š±Ń ŠŗŠ°Š·Š°ŃŃŃŃ ŃŠ¼Š½ŠµŠµ
Un vispÄr, iespÄjams, Å”eit ir uzskaitÄ«ti 75-90% no visiem parametriem, kas parasti tiek minÄti rakstos par dublÄÅ”anu. Nu ir arÄ« INIT, SKIP. Vai esat apmeklÄjis MSDN? Vai esat redzÄjuÅ”i, ka ir iespÄjas pusotram ekrÄnam? Es arÄ« redzÄju...
JÅ«s droÅ”i vien jau sapratÄt, ka tÄlÄk mÄs runÄsim par trim parametriem, kas palika pirmajÄ koda blokÄ - BLOCKSIZE, BUFFERCOUNT un MAXTRANSFERSIZE. Å eit ir viÅu apraksti no MSDN:
BLOKA IZMÄRS = { bloka izmÄrs | @ blocksize_mainable } ā norÄda bloka fizisko izmÄru baitos. AtbalstÄ«tie izmÄri ir 512, 1024, 2048, 4096, 8192, 16 384, 32 768 un 65 536 baiti (64 KB). NoklusÄjuma vÄrtÄ«ba ir 65 lentes ierÄ«cÄm un 536 citÄm ierÄ«cÄm. Parasti Å”is parametrs nav nepiecieÅ”ams, jo priekÅ”raksts BACKUP automÄtiski atlasa ierÄ«cei atbilstoÅ”o bloka izmÄru. Bloka lieluma iestatÄ«Å”ana nepÄrprotami ignorÄ automÄtisko bloka izmÄra izvÄli.
BUFERSKAITS = { bufera skaits | @ buferskaita_mainÄ«gais } ā definÄ kopÄjo I/O buferu skaitu, kas tiks izmantots dublÄÅ”anas darbÄ«bai. Varat norÄdÄ«t jebkuru pozitÄ«vu veselu skaitļa vÄrtÄ«bu, taÄu liels skaits buferu var izraisÄ«t kļūdu, kas nav atmiÅa, jo Sqlservr.exe procesÄ ir pÄrÄk liela virtuÄlÄ adreÅ”u telpa.
KopÄjo buferu izmantotÄs vietas daudzumu nosaka pÄc Å”Ädas formulas:
BUFFERCOUNT * MAXTRANSFERSIZE
.
MAXTRANSFERSIZE = { maksimÄlais pÄrsÅ«tÄ«Å”anas lielums | @ maxtransfersize_variable } norÄda lielÄko datu paketes lielumu baitos, ar ko apmainÄ«ties starp SQL Server un dublÄjuma kopas datu nesÄju. Tiek atbalstÄ«ti vairÄki 65 536 baiti (64 KB) lÄ«dz 4 194 304 baiti (4 MB).
Es zvÄru ā es to esmu lasÄ«jis iepriekÅ”, bet man nekad nav ienÄcis prÄtÄ, cik liela ietekme tiem varÄtu bÅ«t uz produktivitÄti. TurklÄt acÄ«mredzot man ir jÄizdara sava veida "iznÄkÅ”ana" un jÄatzÄ«st, ka pat tagad es pilnÄ«bÄ nesaprotu, ko viÅi dara. Man, iespÄjams, jÄlasa vairÄk par buferizÄto I/O un darbu ar cieto disku. KÄdreiz es to izdarÄ«Å”u, bet pagaidÄm varu vienkÄrÅ”i uzrakstÄ«t skriptu, kas pÄrbaudÄ«s, kÄ Å”Ä«s vÄrtÄ«bas ietekmÄ dublÄÅ”anas Ätrumu.
Es izveidoju nelielu datu bÄzi, apmÄram 10 GB lielu, ievietoju to SSD un ievietoju HDD dublÄjumkopiju direktoriju.
Es izveidoju pagaidu tabulu, lai saglabÄtu rezultÄtus (man tÄs nav pagaidu, lai es varÄtu sÄ«kÄk izpÄtÄ«t rezultÄtus, bet jÅ«s izlemjat pats):
DROP TABLE IF EXISTS ##bt_results;
CREATE TABLE ##bt_results (
id int IDENTITY (1, 1) PRIMARY KEY,
start_date datetime NOT NULL,
finish_date datetime NOT NULL,
backup_size bigint NOT NULL,
compressed_size bigint,
block_size int,
buffer_count int,
transfer_size int
);
Skripta darbÄ«bas princips ir vienkÄrÅ”s ā ligzdotas cilpas, no kurÄm katra maina viena parametra vÄrtÄ«bu, ievieto Å”os parametrus komandÄ BACKUP, saglabÄ pÄdÄjo ierakstu ar vÄsturi no msdb.dbo.backupset, izdzÄÅ” dublÄjuma failu un nÄkamo iterÄciju. . TÄ kÄ dublÄjuma izpildes dati tiek Åemti no dublÄjuma, precizitÄte ir nedaudz zaudÄta (nav sekunžu daļas), taÄu mÄs to pÄrdzÄ«vosim.
Vispirms jums ir jÄiespÄjo xp_cmdshell, lai dzÄstu dublÄjumus (pÄc tam neaizmirstiet to atspÄjot, ja jums tas nav nepiecieÅ”ams):
EXEC sp_configure 'show advanced options', 1;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC sp_configure 'show advanced options', 0;
GO
Nu patiesÄ«bÄ:
DECLARE @tmplt AS nvarchar(max) = N'
BACKUP DATABASE [bt]
TO DISK = ''D:SQLServerbackupbt.bak''
WITH
COMPRESSION,
BLOCKSIZE = {bs},
BUFFERCOUNT = {bc},
MAXTRANSFERSIZE = {ts}';
DECLARE @sql AS nvarchar(max);
/* BLOCKSIZE values */
DECLARE @bs int = 4096,
@max_bs int = 65536;
/* BUFFERCOUNT values */
DECLARE @bc int = 7,
@min_bc int = 7,
@max_bc int = 800;
/* MAXTRANSFERSIZE values */
DECLARE @ts int = 524288, --512KB, default = 1024KB
@min_ts int = 524288,
@max_ts int = 4194304; --4MB
SELECT TOP 1
@bs = COALESCE (block_size, 4096),
@bc = COALESCE (buffer_count, 7),
@ts = COALESCE (transfer_size, 524288)
FROM ##bt_results
ORDER BY id DESC;
WHILE (@bs <= @max_bs)
BEGIN
WHILE (@bc <= @max_bc)
BEGIN
WHILE (@ts <= @max_ts)
BEGIN
SET @sql = REPLACE (REPLACE (REPLACE(@tmplt, N'{bs}', CAST(@bs AS nvarchar(50))), N'{bc}', CAST (@bc AS nvarchar(50))), N'{ts}', CAST (@ts AS nvarchar(50)));
EXEC (@sql);
INSERT INTO ##bt_results (start_date, finish_date, backup_size, compressed_size, block_size, buffer_count, transfer_size)
SELECT TOP 1 backup_start_date, backup_finish_date, backup_size, compressed_backup_size, @bs, @bc, @ts
FROM msdb.dbo.backupset
ORDER BY backup_set_id DESC;
EXEC xp_cmdshell 'del "D:SQLServerbackupbt.bak"', no_output;
SET @ts += @ts;
END
SET @bc += @bc;
SET @ts = @min_ts;
WAITFOR DELAY '00:00:05';
END
SET @bs += @bs;
SET @bc = @min_bc;
SET @ts = @min_ts;
END
Ja pÄkÅ”Åi nepiecieÅ”ams skaidrojums par to, kas Å”eit notiek, rakstiet komentÄros vai PM. PagaidÄm es jums pastÄstÄ«Å”u tikai par parametriem, kurus ievietoju DUBLÄJUMA DATU BÄZÄ.
BLOCKSIZE mums ir āslÄgtsā vÄrtÄ«bu saraksts, un es neveicu dublÄÅ”anu ar BLOCKSIZE < 4 KB. MAXTRANSFERSIZE jebkuru numuru, kas ir 64 KB reizinÄts ā no 64 KB lÄ«dz 4 MB. ManÄ sistÄmÄ noklusÄjuma vÄrtÄ«ba ir 1024 KB, es izmantoju 512ā1024ā2048ā4096.
GrÅ«tÄk bija ar BUFFERCOUNT - tas var bÅ«t jebkurÅ” pozitÄ«vs skaitlis, bet saite saka
3013. ziÅojums, 16. lÄ«menis, 1. stÄvoklis, 7. rindiÅa DUBLÄJUMA DATU BÄZES darbÄ«ba tiek pÄrtraukta neparasti.
Msg 701, Level 17, State 123, Line 7 Resursu pÅ«lÄ ānoklusÄjumsā nepietiek sistÄmas atmiÅas, lai izpildÄ«tu Å”o vaicÄjumu.
SalÄ«dzinÄjumam es vispirms parÄdÄ«Å”u dublÄjuma palaiÅ”anas rezultÄtus, nenorÄdot nekÄdus parametrus:
BACKUP DATABASE [bt]
TO DISK = 'D:SQLServerbackupbt.bak'
WITH COMPRESSION;
Nu, dublÄÅ”ana un dublÄÅ”ana:
ApstrÄdÄtas 1070072 lapas datubÄzei ābtā, fails ābtā 1. failÄ.
ApstrÄdÄtas 2 lapas datubÄzei ābtā, fails ābt_logā 1. failÄ.
REZERVES DATU BÄZE veiksmÄ«gi apstrÄdÄja 1070074 lapas 53.171 sekundÄ (157.227 MB/sek).
Pats skripts, pÄrbaudot parametrus, nostrÄdÄja pÄris stundÄs, visi mÄrÄ«jumi bija iekÅ”Ä
SELECT TOP 7 WITH TIES
compressed_size,
block_size,
buffer_count,
transfer_size,
DATEDIFF(SECOND, start_date, finish_date) AS backup_time_sec
FROM ##bt_results
ORDER BY backup_time_sec ASC;
Uzmanību, ļoti svarīga piezīme no
Varam droÅ”i teikt, ka saikne starp parametriem un dublÄÅ”anas Ätrumu Å”ajos vÄrtÄ«bu diapazonos ir nejauÅ”a, nav nekÄda modeļa. Bet attÄlinÄÅ”anÄs no iebÅ«vÄtajiem parametriem acÄ«mredzami labi ietekmÄja rezultÄtu
Tie. Tikai pÄrvaldot standarta BACKUP parametrus, dublÄjuma noÅemÅ”anas laiks tika palielinÄts 2 reizes: 26 sekundes, salÄ«dzinot ar 53 sÄkumÄ. Tas nav slikti, vai ne? Bet mums jÄskatÄs, kas notiks ar atjaunoÅ”anu. Ko darÄ«t, ja tagad atveseļoÅ”anÄs prasa 4 reizes ilgÄku laiku?
Vispirms izmÄrÄ«sim, cik ilgs laiks nepiecieÅ”ams, lai atjaunotu dublÄjumu ar noklusÄjuma iestatÄ«jumiem.
RESTORE DATABASE [bt]
FROM DISK = 'D:SQLServerbackupbt.bak'
WITH REPLACE, RECOVERY;
Nu, jÅ«s pats to zinÄt, veidi ir, nomaiÅa nav aizstÄta, atveseļoÅ”anÄs nav atveseļoÅ”anÄs. Un es to daru Å”Ädi:
ApstrÄdÄtas 1070072 lapas datubÄzei ābtā, fails ābtā 1. failÄ.
ApstrÄdÄtas 2 lapas datubÄzei ābtā, fails ābt_logā 1. failÄ.
RESTORE DATABASE veiksmÄ«gi apstrÄdÄja 1070074 lapas 40.752 sekundÄs (205.141 MB/sek).
Tagad es mÄÄ£inÄÅ”u atjaunot dublÄjumkopijas, kas uzÅemtas ar mainÄ«tu BLOCKSIZE, BUFFERCOUNT un MAXTRANSFERSIZE.
BLOCKSIZE = 16384, BUFFERCOUNT = 224, MAXTRANSFERSIZE = 4194304
RESTORE DATABASE veiksmÄ«gi apstrÄdÄja 1070074 lapas 32.283 sekundÄs (258.958 MB/sek).
BLOCKSIZE = 4096, BUFFERCOUNT = 448, MAXTRANSFERSIZE = 4194304
RESTORE DATABASE veiksmÄ«gi apstrÄdÄja 1070074 lapas 32.682 sekundÄs (255.796 MB/sek).
BLOCKSIZE = 16384, BUFFERCOUNT = 448, MAXTRANSFERSIZE = 2097152
RESTORE DATABASE veiksmÄ«gi apstrÄdÄja 1070074 lapas 32.091 sekundÄs (260.507 MB/sek).
BLOCKSIZE = 4096, BUFFERCOUNT = 56, MAXTRANSFERSIZE = 4194304
RESTORE DATABASE veiksmÄ«gi apstrÄdÄja 1070074 lapas 32.401 sekundÄs (258.015 MB/sek).
RESTORE DATABASE priekÅ”raksts atkopÅ”anas laikÄ nemainÄs; Å”ie parametri tajÄ nav norÄdÄ«ti; SQL Server pats tos nosaka no dublÄjuma. Un ir skaidrs, ka pat ar atveseļoÅ”anos var bÅ«t ieguvums - gandrÄ«z par 20% ÄtrÄk (GodÄ«gi sakot, es netÄrÄju daudz laika atkopÅ”anai, es izgÄju vairÄkas "ÄtrÄkÄs" dublÄjumkopijas un pÄrliecinÄjos, ka nav pasliktinÄÅ”anÄs.).
Katram gadÄ«jumam ļaujiet man precizÄt, ka tie nav daži parametri, kas ir optimÄli ikvienam. OptimÄlos parametrus sev var iegÅ«t tikai pÄrbaudot. Es saÅÄmu Å”os rezultÄtus, jÅ«s saÅemsiet dažÄdus rezultÄtus. Bet jÅ«s redzat, ka varat ānoregulÄtā savus dublÄjumus, un tos faktiski var izveidot un izvietot ÄtrÄk.
Es arÄ« ļoti iesaku pilnÄ«bÄ izlasÄ«t dokumentÄciju, jo tajÄ var bÅ«t jÅ«su sistÄmai raksturÄ«gas nianses.
KopÅ” sÄku rakstÄ«t par dublÄjumkopijÄm, uzreiz gribu uzrakstÄ«t vÄl vienu āoptimizÄcijuā, kas ir biežÄk sastopama nekÄ parametru ātuningoÅ”anaā (cik saprotu, to izmanto vismaz daži rezerves utilÄ«ti, varbÅ«t kopÄ ar parametriem aprakstÄ«ts iepriekÅ”), taÄu tas vÄl nav aprakstÄ«ts arÄ« HabrÄ.
Ja mÄs skatÄmies uz otro rindiÅu dokumentÄcijÄ tieÅ”i zem DUBLÄJUMA DATU BÄZES, mÄs redzam:
TO <backup_device> [ ,...n ]
Kas, jÅ«suprÄt, notiks, ja norÄdÄ«siet vairÄkas rezerves_ierÄ«ces? Sintakse to atļauj. Un notiks ļoti interesanta lieta - dublÄjums vienkÄrÅ”i tiks āizkliedÄtsā vairÄkÄs ierÄ«cÄs. Tie. katra āierÄ«ceā atseviŔķi bÅ«s bezjÄdzÄ«ga, pazaudÄta viena, pazaudÄta visa dublÄÅ”ana. Bet kÄ Å”Äda smÄrÄÅ”ana ietekmÄs dublÄÅ”anas Ätrumu?
MÄÄ£inÄsim izveidot dublÄjumu divÄs āierÄ«cÄsā, kas atrodas blakus vienÄ mapÄ:
BACKUP DATABASE [bt]
TO
DISK = 'D:SQLServerbackupbt1.bak',
DISK = 'D:SQLServerbackupbt2.bak'
WITH COMPRESSION;
Pasaules tÄvi, kÄpÄc tas tiek darÄ«ts?
ApstrÄdÄtas 1070072 lapas datubÄzei ābtā, fails ābtā 1. failÄ.
ApstrÄdÄtas 2 lapas datubÄzei "bt", failam "bt"piesakieties failÄ 1.
REZERVES DATU BÄZE veiksmÄ«gi apstrÄdÄja 1070074 lapas 40.092 sekundÄ (208.519 MB/sek).
Vai dublÄÅ”ana no zila gaisa kļuva par 25% ÄtrÄka? Ko darÄ«t, ja pievienosim vÄl pÄris ierÄ«ces?
BACKUP DATABASE [bt]
TO
DISK = 'D:SQLServerbackupbt1.bak',
DISK = 'D:SQLServerbackupbt2.bak',
DISK = 'D:SQLServerbackupbt3.bak',
DISK = 'D:SQLServerbackupbt4.bak'
WITH COMPRESSION;
REZERVES DATU BÄZE veiksmÄ«gi apstrÄdÄja 1070074 lapas 34.234 sekundÄ (244.200 MB/sek).
KopumÄ ieguvums ir aptuveni 35% no dublÄÅ”anas laika, tikai pateicoties tam, ka dublÄjums tiek ierakstÄ«ts 4 failos vienÄ diskÄ vienlaikus. PÄrbaudÄ«ju lielÄku skaitu - portatÄ«vajÄ nav pastiprinÄjuma, optimÄli - 4 ierÄ«ces. Jums - es nezinu, jums ir jÄpÄrbauda. Nu, starp citu, ja jums ir Ŕīs ierÄ«ces - tie tieÅ”Äm ir dažÄdi diski, apsveicam, ieguvumam vajadzÄtu bÅ«t vÄl ievÄrojamÄkam.
Tagad parunÄsim par to, kÄ atjaunot Å”o laimi. Lai to izdarÄ«tu, jums bÅ«s jÄmaina atkopÅ”anas komanda un jÄuzskaita visas ierÄ«ces:
RESTORE DATABASE [bt]
FROM
DISK = 'D:SQLServerbackupbt1.bak',
DISK = 'D:SQLServerbackupbt2.bak',
DISK = 'D:SQLServerbackupbt3.bak',
DISK = 'D:SQLServerbackupbt4.bak'
WITH REPLACE, RECOVERY;
RESTORE DATABASE veiksmÄ«gi apstrÄdÄja 1070074 lapas 38.027 sekundÄs (219.842 MB/sek).
Nedaudz ÄtrÄk, bet kaut kur tuvu, nenozÄ«mÄ«gi. KopumÄ dublÄjums tiek noÅemts ÄtrÄk un atjaunots tÄpat - veiksme? Kas attiecas uz mani, tas ir diezgan veiksmÄ«gs. Å is ir svarÄ«gs, tÄpÄc atkÄrtoju - ja tu ja pazaudÄjat vismaz vienu no Å”iem failiem, jÅ«s zaudÄjat visu dublÄjumu.
Ja skatÄties žurnÄlÄ dublÄjuma informÄciju, kas tiek parÄdÄ«ta, izmantojot Trace Flags 3213 un 3605, jÅ«s ievÄrosiet, ka, veicot dublÄÅ”anu vairÄkÄs ierÄ«cÄs, palielinÄs vismaz BUFFERCOUNT skaits. DroÅ”i vien varat mÄÄ£inÄt izvÄlÄties optimÄlÄkus parametrus BUFFERCOUNT, BLOCKSIZE, MAXTRANSFERSIZE, bet man tas uzreiz neizdevÄs, un man bija slinkums, lai veiktu Å”Ädu pÄrbaudi vÄlreiz, bet citam failu skaitam. Un žÄl riteÅu. Ja vÄlaties organizÄt Å”Ädu testÄÅ”anu mÄjÄs, skriptu nav grÅ«ti pÄrtaisÄ«t.
Visbeidzot, parunÄsim par cenu. Ja dublÄjums tiek noÅemts paralÄli lietotÄju darbam, testÄÅ”anai ir jÄpieiet ļoti atbildÄ«gi, jo, ja dublÄjums tiek noÅemts ÄtrÄk, diski tiek vairÄk noslogoti, palielinÄs procesora slodze (joprojÄm ir jÄsaspiež to lidojumÄ), un attiecÄ«gi samazinÄs sistÄmas kopÄjÄ reaÄ£ÄtspÄja.
Tikai jokoju, bet es lieliski saprotu, ka nekÄdu atklÄsmi neizdaru. IepriekÅ” rakstÄ«tais vienkÄrÅ”i parÄda, kÄ varat izvÄlÄties optimÄlos parametrus dublÄjumkopiju veidoÅ”anai.
Atcerieties, ka viss, ko darÄt, tiek darÄ«ts, uzÅemoties risku un risku. PÄrbaudiet dublÄjumus un neaizmirstiet par DBCC CHECKDB.
Avots: www.habr.com