MS SQL Server: Cúltaca ar stéaróidigh

Fan! Fan! Fíor, ní alt eile é seo faoi chineálacha cúltacaí SQL Server. Ní labhróidh mé fiú faoi na difríochtaí idir samhlacha aisghabhála agus conas déileáil le logáil atá rófhásta.

B'fhéidir (díreach b'fhéidir), tar éis duit an post seo a léamh, go mbeidh tú in ann a chinntiú go mbainfear an cúltaca a bhaintear uait ag baint úsáide as modhanna caighdeánacha oíche amárach, bhuel, 1.5 uair níos tapúla. Agus ach amháin mar gheall ar an bhfíric go n-úsáideann tú beagán níos mó paraiméadair BACKUP SONRAÍ.

Más léir duit ábhar an phoist, tá brón orm. Léigh mé gach rud a fuair Google don abairt “cúltaca freastalaí sql habr”, agus ní raibh aon tagairt in aon alt amháin agam gur féidir tionchar a imirt ar bhealach éigin ar an am cúltaca ag baint úsáide as paraiméadair.

Díreoidh mé d’aird láithreach ar thuairim Alexander Gladchenko (@mssqlhelp):

Ná athraigh na paraiméadair BUFFERCOUNT, BLOCKSIZE, MAXTRANSFERSIZE i dtáirgeadh. Ní dhéantar iad ach amháin chun ailt den sórt sin a scríobh. Go praiticiúil, gheobhaidh tú réidh le fadhbanna cuimhne in am ar bith.

Ar ndóigh bheadh ​​sé fionnuar a bheith ar an ábhar is cliste agus post eisiach, ach, ar an drochuair, ní hé seo an cás. Tá ailt/postálacha Béarla agus Rúisise araon (bíonn mearbhall orm i gcónaí cad is ceart glaoch orthu) a bheidh dírithe ar an ábhar seo. Seo cuid de na cinn ar tháinig mé trasna orthu: am, два, trí (ar sql.ru).

Mar sin, ar dtús, ceangailfidh mé comhréir chúltaca atá beagán stripped-síos as MSDN (dála an scéil, scríobh mé thuas faoi BACKUP SONRAÍ , ach baineann sé seo go léir le cúltaca loga idirbhirt agus cúltaca difreálach, ach b'fhéidir le héifeacht nach bhfuil chomh soiléir):

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 }
<...>

<…> - ciallaíonn sé go raibh rud éigin ann, ach bhain mé amach é mar anois níl sé ábhartha don ábhar.

Conas a thógann tú cúltaca de ghnáth? Conas a “mhúineann siad” conas cúltacaí a ghlacadh sna billiúin alt? Go ginearálta, más gá dom cúltaca aonuaire a dhéanamh de bhunachar sonraí áirithe nach bhfuil an-mhór, scríobhfaidh mé rud mar seo go huathoibríoch:

BACKUP DATABASE smth
TO DISK = 'D:Backupsmth.bak'
WITH STATS = 10, CHECKSUM, COMPRESSION, COPY_ONLY;
--ладно, CHECKSUM я написал только чтобы казаться умнее

Agus, go ginearálta, is dócha go bhfuil 75-90% de na paraiméadair go léir a luaitear de ghnáth in ailt faoi chúltacaí liostaithe anseo. Bhuel, tá INIT, SKIP ann freisin. Ar thug tú cuairt ar MSDN? An bhfaca tú go bhfuil roghanna ann maidir le scáileán amháin go leith? Chonaic mé freisin...

Is dócha gur thuig tú cheana féin go mbeimid ag caint faoi na trí pharaiméadar a d'fhan sa chéad bhloc cód - BLOCKSIZE, BUFFERCOUNT agus MAXTRANSFERSIZE. Seo iad a gcur síos ó MSDN:

BLOCKSIZE = { blocáilizeize | @ blocksize_variable } - léiríonn sé méid fisiciúil an bhloic i mbearta. Is iad na méideanna a dtacaítear leo ná 512, 1024, 2048, 4096, 8192, 16, 384, agus 32 beart (768 KB). Is é an luach réamhshocraithe 65 le haghaidh gléasanna téipe agus 536 le haghaidh gléasanna eile. De ghnáth ní bhíonn gá leis an bparaiméadar seo toisc go roghnaíonn an ráiteas CÚLRA go huathoibríoch an blocmhéid cuí don fheiste. Má shocraítear méid an bhloic, sáraítear go sainráite an rogha uathoibríoch méid an bhloic.

