Database Death Match - of data file writer thread 3. Corrupt a single 8k block 4. Side‐by‐side...

25
® Database Death Match Oracle vs. SQL Server

Transcript of Database Death Match - of data file writer thread 3. Corrupt a single 8k block 4. Side‐by‐side...

®

Database Death Match

Oraclevs. SQLServer

®

[email protected]

•  17yearsworkingwithOracle

•  Amazon.com’sfirstDBA~1997

•  TechnicalLead,BlueGecko,Inc.–  RemoteadministraNon,supportandexperNse–  Oracle,E‐BusinessSuite,MySQL,PostgreSQL,SQLServer

•  Univ.ofWashingtonOracleinstructor

•  President,WesternWashingtonOracleUsersGroup

•  Co‐author:ExpertOraclePracNces(OakTable)

•  FrequentspeakeratOracleconferences

•  Currentfocus:–  OracleperformanceontheCloud(AmazonEC2)–  Time‐basedtuningforSQLServer

®

RaNonale

•  Fun•  InteresNng•  Notboring•  LearnaboutSQLServer•  Breakthings•  Feelsuperior•  Engageinpretendscience(àlaMythbusters)

®

Caveats

•  OracleandSQLServerarenotthesame•  IamnotaWindowsorSQLServerexpert

•  Mytestsmayhaveapro‐Oraclebias

•  IusedaminimumconfiguraNonandengineeringstandard– Nostandby,replicaNon,logshipping,etc.– Basicout‐of‐boxfuncNonality

®

Method

WindowsServer2008R264‐bit

WindowsServer2008R232‐bit

DellDVDStore2.0

SQLServerDriver

OracleDriver

SQLServer200864‐bit

Enterprise

Oracle11gR264‐bitEnterprise

AmazonElas=cComputeCloud

®

ToolsIUse

•  GNUCoreUNliNes–  tail– dd– sed

•  MicrosoeSysInternalsProcessExplorer

•  sqlcmd

•  sqlplus

®

TheFourOrdeals

1.  LossofvolumecontainingtransacNonlog

2.  Hang/crashofdatafilewriterthread

3.  Corruptasingle8kblock

4.  Side‐by‐sidecompeNNonforresources

®

SQLServerTransacNonLog

•  SimilartoOracle’sredolog(circular)•  AlsoprovidesundofuncNon•  Oneperdatabase(mulNpledatabasesperserver)•  Usuallyonegiantfile,n‘virtual’logswithintheonephysicalfile•  RegularT‐Logbackupsprovide“archive”funcNonality•  IfnobackupbeforeT‐logisfull,filegrows(Fullrecoverymodel)•  Nona=velogredundancymechanism

®

SQLServer:Lossoflogvolume

•  Eachcontenderhasadedicatedvolumeforlogs

1.  ApplyloadwithDS2ds2sqlserverdriver‐‐target=dm‐‐n_threads=5‐‐pct_newcustomers=0

2.  Tailtheerrorlogtail‐f"c:\ProgramFiles\MicrosoftSQLServer\MSSQL10.MSSQLSERVER\MSSQL\Log\ERRORLOG"|seds/\x00//g

3.  Detachlogstoragevolume4.  Observe

SQLServerTransacNonLog

DatabaseServer

DataFileStorage(D:\) Oracle

RedoLogs

®

OracleRedoLogs

•  “OraclerecommendsthatyoumulNplextheonlineredolog.”‐11gR2Docs(standardpracNce)

®

Oracle:Lossoflogvolume

•  Eachcontenderhasadedicatedvolumeforlogs

1.  ApplyloadwithDS2c:\ds2\ds2oracledriver‐‐target=dm‐‐n_threads=5‐‐pct_newcustomers=02.  Tailthealertlogtail‐fc:\app\Administrator\diag\rdbms\dm\dm\trace\alert_dm.log

3.  DetachloggroupAstoragevolume4.  Observe5.  Dropmissinglogfilegroupmembers

SQLServerTransacNonLog

DatabaseServer

OracleLogGroupB

OracleLogGroupAOracle

®

SQLServerLazyWriter

•  NotthesameastheOracleDatabaseWriter•  Writessomedirtybuffersbetweencheckpoints•  Workerthreadsalsowritedirtybuffers•  Checkpointalsowritesdirtybuffers(atcheckpoint)•  Howtofindit?

1>selectsession_id,command,os_thread_id2>fromsys.dm_exec_requestsasr3>joinsys.dm_os_workersasw4>onr.task_address=w.task_address5>joinsys.dm_os_threadsast6>ont.thread_address=w.thread_address7>wheresession_id<=508>orderbysession_id9>go

session_idcommandos_thread_id‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐1RESOURCEMONITOR27762XETIMER29083XEDISPATCHER24164LAZYWRITER13165LOGWRITER24046LOCKMONITOR15927SIGNALHANDLER15169TRACEQUEUETASK154410BRKRTASK154011TASKMANAGER152413CHECKPOINT152014BRKREVENTHNDLR155615BRKRTASK155216BRKRTASK1536

®

SysInternalsProcessExplorer

®

SQLServer:Hang/CrashLazyWriter

1.  ApplyloadwithDS22.  Tailtheerrorlog3.  SuspendtheLazyWriterthread(procexp)

4.  Observe5.  ResumetheLazyWriterthread(procexp)

6.  KilltheLazyWriterthread(procexp)

7.  Observe

®

OracleDatabaseWriter(s)

•  Responsibleforallwritesofdirtyblocks

•  HowtofinditinWindows?

