Post on 28-Mar-2018
®
JeremiahWiltonjwilton@bluegecko.net
• 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
®
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
®
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