BUFFERCOUNT = { comhaireamh maolánach | @ buffercount_variable } - Sainmhíníonn sé líon iomlán na maoláin I/O a úsáidfear don oibríocht chúltaca. Is féidir leat aon luach slánuimhir dearfach a shonrú, ach féadfaidh líon mór maoláin a bheith ina chúis le earráid as cuimhne mar gheall ar spás seoladh fíorúil iomarcach sa phróiseas Sqlservr.exe.

Cinntear an méid iomlán spáis a úsáideann maoláin leis an bhfoirmle seo a leanas: BUFFERCOUNT * MAXTRANSFERSIZE.

MAXTRANSFERSIZE = { aistrigh uasta | @ maxtransfersize_variable } sonraítear an méid sonraí is mó i mbearta, i mbearta, le malartú idir Freastalaí SQL agus na meáin tacair cúltaca. Tacaítear le iolraí de 65 beart (536 KB) suas le 64 beart (4 MB).

I mionn - tá sé seo léite agam roimhe seo, ach níor tharla sé riamh dom an tionchar a d'fhéadfadh a bheith acu ar tháirgiúlacht. Thairis sin, de réir dealraimh, ní mór dom cineál “teacht amach” a dhéanamh agus a admháil fiú anois nach dtuigim go hiomlán cad go díreach atá ar siúl acu. Is dócha go gcaithfidh mé níos mó a léamh faoi I/O maolánach agus oibriú le tiomántán crua. Lá éigin déanfaidh mé é seo, ach faoi láthair ní féidir liom ach script a scríobh a sheiceáil conas a théann na luachanna seo i bhfeidhm ar an luas a thógann an cúltaca.

Rinne mé bunachar sonraí beag, thart ar 10 GB i méid, é a chur ar an SSD, agus chuir mé an t-eolaire le haghaidh cúltacaí ar an HDD.

Cruthaím tábla sealadach chun na torthaí a stóráil (níl sé sealadach agam, ionas gur féidir liom na torthaí a thochailt níos mine, ach socraíonn tú duit féin):

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
);

Tá prionsabal na scripte simplí - lúba neadaithe, a athraíonn gach ceann acu luach paraiméadar amháin, cuir na paraiméadair seo isteach san ordú CÚLRA, sábháil an taifead deireanach leis an stair ó msdb.dbo.backupset, scrios an comhad cúltaca agus an chéad atriall eile. . Ós rud é go dtógtar na sonraí forghníomhaithe cúltaca ón tacar cúltaca, cailltear an cruinneas beagán (níl aon chodáin soicind ann), ach mairfidh muid é seo.

Ar dtús ní mór duit xp_cmdshell a chumasú chun cúltacaí a scriosadh (ansin ná déan dearmad é a dhíchumasú mura bhfuil sé de dhíth ort):

EXEC sp_configure 'show advanced options', 1;  
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
EXEC sp_configure 'show advanced options', 0;  
GO

Bhuel, i ndáiríre:

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

Má theastaíonn soiléiriú uait go tobann ar cad atá ag tarlú anseo, scríobh isteach na tuairimí nó PM. Faoi láthair, ní inseoidh mé duit ach faoi na paraiméadair a chuir mé isteach i mBUNACH SONRAÍ CÚLTA.

Le haghaidh BLOCKSIZE tá liosta luachanna “dúnta” againn, agus ní dhearna mé cúltaca le BLOCKSIZE < 4KB. UasMHÉADÚ uimhir ar bith atá ina iolraí de 64KB - ó 64KB go 4MB. Is é 1024KB an réamhshocrú ar mo chóras, ghlac mé 512 - 1024 - 2048 - 4096.