SQL>selectspid,b.name,2description3fromv$processp,4v$bgprocessb5wherep.addr=b.paddr6andp.serial#=b.pserial#;

SPIDNAMEDESCRIPTION‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐2116PMONprocesscleanup2120VKTMVirtualKeeperofTiMeprocess2124GEN0generic02144DIAGdiagnosibilityprocess2148DBRMDataBaseResourceManager2160PSP0processspawner02164DIA0diagnosibilityprocess02168MMANMemoryManager2172DBW0dbwriterprocess02176LGWRRedoetc.2180CKPTcheckpoint2184SMONSystemMonitorProcess2188RECOdistributedrecovery2192MMONManageabilityMonitorProcess2200MMNLManageabilityMonitorProcess22372RVWRRecoveryWriter3972QMNCAQCoordinator2488ARC1ArchivalProcess12440ARC0ArchivalProcess02500ARC2ArchivalProcess22572ARC3ArchivalProcess33960CJQ0JobQueueCoordinator3896SMCOSpaceManagerProcess

®

Oracle:Hang/CrashDatabaseWriter

1.  ApplyloadwithDS22.  Tailthealertlog3.  SuspendtheDBW0thread

4.  Observe5.  ResumetheDBW0thread

6.  KilltheDBW0thread

7.  Observe

®

Single‐BlockCorrupNon

•  SQLServercallsthempages•  Oraclecallsthemblocks•  Bothare8kbydefault

1.  FindthefirstblockoftheCUSTOMERStable2.  SQLServerandOracle“trade”theblock3.  Trytoreadthedata4.  Trytorecovertheblock

®

PhysicalAddressofaSQLServerRow

•  %%PHYSLOC%%istheequivalentofROWID– File:Block:Slot(soundfamiliar?)

1>selecttop102>sys.fn_physlocformatter(%%PHYSLOC%%)3>customerid,firstname4>fromds2.dbo.customers5>go

1>selectphysical_name2>fromds2.sys.database_files3>wherefile_id=44>go

physical_name‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐C:\sql\dbfiles\ds2_2.ndf

physloccustomeridfirstname‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐(4:896:0)1VKUUXF(4:896:1)2HQNMZH(4:896:2)3JTNRNB(4:896:3)4XMFYXD(4:896:4)5PGDTDU(4:896:5)6FXDZBW(4:896:6)7WVZTXZ(4:896:7)8LIWLAI(4:896:8)9NCGWRC(4:896:9)10FUOHXX

®

PhysicalAddressofanOracleRow

•  WeuseROWID/dbms_rowid

SQL>select2dbms_rowid.rowid_relative_fno(rowid),3dbms_rowid.rowid_block_number(rowid),4customerid,firstname5fromds2.customers6whererownum<=10;

SQL>selectname2fromv$datafile3wherefile#=6;

NAME‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐D:\APP\ADMINISTRATOR\ORADATA\DM\CUST.DBF

FILEBLOCKCUSTOMERIDFIRSTNAME‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐61311VKUUXF61312HQNMZH61313JTNRNB61314XMFYXD61315PGDTDU61316FXDZBW61317WVZTXZ61318LIWLAI61319NCGWRC613110FUOHXX

®

SwapthefirstblockofCUSTOMERS1>alterdatabaseds2setoffline2>go

C:\>ddbs=8kskip=896count=1if=d:\sql\dbfiles\cust1.ndfof=c:\sb1

C:\>ddbs=8kskip=131count=1if=d:\app\administrator\oradata\dm\cust.dbfof=c:\ob1

C:\>ddbs=8kconv=notruncseek=896

if=c:\ob1of=d:\sql\dbfiles\cust1.ndfC:\>ddbs=8kconv=notruncseek=131

if=c:\sb1of=d:\app\administrator\oradata\dm\cust.dbf

1>alterdatabaseds2setonline2>go

®

SQLServer&Oracle:ReadCorruptedPage

1>selecttop10firstname2>fromds2.dbo.customers3>goMsg824,Level24,State2,ServerIP‐0AF647E0,Line1SQLServerdetectedalogicalconsistency‐basedI/Oerror:incorrectpageid(expected4:896;actual3:0).Itoccurredduringareadofpage(4:896)indatabaseID5atoffset0x00000000700000infile'C:\sql\dbfiles\cust1.ndf'.AdditionalmessagesintheSQLServererrorlogorsystemeventlogmayprovidemoredetail.

SQL>altersystemflushbuffer_cache;SQL>selectfirstname2fromds2.customers3whererownum<=10;*ERRORatline1:ORA‐01578:ORACLEdatablockcorrupted(file#6,block#131)ORA‐01110:datafile6:'D:\APP\ADMINISTRATOR\ORADATA\DM\CUST.DBF'

®

SQLServer:RecoveryofCorruptBlock1>backuplogds22>todisk='c:\bak\log.bak’3>go

1>restoredatabaseds2page='4:896’2>fromdisk='c:\bak\db.bak'withnorecovery3>go

1>restorelogds22>fromdisk='c:\bak\db.bak'withnorecovery3>go

1>restorelogds22>fromdisk='c:\bak\log.bak'withrecovery3>go

1>alterdatabaseds2setonline2>go

®

Oracle:RecoveryofCorruptBlock

•  Oraclehashadblockrecoversince9i•  Onelinedoesitall!

RMAN>blockrecoverdatafile6block131;

®

THEFINALORDEAL

•  Side‐by‐sidecompeNNonforresources

1.  ApplyloadtobothOracleandSQLServer2.  Verify100%CPUuNlizaNon3.  ObserveTPMnumbers

®

Ques=ons?