Bhí sé níos deacra le BUFFERCOUNT - is féidir é a bheith ar aon uimhir dhearfach, ach deir an nasc conas a ríomhtar é i mBUNACH SONRAÍ CÚLRA agus cén fáth a bhfuil luachanna móra contúirteach?. Deir sé freisin conas faisnéis a fháil faoi cén BUFFERCOUNT a dhéantar an cúltaca i ndáiríre - domsa tá sé 7. Ní raibh aon phointe ann é a laghdú, agus fuarthas amach go turgnamhach an uasteorainn - le BUFFERCOUNT = 896 agus MAXTRANSFERSIZE = 4194304 thit an cúltaca le earráid (mar atá scríofa sa nasc thuas):

Msg 3013, Leibhéal 16, Luaigh 1, Líne 7 BUNACHAR SONRAÍ CÚLTA ag críochnú go neamhghnách.

Msg 701, Leibhéal 17, Luaigh 123, Líne 7 Níl go leor cuimhne córais sa 'réamhshocraithe' an chomhthiomsaithe acmhainní chun an cheist seo a rith.

Ar mhaithe le comparáid a dhéanamh, taispeánfaidh mé ar dtús torthaí reáchtáil cúltaca gan aon pharaiméadair a shonrú:

BACKUP DATABASE [bt]
TO DISK = 'D:SQLServerbackupbt.bak'
WITH COMPRESSION;

Bhuel, cúltaca agus cúltaca:

Próiseáladh 1070072 leathanach don bhunachar sonraí 'bt', comhad 'bt' ar chomhad 1.

Próiseáladh 2 leathanach don bhunachar sonraí 'bt', comhad 'bt_log' ar chomhad 1.

D'éirigh le próiseáil a dhéanamh ar 1070074 leathanach i 53.171 soicind (157.227 MB/soicind).

D'oibrigh an script féin, ag tástáil na bparaiméadar, i gceann cúpla uair an chloig, bhí gach tomhas isteach scarbhileog google. Agus seo rogha torthaí leis na trí huaire forghníomhaithe is fearr (rinne mé iarracht graf deas a dhéanamh, ach sa phost beidh orm déanamh le tábla, agus sna tuairimí @meascán curtha leis grafaicí an-fhionnuar).

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;

MS SQL Server: Cúltaca ar stéaróidigh

Aird, nóta an-tábhachtach ó @meascán de trácht:

Is féidir linn a rá go muiníneach go bhfuil an gaol idir na paraiméadair agus an luas cúltaca laistigh de na raonta luachanna seo randamach, níl aon phhatrún ann. Ach bogadh ar shiúl ó na paraiméadair ionsuite ar ndóigh bhí éifeacht mhaith ar an toradh

Iad siúd. Is trí bhainistiú na bparaiméadar CÚLTA caighdeánach amháin a bhí gnóthachan faoi dhó in am a bhaint cúltaca: 2 soicind, i gcomparáid le 26 ag an tús. Níl sé sin go dona, ceart? Ach ní mór dúinn a fheiceáil cad a tharlaíonn leis an athchóiriú. Cad a tharlóidh má thógann sé 53 huaire níos faide téarnamh anois?

Ar dtús, déanaimis a thomhas cé chomh fada a thógann sé cúltaca a chur ar ais le socruithe réamhshocraithe:

RESTORE DATABASE [bt]
FROM DISK = 'D:SQLServerbackupbt.bak'
WITH REPLACE, RECOVERY;

Bhuel, tá a fhios agat féin, go bhfuil na bealaí ann, níl athsholáthar in áit, ní aisghabháil é an téarnamh. Agus déanaim é mar seo:

Próiseáladh 1070072 leathanach don bhunachar sonraí 'bt', comhad 'bt' ar chomhad 1.

Próiseáladh 2 leathanach don bhunachar sonraí 'bt', comhad 'bt_log' ar chomhad 1.

D'éirigh le RESORE SONRAÍ 1070074 leathanach a phróiseáil i 40.752 soicind (205.141 MB/soicind).

Anois déanfaidh mé iarracht cúltacaí a tógadh a athbhunú le BLOCKSIZE, BUFFERCOUNT agus MAXTRANSFERSIZE.

BLOCKSIZE = 16384, BUFFERCOUNT = 224, MAXTRANSFERSIZE = 4194304

D'éirigh le RESORE SONRAÍ 1070074 leathanach a phróiseáil i 32.283 soicind (258.958 MB/soicind).

BLOCKSIZE = 4096, BUFFERCOUNT = 448, MAXTRANSFERSIZE = 4194304

D'éirigh le RESORE SONRAÍ 1070074 leathanach a phróiseáil i 32.682 soicind (255.796 MB/soicind).

BLOCKSIZE = 16384, BUFFERCOUNT = 448, MAXTRANSFERSIZE = 2097152

D'éirigh le RESORE SONRAÍ 1070074 leathanach a phróiseáil i 32.091 soicind (260.507 MB/soicind).

BLOCKSIZE = 4096, BUFFERCOUNT = 56, MAXTRANSFERSIZE = 4194304

D'éirigh le RESORE SONRAÍ 1070074 leathanach a phróiseáil i 32.401 soicind (258.015 MB/soicind).

Ní athraíonn an ráiteas RESTORE DATABASE le linn athshlánaithe; ní shonraítear na paraiméadair seo ann; is é SQL Server féin a shocraíonn iad ón gcúltaca. Agus is léir go fiú le téarnamh is féidir gnóthachan a bheith ann - beagnach 20% níos tapúla (Le bheith macánta, níor chaith mé mórán ama ag téarnamh, rith mé trí roinnt de na cúltacaí “is tapúla” agus rinne mé cinnte nach raibh aon mheath ann).

Ar eagla na heagla, lig dom a shoiléiriú nach paraiméadair áirithe iad seo atá optamach do chách. Ní féidir leat ach na paraiméadair is fearr a fháil duit féin trí thástáil. Fuair ​​​​mé na torthaí seo, gheobhaidh tú cinn éagsúla. Ach feiceann tú gur féidir leat do chuid cúltacaí a “thiúnadh” agus gur féidir iad a fhoirmiú agus a imscaradh níos tapúla.

Molaim go láidir freisin an doiciméadú ina iomláine a léamh, mar d’fhéadfadh go mbeadh nuances ann a bhaineann go sonrach le do chóras.

Ó thosaigh mé ag scríobh faoi chúltacaí, ba mhaith liom scríobh láithreach faoi “optamú” amháin eile, atá níos coitianta ná paraiméadair “thiúnadh” (chomh fada agus a thuigim, tá sé in úsáid ag roinnt fóntais chúltaca ar a laghad, b’fhéidir in éineacht leis na paraiméadair. cur síos air níos luaithe), ach níl cur síos déanta fós ar Habré ach an oiread.

Má bhreathnaímid ar an dara líne sa doiciméadú, díreach faoi bhunachar sonraí cúltaca, feicimid:

TO <backup_device> [ ,...n ]

Cad a cheapann tú a tharlóidh má shonraíonn tú roinnt gléasanna cúltaca? Ceadaíonn an chomhréir é. Agus beidh rud an-suimiúil a tharlóidh - beidh an cúltaca a "scaipeadh" ar fud feistí éagsúla. Iad siúd. beidh gach “gléas” ina n-aonar useless, caillte amháin, chaill an cúltaca iomlán. Ach conas a dhéanfaidh smearing den sórt sin difear do luas cúltaca?

Déanaimis iarracht cúltaca a dhéanamh ar dhá “ghléas” atá suite taobh le taobh san fhillteán céanna:

BACKUP DATABASE [bt]
TO 
    DISK = 'D:SQLServerbackupbt1.bak',
    DISK = 'D:SQLServerbackupbt2.bak'   
WITH COMPRESSION;

Aithreacha an domhain, cén fáth a bhfuil sé seo á dhéanamh?

Próiseáladh 1070072 leathanach don bhunachar sonraí 'bt', comhad 'bt' ar chomhad 1.

Próiseáladh 2 leathanach don bhunachar sonraí 'bt', comhad 'bt'logáil' ar chomhad 1.

D'éirigh le próiseáil a dhéanamh ar 1070074 leathanach i 40.092 soicind (208.519 MB/soicind).

Ar éirigh an cúltaca 25% níos tapúla díreach as an gorm? Cad a tharlóidh má chuirimid cúpla gléas eile leis?

BACKUP DATABASE [bt]
TO 
    DISK = 'D:SQLServerbackupbt1.bak',
    DISK = 'D:SQLServerbackupbt2.bak',
    DISK = 'D:SQLServerbackupbt3.bak',
    DISK = 'D:SQLServerbackupbt4.bak'
WITH COMPRESSION;

D'éirigh le próiseáil a dhéanamh ar 1070074 leathanach i 34.234 soicind (244.200 MB/soicind).

San iomlán, is é an gnóthachan thart ar 35% den am a ghlacadh cúltaca ach amháin mar gheall ar an bhfíric go bhfuil an cúltaca scríofa ar 4 comhaid ar diosca amháin ag an am céanna. Sheiceáil mé líon níos mó - níl aon ghnóthachan ar mo ríomhaire glúine, go barrmhaith - 4 fheiste. Ar do shon - níl a fhios agam, ní mór duit seiceáil. Bhuel, dála an scéil, má tá na feistí seo agat - is dioscaí difriúla iad seo i ndáiríre, comhghairdeas, ba cheart go mbeadh an gnóthachan níos suntasaí fós.

Anois, déanaimis labhairt faoi conas an sonas seo a chur ar ais. Chun seo a dhéanamh, beidh ort an t-ordú athshlánaithe a athrú agus gach feiste a liostú:

RESTORE DATABASE [bt]
FROM 
    DISK = 'D:SQLServerbackupbt1.bak',
    DISK = 'D:SQLServerbackupbt2.bak',
    DISK = 'D:SQLServerbackupbt3.bak',
    DISK = 'D:SQLServerbackupbt4.bak'
WITH REPLACE, RECOVERY;

D'éirigh le RESORE SONRAÍ 1070074 leathanach a phróiseáil i 38.027 soicind (219.842 MB/soicind).

Beagán níos tapúla, ach áit éigin gar, ní suntasach. Go ginearálta, baintear an cúltaca níos tapúla agus a athchóiriú ar an mbealach céanna - rath? Maidir liom féin, d’éirigh go maith leis. seo tábhachtach, mar sin arís mé - má tá tú má chailleann tú ar a laghad ceann amháin de na comhaid seo, caillfidh tú an cúltaca iomlán.

Má fhéachann tú sa loga ar an bhfaisnéis chúltaca a thaispeánfar ag baint úsáide as Trace Flags 3213 agus 3605, tabharfaidh tú faoi deara nuair a bheidh cúltaca á dhéanamh agat do roinnt gléasanna, go dtiocfaidh méadú ar a laghad ar líon na n BUFFERCOUNT. Is dócha, is féidir leat iarracht a dhéanamh paraiméadair níos fearr a roghnú le haghaidh BUFFERCOUNT, BLOCKSIZE, MAXTRANSFERSIZE, ach níor éirigh liom ar an bpointe boise, agus bhí mé ró-leisciúil tástáil den sórt sin a dhéanamh arís, ach le haghaidh líon difriúil comhad. Agus is mór an trua é do na rothaí. Más mian leat a leithéid de thástáil a eagrú sa bhaile, níl sé deacair an script a athdhéanamh.

Ar deireadh, déanaimis labhairt faoi phraghas. Má bhaintear an cúltaca i gcomhthráth le hobair na n-úsáideoirí, ní mór duit cur chuige an-fhreagrach a ghlacadh maidir le tástáil, mar má bhaintear an cúltaca níos tapúla, cuirtear brú ar na dioscaí níos mó, méadóidh an t-ualach ar an bpróiseálaí (caithfidh tú a chomhbhrú fós. ar an eitilt), agus dá réir sin, laghdaítear freagrúlacht fhoriomlán an chórais.

Ag magadh, ach tuigim go maith nach ndearna mé aon nochtadh. Níl sa mhéid atá scríofa thuas ach léiriú ar conas is féidir leat na paraiméadair is fearr a roghnú chun cúltacaí a ghlacadh.

Cuimhnigh go ndéantar gach rud a dhéanann tú ar do phriacal agus ar do phriacal féin. Seiceáil do chúltacaí agus ná déan dearmad faoi CHECKDB DBCC.

Foinse: will.com

Add a comment