MZ@ !L!This program cannot be run in DOS mode. $xa]<3N<3N<3N<3N=3N:N;3N:6O3N:7O33N:0O-3N5xN$3N<2N3Nr2O93NQ6O=3NQ7O`3NQN=3N<N=3NQ1O=3NRich<3NPEde" &*@p`` 0L'pT@@P.text)* `.rdataH @ .@@.data) 2@.pdata0@@_RDATAP0@@.rsrc ` 2@@.relocp<@BH( rHH@H+H+Wf+H+H+n+?LH w+XH 2)H(H(H p+H )H(HQH\$WH A HT$08HL$0HT$0HA HL$0HT$0HA kdH\$8kdH _HL$HT$LD$LL$ SH H (艸H臸H|$0H\$8t^jHHQHT$0HL&7HHݜH )=Hl$H|$ AVH`A ILHEHHL$@K \H\$pHHHuAIH膷_Ht$xHpH;r!HHAHYZu>\HD+Lt$0DD$(\L8Hl$ HHt$x="H\$ptLH II$H"HD$0HD$(L HHLHD$ HT$@m u*HL$@IL\$`Ik I{(IA^H HH ݜH8 E33EAP8 E3E33]: E3E33*8 |HAEA~8 `HɚAEAb8 DAE3D$ AQ1!t5H\$0贵HŵD LC%HHY$H\$0 ?3H8HT$LD$LL$ SVWH0HHt$`H*E3Ht$ LHHjH0_^[H8H m HtkaH ?HH  3HH $ 'HH &Ht Q- #x4AD$ E3AQ/ ]2H8Hфt tBHȄuHJHDHH\$Ht$WH0DAHHAA*#SSHcH+HH2H\$@Ht$HH0_H;=_u H= HHH HDHrH ~DE3H |H,EH=H fYD?t@xH?u;tC2$H\$@Ht$HH0_ð$2H\$@Ht$HH0_AH HT2H\$@Ht$HH0_AbHHHDL+H<HLIH;=D@2xH\$@Ht$HH0_mH;= V2H\$@Ht$HH0_Áht/t*  u~2H\$@Ht$HH0_HHޖH BHH BHt%HH BE3H HuCHH BHH BHt%HoH {BE3H yH)CH:H cVBH\$@2Ht$HH0_H (sH lgH H gH xHH a輌H UP3YH)HFHD$(L NH;L<HD$ H l3|Mj            @SHHH3H$p=u9=Hti=H.AHOH Hm!H AX!3H$pH3HĀ[AHL$PE3BE3HT$PH ܞu$HL$PHHuH 2HL$PsBX H A [AHYEHL$0aB>H -AHT$0H H|$8H$H$H$H|$0HHH-3{ u@sHH ؠLHt$(LHl$ HL$pAHL$p3atKHLD$pHLDHHAEtA€ tAHЄuHYHDESH$H$H$HL$0@H  H HH=gt3HHAHʑEHL$ @RAH\$@HT$ H aH|$(LL$ IEAEtA€ tAHЄuHYHDEta{ uCHIHuRDLHAEtA tBHȄuHZHDEuHL$ ?H\$@3HHH 1AH R3u(HhH <=H H v)=롹EHL HDH\$@HHH \@UH$HPHH3HL$pHUHH$2LMLD$pHgH K[t$3ɃtK1蓫;13膫HEHUL$(3AL$ EH!uHUHMEH L=AIH M}> AH MI]> AH MI=> H$pL vLH$HHUHL$pIx 8kt #=Yt =ta3TH}HH ?H/;Ht%H H $;E3H H;H֎H :HCHH :Ht%HH :E3H Hn;HH :HH 3H7D$ 8H L٠HEE3H9؅RDNDF H+L;DNH(+V&LEHH (@85t'3 .@ƋLEH`H @85t@85u H S 95H$@L$8L$0u3g8@85KnA@HL$xE3;t H 2E3HT$xH EH HL$xP HHHú HHHH+HMI;HIOLާHL$x@t=;A HUHMHMHUHA ڧHMHUHA §kdkd=@t{}HL ˋLEHH $̹LHLjH,LD$xH؋HHL$x6:AXHL$xE3ҳM:t H Œ-E3HT$xH = u$HL$xHHHuH W2HL$x9e  $: @85* HL-kH=tL% tHH 55@85 t%H EA:H NxA‰j=r-LH>A80tH ‘ H @85p HYHt$XLLD$PL HLIEI@856 HT$HHE956HL$@IIEH HD$83HHD$0H͓H\$(HD$ A@85 tH %H ѓDAr4LH9A80tH  H ߐDw@85d HMHt$`H HL$XL IEH B @850 MH|$PMLEIL\$HAIMCALT$@ICAHT$8LlIC3HD$0H2HD$(H>HD$ 35MHL$xMI׋(7AHT$xH IH9]tEHL$xȣt7薣HHT}HHHL$x6MHL$xMI6AHT$xH Ֆ8H9utLHL$xDt>HH{HH'bHL$x6HL$x5t2ƢHHt/譢HH H IA H95 H= HDAEtA€ tAHЄuHYHDED{ u@sHH GLHt$(LL|$ HRAH3D HHAEtA€ tAHЄuHYHDEqH LAAH W3pH =H ؅ &3&H g3_H R@VHHH3H$H$D3~A HL$0E343H$HT$0E3H$H HL$0P HHHú HԸHH}H+HH;HOH5HL-HL$07S33L eLƉ\$ HćH4-LD$PHH$+L 3\$ L$HH$,S H$(E3DC3H=r qjDHL$`OH{HfH7LHH\$(LΉD$ 8HH&LH$H$H$H3^H^A\$ E3AQ뵹ўHLHt3豞LD$0H]HHL$01H TH WVODHL$`OH`HKHL݂HH\$(LΉD$ 8 uHH|H33  DHL$`OHDH LH̃=}r(LHA8t H  H  H8HHHD$(L HLHD$ H H8HL$HT$LD$LL$ SVWH0HHt$XHE3Ht$ LHHH0_^[H\$WHpH L LEH#H HEH=)HHE=9t4u0 H A  3H$Hp_Ë H $H$A I DAr5LHA8tH  H  DH5L t MArLր=sH HD$hLLHHEфIIIEAHCALLD$`LCH|$XLH\$PHT$H3HL$@H HD$8HqLL$0L uLT$(HD$ H$H$Hp_H\$UVWHHH3H$8HfD$p3"A86LD$rHH!D$ HEH$E3D$`*G=7uAHT$`EH-IIB<uAHӋvHH Q~Hu @85HtH=HHD$XLHCL ̀@HIELLD$PL$LD$HLWLD$@LHT$8HHL$0H WHD$(HkHD$ ϋ3H$H$H3蒝H$HĐ_^]H c̺3H$gH$H 3@VH`AH}AHL$@3,@AH|EHL$ + DFH\$pHl$xH  H$HHHt;@ffHH!t HHL$@)HCHHuӃ=HT$ HL$@AHCH|$ H-ffH=HtWAHH豗HIfIB<uH脗HH;uH߄t$< t j HqCHÄuܹJHй OHׄt tBHȄuHzHDHt ?HL$ *HL$@*H$Hl$xH\$pH`^AHH譖zH߄U< L薖 H蝖CHÄu'H L|HT$LD$LL$ SH`H"H3H$@AH|HEHL$ z)H$XHL$ E3H$PH'HzHL$ &H$HHCHt6@HHL$ &HxzHL$ &HH[HuHg{HL$ e&H$xHL$@H\$ 3A=CrHuH {Hv;HHLHL$@<HHL$@HH<uHv'|> u |? uD> HH=D@HtHT$@H%ĔHLD$@Hmy(LHL$@誔HnH8HL$ 'H$XH$PH$@H3跘H`[腖H !zHH y|H\$WH Xxa3H ,AE3E33ҋ )H,AA9Hu+9tHEH }H\$0H _ú H m,HtHw.H.HH֫H+H 4,HL@>t9H ,H,L=@wXH p}[H\$0H _Åu+LH+H }1@8=u H Q~H\$03H _H X}HHHHPL@LH WH@=vHunHpHpHt\HX艒HIE3Ht$ LHH艒aHHwHHFH\$8Ht$0H@_H\$Ht$WH0IHHE3H\$ LHHH\$@Ht$HH0_̋ H%+fH\$WH HHI@HtHPHHG@HOHOHtHPhHGHOH\$0H _{@SH H 3HtHPHHH nH HtHsPHHiH :DH HtHIPHHH PH HtHPHHH fH HtHPHHH H HtHPHHH RH -HtHPHHH H [H%lH(H -HtHaPHHH .H HtH3PHHH vH QHtHPhH7H (H(y@SH` H H8 3HHH|$pmH>HtMHrL E3D$ uHL$0H HHt!H93H H TH|$pu%H JHt HpH )$yH Ht H`H dHƃH`[鈎H`[LHHH3HD$xI[IkIs@y ]H-Hi@BHH/KimHiHHH+HHHHHD$hiʚ;+ȉL$pHtIHHL$0LD$ E3H HHt!H3H H k=H$HHtbHHL$0LYAD$(Hl$ LD$hHH H wHt.HHRLD$hHH ow؍wv=Z`@2H$H H$H$Ht H`H s@H$tFHL$xH3袐HĈHh=t2HhÀ=u7fLu&HH׃A\HhH\$xq28e{ HQP3ۋHЋ诋HD$pHu HH|$`HL$pHL$pHL$pHHHD$pHHxH=HtMHqL E3D$ .HL$0H HHt!H83H H HD$pHZH|$`HHKHHD$pH&H Ht H`H bHD$pƀu'H\$x2HhH\$xHhH(H}H P@H ~H)HRH# mP@H H4H'H8 :P@H (HIHHM P@H =H^HH P@H H}HH7 P@H 'HHRH{H P@H HH(H%"H(H=H DP@H HHHc )P@H SHtHH P`3H HH(rH\$WH HHQH P@HOHG@YHHW P`3HOHGH\$0H _trH\$WH`HGLHQ(HDD$ HL$0E3HHHtH3HH\$p3H`_Hl$Ht$WH H@ tT8u3Hl$8Ht$@H _ÅtKH\$0/Hm H\$0@tDLDJVsHl$8Ht$@H _sHdqEHl$8Ht$@H _LUWAVHHH3H$I[HIs2E3HYH s>E3Lt$0Dt$(D$ EAHHt3AD$@LD$@HAQH΋Lt$0E3D$(E3D$ HVHLt$0D@D$(E3ɺD$ H"HHu(; utH1[sZ1H L}H HL$P'HD$ L"HT$PHH3H3H$H$H$H3ZHĐA^_]H\$Hl$LL$ VWAUAVAWHP=IIDt $tvD$3AH\$0H\$8H\$HTvt$@HH Dljt$DHAuQHD$0LI 3HD$ u=33L\$PI[0Ik8IA_A^A]_^D$AEEHD$03HD$ u =u)HD$0E3HD$(DD|$ HEu*ouMq苃8 um ~BOf!u…y5HCHD$0DHD$(E3D|$ H̓dt ! 8t B$t1DJAtJ(oH\$Ht$WH0AAAHnxs xHmt׋;A|$ H֋EAH\$@Ht$HH0_Hl$VH E3H|$8AHc@u = ;s%H;H R9ltH,LH"DD6utAH\$0ЁH H\$0@t 贁@LŃDmH|$8HtH{ rHl$@H ^Hl$Ht$WH AHAu =?H\$0wHc|X;55sE u= HvHDHF~H /H H$DN׀H @t2@LDEʋlH\$0Hl$8Ht$@H _H\$Hl$Ht$H|$ AVH HcEAH|T';==sADD$PA u3H H N}H 7H H,lNH!|$P @t.@LƃDAEkH\$0Hl$8Ht$@H|$HH A^H\$UVATAUAWH E3AILDAu 5DH|$PLt$X?LIAD $uHH;tygHD0D7Et Ht@t CHtuAtHCHw: s4LH+L~LIAtHH;u@t|3{@tWHu&A5|@KLEjHL@t@A |L@E΃ j Ht @t rHIHLt$XH|$PH\$`H A_A]A\^]Ht$WH AlsHuGH\$0}H@tH[{D 3LJ!iH\$0HHt$8H _Hl$VATAUAVAWH 3AMLDDAu 5OME2H|$XH\$PMIAvHI;Ht LLL+ }HJ At/8t %8u@ tArzHȋzHGHt8fHuŅu|I@tY@t+AH zD @LֹhHH\$PH|$XHl$`H A_A^A]A\^@J'HE| KHl$` HH A_A^A]A\^@SUVWAV0H+HH3H$ HE3ADJDBHH;v%H׋hnu{H oAHL$ HH+H=v2AHT$ AHu2HHH+H=wH+HT$ LAsHt"At3DJ 3g3H$ H3:H0A^_^][H8t1LfffBDtAHЄu<0A HD$@ADHD$ E3A+D$@H8H\$WH@HH3H$0-zH zH;€=Hu Kz2@utsDE3AEtaH HtvAHIuEut.L@HL$0T$ ]AHT$0AHx褃fw Ke H$0H3}H$PH@_H\$VHPHH3H$@=H Cq35yHtH H qxHtH s^d3oxH(H!H HpH H5 (d-H H$`Ht|HHpHHAwtPHHL$@E3vu8HL$@IHL$@AHHDpwuLD$@PH(cH ,pwH@HtHH )zH%HcH ww3XwHD$ IwHD$(:wHD$0H\$ H .xx XwHHuH$`HwvHwxSvHwt6=xqtt H U=u@Hn3vt.=2u =*t1.HT$@t(vHHnD~2H$@H3HzH$hHP^H( ;t ;t H(H%H(@SH0Ht$HHH|$PHLt$(HL|$ MLMtIH+H~LI;tuHl$@tdHKAL43LIH L+HMOiHu@+HLsHKLH HHkHK@2HAH!fHU@"Ǻ"H~D"H~H8RH+HDH!I|$ID"H|$hHLt$ Ht$(Hl$0AHRHA"H8A_A\_[@SH HH HtfHH [H\$Hl$Ht$H|$ AVH MɽIHIELHt*HHÀ<uHI;s3H}HHHH+ HAHDHfIHHu"HCIFHt LHkI~2InH\$0Hl$8Ht$@H|$HH A^H(HA'H;v'H[uHHtH'HHHH(l H\$Hl$H|$ AVH HIHLL;HAHwHYB3HHt$0HH;v)HH'HtHt~Hp'HHF8HH;HBHOHr HA'H;vQHt stH3LI6HI^HI~#Ht$0H\$8Hl$@H|$HH A^k  @SVATAVH(LqHHMI+HH;VHl$PI,H|$XHLl$`HLiL|$ H;w:IHHH+L;w)J)HH;HBHCH=r9HH'H;HH'}sHHx'HHGHt HYsH3HnN<7Hl$pMH^HIvMHHLIIIUA/HrHKH'H+HCHwMHH&sHLIIA/H>HLl$`H|$XHl$PL|$ H(A^A\^[wi] w H\$UVWATAUAVAWH0ILHAH%#"H3HHA@H3HA@H3HA@H3HA@H3HA@H3HA@H3HA@H3HH$LE0IH#HHMH\HUL"I;u ILD$pMKH HH;CtH;t*H[H;CuIAFIH\$xH0A_A^A]A\_^]LHE0HD$pLLmHH9EHT$ HD$( NqHHD$(HHHH@HM]HWxH*HHH H*XHu8WHxH*HHHƃH H*X(^/^g3 :a/r\/s HHH,HH;HGH;sHs H4H;sHHH.HM0L$I#HHUHDH]H;u HD$($HHOH;HtHH;t"H@H;HuHH\$ LLmHE0L-HD$ HD$(LLmHE0Ld$ HD$pL$HSHEL'HWH:H{IMHI#HLL;EuH<M;uH< H9TuH|I>AFH _6vHL3H+LHHI;HGHt?Hr9IHH M;wI;s$H<$HIHHHHLH<$M;tfIIIM;uHH\$WH HH]HHQHWHK#Hl^HHCH\$0GH _@SH HHH ]WHSH HH׀H]HHH [@SH HHH ]]WHSH HH藀H]HHH [H]HAHAH^]HH@SH HHH \WHSH HH'HH [@SH HHH \WHSH HHH]HHH [H\$WH HHl\HHQHWHKH\HH\CH\$0HHGH _HIHt mH\$WH H3HIHt=HW(H+HHrLAH'I+HAHw\IlH_H_ H_(HOHAHH HtH lHHuHO H\$0H _olc@SH HH Ht>HSH+HHrLAH'I+HAHwIl3HHCHCH [b@WH HHHBHH Ht+H\$0@H kHHuH\$0H H _kHZHH]~@SH Ht dkHH [H\$WH H/ZHHH}t (HkH\$0HH _H\$WH HYHHH}t HjH\$0HH _H\$ LD$AVH LIHIHMI+HH;HHt$0H|$8H;H4Hr)HN'H;jHHx'HHGHt HiH3IIFH+HHt.HHrLAH'I+HAHw`IiH>I>IFIFH;t HHH;uHt$0H|$8H\$HH A^HLD$@IH\$HH A^ `Ht$ WH HHHȿHH;HBH\$0H^H HLLt$@HHNH?dHGH~8HF0HFHHH;)Hl$8HH%#"@PDHL^0L3H LL3PLL3PLL3PLL3PLL3PLL3PLL3LM#IL^M L;u IICwISL@L;Bu/LL;t!LHI LAMIRHMBLIHPIC:L;tfHRL;BtOL;uLPI LIILBILJLQL@IHH;Hl$8H\$0Lt$@Ht$HH _LLHI LAMIRHMBLIHPH WnHHHL$ 2HoHL$ YzH(H VmHt$WH0HIHILGIH+H;w?H\$@H1HGHIvHHLH3HH\$@Ht$HH0_LHt$ HE3HhHt$HH0_DHHJHBLHL9IuD9u2@SH0HIDHT$ PHKLHHQI9Qu 9uH0[2H0[@SH0AHsWIHCHCfIB<uHHHH0[HUHQHTHHEHL$H8H sl=%LD$@H\$0HT$ H }HHZHu,q[H  lH\$0H8@LD$@HL 2H%#"AH3D$AHH3D$BHH3D$CHH3D$DHH3D$EHH3D$FHH3D$GHH3HH#HHHJI;tHL;AtH;t HIL;Au3HtOHH9JuH;u L LJLILJ H;uHHHH _HAHHAHB 2dH ojHL$@ZHZuHT$HHXuD$HYH\$HH\$0H8ùM$p̹pH\$Ht$ UWAVHl$H`HH3HEPW3HEHE3HEEWLt$XHLt$PHHEHELu@E0E0EED$xMMMMMMrtwBHT$XHL$P HT$PHL$XE3LE+HL$XE3AP uEhHErujHD$PHEHUHHM@MHEHH+H rRHHA H]0HE@HG]0HWRHA H޽HE0Ds ;iHEwuHD$PE3HD$ L RHM0AP IfIF84uHHH}HHD$xHD$HHU0HGU0HEHD$@E3Lt$8E3Lt$03Dt$(D$ tNHMPHL$PEFALt$PL$`IOHH$ H3TH$hH0A__]H; ѫH8HHD$ H8H\$Ht$H|$UATAUAVAWHl$HMD$ MHLHU bE3AiHMwLHI3HH<HH9H:>7H HH5FPuHfH=u#H HFGtHHHXH=u#H H/JtHHH+H=u/H HJtHHHsHH;mH Ht!HJOuXHLH=4uH IOHHHt%H4H;tE3HTMHHHHt%HH;tE3H#MHH HT$@H+D$0HD$(@DHE3HD$ ydIHL$@eA)HcHI=iuw3HuH )IEHMH9tDHvH>uEHEMHEHUHD$@IHEHEHE؅tHL$@c3HM.fbIcHMHUHXdHH LEHX@HT$@HN薲=L-c1t+HMHsHHEHHEL,HEHHEHEIctILIH =HEAHL$@IIcH(E(MN(EF (MN0b=tSIH GHdA9~(ffIH GH=HA;|IZL.HEHtL 3!LHHF芖L$I[0Is8I{@IA_A^A]A\]H\$HL$UVWATAUAVAWH0H83ILHHHD@8l8HuLjIAEEHbLHAEIUHH HN!L$HIHÀ<uIHWHӋbLHAMLH$IHHZH[LGI FAEIU;fH\$pIUL"3AEI,L %MtAL.l$ H.I~LzJL1HHt9L3I@f3H\$xH0A_A^A]A\_^]HHt᐀8tLHIx],L `Mt L/.l$ H$.Ix1HFHHu댹ILH,DHIHH@DKLAWHH=H3H$I[LIkH-McHMkE3MsLLl$8H\$0\H Ld$0D8(LDH "FIH vHmHeHtAMHHHvID %HT$@E3H$ADl$ qbHL$@'HHuHHHH E"IL9(H$fIM9,$HD8*tNE3H$$~u.HLL ,HLl$ H莆 HH$2H=cHt.GHHHGH ,HjHHL9+cHL9.FH$H+3HL$@K`H$HGyGHH E HI>L$L$H$H$t7:GHй ?G#GIHGI~MvuH=uL$tVI?tPFHй FFIHkGFH (HRGIMuH VDFH$H3JHA_H\$Hl$Ht$H|$ AVH@HH*E3HD$0ILt$8IHYH H\$0D80HDHHt-fDLDt$ LHH:xHCHHu3H\$PHl$XHt$`H|$hH@A^@USVWAUAVAWH$ 4LH+HyH3H3E3E3Dt$0IIHLHtHHD84 u3HHE84uHL$4H= HMHt&E3;~u.HE3LHH胃H L =)D$ L.)HUHM<D3A?HD$@LHHD$ LMHHL$PAHHH<HH_@HؤAE3HM3VI$HHHID$M94$D85tIIMH'[IMHU2_HD$8HHT$8IMZH@IT$HH#HL$PAPHHHL|?HAM$H{CHHt[HH€<uCE3Mt$3HMUI$HuI!=MAD$3HcHM$HBHHBHHʩAD|$8DtfffOHDu;wHH!@4 |fH@|H@uHHHADtAHDu-BHD|$ LMLH/>芌5GHDtGHDuA HE<HAG H_ HƨDfffCLHDuHH< uIADtfAHDuH;H  H/LH3H9xD@43M>I 7CULlL eLMfIM+ffB +uHutMAIMuHI7L $LD$ DHAD$ILD$ L$H$HHI;~BLd$@HD|$8I1Dt$0[@4AH:H@8GLOH D@ffAAMIDuHHA< uIADtAHDuI; M`CIL#D$ H#[HǺ]HWHH@H;Dt@AHDuAH+HI;LBHyIUHA*LEADt$0EA2HE2't"u Euuфu #t*E2FHȄu:u2\uEuA=HVH \HHHEFDtFHDuH"H+H#yHLHxHH$CHH Dt@fCHDuH*|H äH@DtDBHDuH;HB<"t<'uLCL;s :BuIH=HH;L%vsfD \ueHBH;t\CHÃރRw@HAAI 2 - (# "'\\HHHH;uLd$@IMH#WHD$HHHT$H<HD|$ LML6H*8^y<HD|$ LML6H7҆3N<H8;<H8ELEH蝆IT$HtlHtHL$PAPHHtLHH7HJAT I $3[MHH'(I5I $3,MI5|IT$Ht]HHL$PAPHHt=L ěH=7APHA I $3LHH( I $3LI53L$4H3H3Z?H4A_A^A]_^[]׌ȌҌ܌͌HT$LD$LL$ SVWH0Ht$`uN:LW:u;:LP:HH蝄H|$X:HրE3Ht$ LHH:9Hй 99H9H0_^[HtwVLoAAIøøø@HHH3Vh\bynH\$Hl$Ht$WAVAWH0M3IDMHIHM I;t5LL+D-uA_A р-u_D;uOHI;uMMC<=t-u LHL+B +uHutIChIhHju HH<LHD$ EǍKbfH\$PHl$XHt$`H0A_A^_øH\$WH HL9HHH ;P@HٞLn9HH P@HL77HH P@HL,9HH ҝP@tVHtL9HH P@t7HUL6HH P@tLH;:L˹E2H\$0H _H\$0H _H\$Hl$Ht$ WAVAWH0L:3A8ILH<6DG HHT$X87H!68"uLH:3CLT$XHIXH9;t(A5HHl$ MH:DXHE3IHH\$PHl$`Ht$hH0A_A^_@UVWAVHHHlH3H$0HcBXME2HHALȅuEH~HBHH;v HtHEƋB0?tuH~ Eƹ3HIHHF@IH;}H;EHELMt H;A PEtKHT$0H$@HůH$0HH貯LHH:LH\$ AGH$@HH$0H38HHA^_^]H\$Ht$ WAVAWH09-IL2LHu"LHJ93M׏33Hl$XA4DC HHT$P4H38"uMH!9L36LL$PHIH9tEH9MH|$ 3KHHl$XE3IHH\$`Ht$hH0A_A^_@UVWAVHHHLH3H$0HBHME2HHHH;v HtHAB0?tuH;vAHcBX~H3HHH+HF@AH;sH;EHEBMt H;A PEtKHT$0H$@HѭH$0HH辭LHd8LH\$ A3H$@HH$0H36HHA^_^]@UWATAUAVAWHH'H3H$ L=~HHT$X3LL$xE2HL$PIT$HHEM8H$Dl$AL|$`tHz H HMH$H$H VLuLD$PL$@IcIH$L;Lt$h IAHH t|MILD$hM8LD$PL|$`A?=L$@t5HELt$hIHHEL$@LEQIELD$PAyEuȋ|$H=H΋lj|$H-IEH4H5 HELt$hIL;$|$HHL$@=,>LGL ^HcHn)3M%H$HD$0LL$(Ht$ =փtLH*L3ÃmLHt*LŠ3J=LH*L3mt,=PtLoH)L3==$t:H$H )L4LHH$HL$(3HD$ @=ׂtDKHr*L3Âp=t#'LH*HDmq ==wtDH:*L3cHEH3H$H$H$H3*HA_A^A]A\_]H\$WH A0H?I؃HуH d\DLAH\$0H _HcE3~H\$0H _ÉH\$0H _ËE3zH\$0H _E3HBHH\$0H _E3HIHH\$0H _ËJXHHcЅy 3HHHHtH HH\$0H _HH#HH\$0H _Ht2HH\$0H _HtHR AHn"HH\$0H _êܣܣ nϣsss%@VH H9HtqH\$0HYHH|$8HSH{HtLHCtE3H L3HHCH{Ht LCHHHhH{uH|$8H\$0H ^HHHH9~HXHhHpHxHyL`L%{*LhL-t*LpA LxL=K*H?WtD}L (L(H ;("A -;AD ÃKr H>H$hH(L$pL%'L$xL-'L$0FtE3LF3H LLLvMH^t#-<_t% CHÄu+^;s+ËAHuF?ȃHJUHIHuHZH 3H;9tE/HH HIG辁HuI>3HtSL= H;s>/HLH &IEv@H IEbHuA H DAH.HH /*IHP&HHEH  A>HI&H:&DF0H5&AAEHHIAA;H&AH &诀AH %蛀AH %臀AH %sqIHT$ dHH &USIHT$ A HT$ H /-AH %fH~H ~%H %HhH~AL$0L$xL$pH$hH$ H31!H8A_^][ûȫ&:N_}ĬªܫH\$Hl$Ht$ WAVAWH EEHZEHA;}A+AD Hu AԨu HA+HcHH+H;Ld$@Mc@fHcIH+HH;v$? t HH;wH;s yHH;r; ufDHÀ; t T3E~IA <HuA+HcHH+H;yLd$@HH E~+H\$H.Hl$PHt$XH A_A^_H\$Ht$ UWATAVAWHHpE3LHvMIDe8HDHM|$MEt,Lq Mu#L HL3dvAD$ A0?LPAPIHHALE8HHAmLE8HHAVLE8HHI?LE8HHI(H)t$`LE@HEHUHU{HED8 ujD9e@ud_H2W(f.zt f/v(Ӱw@f/w(tOLH(t$ fI~AuA6(t$`LH3 u Wu8A6(t$`iH;H HHDIPIEH;tH HAHDы vOIHpHW(E3HL&u+D@ HHU@HM@D8!uHO(;r y AHW(LE8Hw'ID9e8t{HLHH VP@uHO(A IIAA HU@HLcHE@D8 rHG(IHHH;SMDe8H?=bIB<;uMOHEMHD$ MH]H HH}HEPH8LmH&LHD$ 3sHO(IHD8$uLO8HU@MHT$8HUHT$0D$(H\$ #IL9etH POXHHOXHcHD9gX} AAItH I HH#I6}8 HHLLHL$ 3mrLHLϹMr3L\$pI[0IsHIA_A^A\_]fL_v_vzհ)RH\$Hl$Ht$WH0HIIHHtBH0HxHt3Hl$(LCLD$ 3Ht H{3H\$@Hl$HHt$PH0_H\$WH H9HYHH\$03H _3H(֌3H(H(3H(H\$Hl$Ht$WH 3IHHMuAzHiH/KimHLL+ILIAiʚ;G+HcH4ׂCHHHI+HAH?HHHiHHII;IODHHHl$8Ht$@DًH\$0H _H(HL$0H*!NbHHL$0HHHH(H ApH%IMLL$(HLII3I3̉T$LD$LL$ SWHHHwH3H$0HtHt ;{vPHHuDLHL$03<D$hHT$06oH$0H3HH_[;{rS+KL MtA9tH$pAHT$0HD$ H <H(H UsHtH\$ H HHuH\$ H/sH$sH5sH(DD$LL$ SH@HgvH3H$0H$hLHD$ HT$0AH h~<D$`HT$0&nH$0H3H@[@SH 3HrH; tFHH/rAw H [ÍDFH [Ë\H [HLL+B: u Hu3@UVWATHHA<\t6t2H@H<uHLD$@LHD$ HH|Ht$0HHZHL$`3L=rMt`HHA8,uA|\LqLEIIv5L;s0MIHeuA<\IuHK~肪L=SrEu~Hv5H;s0LHL$@IkeuHT$@HՀ:\uHL$AD$@~;HT$@H.8t2HD$@D|8Hu<Ht H f.\CL$`H$H$H$PH3PHhA^A\_[@USAWH$pHH\H3HpH@HLH;uAH`3H`LD$ HH@\HL$ AL+HH@H3HH@HH<uHtU ?,/<-wH Hr7Hrƅ?\Ƅ @\HHƄ @H@H$HL$0|$0~Luy|$1\urH=npHtfHÀ<uHH=wQHt |;\uHHL$0HHD$1HT$1H;s\JIHL$0H{LHL$0H\=)r*HL$0H$5|$0Hx:3HL$0^HEHNL$1E3HL$03Uu^DE3HPAwHtzHPHHPH;v.fKH{u tHPHH;wHPH;t{\t\HHPH+HPLHL$003AsL$H$AHT$0I0H$I+HpH3GHĐA_[]HpH HpfH(HHu"rl=H~tHH~H(H\$WH AHHHre= ntHnL@03H\$0H _Hr9pTHu<@t6H;c DJ 2H\$0H _HJ3x\tf\H mHA/H\$03H _H(<~u0y\u8H @mHtt H(3ɋH(<\u H(ú: 3HH(LI[T$IKUVWATAUAVAWH L$3$HH$IE2MMڋH1L;LMc(IS(HG;uEAtHHHH HH$H;HH$<=uyLH$H Vt^tuH ItH H H$H;sM8,HXu,HL$`H$LH$L\$h8H$A+L H$(H\$pEHMEL L#IH A_A^A]A\_^]HL$H(IIB< uLHL$0 H(H\$Hl$Ht$ WATAUAVAW:ALLr3MMH=^YD|$8Ld$8@IEI;s6DAEt ,t"=tA D9A88u HII;rA:u3I;sfD uHI;rIEFst ,t=tI;r%t ,t=tA:tuDLMVIMKt!M9Mtu@u MeAG 3H\$0Hl$@Ht$HA_A^A]A\_H\$Hl$ LD$VWATAUAVAW:ILLEE3E(D8)+Dd$@IAt"II<,t Au A;IELIIB<uLA?IG33LMH=WE3DHI;s),t!=tDA 9A88u HII;rA9u%I;s_@ u HI;rI,tD=t?I;r,t =tDIGIM Mvt2I;t-u(A܅x!HD$HHcIA;I3H\$8Hl$PA_A^A]A\_^;sHIHtHH@V9MHu3^LYH\$3Hl$H|$ 3MMH*LbVfHI;s',t=tAB B8 u HII;rA8uffML+ffB +uHut IAIHuM;rIyt"@fIAIIILHyuM2H\$Hl$Ht$WH LAHQHL9ADI,HSI(IHS As>AEHHtALCHSMtLC HHOHSc,LAPHHHu3"HSHCHCH+HCHHHC H HH\$0Hl$8Ht$@H _@SH HH HtC,u3HHCHCH [@SH LT$PHHT$XMHu%IH;HGIv KH;HGDD$`DC,HCLSHSL[ K(L MtADC,2H [MtMIHHuHC2H [H\$WH HAHHH;Au!HHuH\$0H _HHK H HHCLC HNH\$02H _H\$Hl$Ht$H|$ AVH HzE3HHHHHtTH9zs1I,AfC,f r HzsHHHCHHSfDs,HHtH9xHHHuHk C(HDC.HK8HHHGHH;HGAAHA>HuHC0Ht3LC(HHHMHHHhHHHHPH+H+HHHH;KsHHHKHHCfDs,HH\$0Hl$8Ht$@H|$HH A^Hl$WH Ht]HHHtHBHHBHHHuHIHHt!@fHAHHAH Hu3Ho3H\$0Ht$8HquH.HYHtHHH;tHuHwHHtHHH;tHuHwHHt$8H\$0H/HoHtHHAHHAHH(fo,G(Hl$@H _H\$Ht$WH 3HB HrL;HrIH2IGfr.HB HڋD$PDs fS.sffS.t8HAHHIHHH#HK HtrH@HHHHH#ZAH ȋ ȋ ȋ ȋ HC Ht(O ȋ ȋ ȋ ȋ Hs0C(fs,DK8Ht8DAAHAHCHHtHxHOHHHHH0H\$0Ht$8H _H\$Ht$WH HHHÀ<uHSHHtHtLHHIHH\$0Ht$8H _H\$Ht$WH HIIPHHtHtLHHI;HH\$0Ht$8H _@USVWATAUAVAWHhHl$ HGH3H0HMMILHPHcLjLLE@LLEHHLmH;w HHHH+HD$ HE Hu Au@@2@}fI3I+HLhI HEN4>L;wyDmDIM;v[HHH+HAԅ~}tHIIHvIN >LDAM@ HAHI;rLIHAԅy?}tHIIH +IN>@fH[ HˆKI;rIK<.I+HHAԅy;}tHHHH 'HL >L@AM@ HAHI;rHIAԅys}tMHIIH ]HMJmHH+HAԅHUHH HHIN6H[ HˆKI;rIHAԅy]tHIIHIN6@fH HˆOI;rPLL @fAM@ HAHI;rH]HI+HAԅyl}t?HH HHLm}IHAԅ@IH HIHLH HˆOI;rLmHIAԅy}@tIEH HIMHL MAM@ HAHI;rYHL MAM@ HAHI;rIIAԅyR@tIIIIIL}IIN6AM HAOI;rL}II]IHAԅyB@tHIL}IIH I0IN6@H[ HˆKI;rL}IILmIAԅyE@tIIMIEI0IN .M@fAM@ HAHI;rIIAԅyE@tIIIIIN 6MffAM@ HAHI;rPIIAԅyC@tIEIIIM.MJ6MfAMIAAIAIL;rIJ<>H+ILLu IBIHAԅyHIHAԅxHIAԅyH+IHAԅxH;sT}tHHHH /HL 7L@AM@ HAHI;rHH+H;ouHH+LEA+DžA +Dž.+Dž~6HIPIHUI+H+H;~M8IXLLH}I8MhLH]L}HE0L;H0H3HHA_A^A]A\_^[]H\$WH HHH<uHYHH;r|<\tnL>Ht]LvBfDHD F:u)HHI;u8uH\$8H _DEuICIHuffH\$83H _@SH jQttu3H [ H H [@SUWAVAWHPHZ>H3H$@:~Lt$0IHLuz\t HtL?.H$uh\ubHHH<uֽ+E3HL$0udHD$0fDHÀ<uH+HL$0HHL9HH3uHtLHt$ LHL$0 LH$AIIKIH$@H3HPA_A^_][@WH AHt?Hy`At1H\$0HY Ht$8HHHKW`HH;rHt$8H\$0HO HG` HGH _H\$UVWATAUAVAWH`H<H3HD$P3HT$0MHL$(LHt$HH$MIWI+LыN2LD$ D$8H;D$IY$E!M;@A.tH\8R+IIIOȃuA:uHCI;D#HHDI;EIHLD$ M$HLT$(M;hHCI;sNtAHޅuϋHL8Ht HكrHttDƲ.Hˋ9HD#HCHD$0HL$PH3H$H`A_A^A]A\_^]LD$LL$ H8MHD$XLHD$ HH =H8H\$WH HHzEHpHHD9A@OwIcH;LH@p;uH}HLRHH\$0H _H8LL$ MLHH '=H8@SUVWATAUAVAWHH:H3H$H$`MXLHL$PLL\$@A IلHLuI!LՀ%tI;ZHHȄCHH<3E3E3Dt\K0LAKAǃMAEHDDuр$Hl$(LKLD$ HMI I+<`u CHAL<-uKH<-IEـ*u McHH6Dt,K0LAKAǃMAEHDDu I!Hŀ.u?KHÀ*u Hc0HH,Dt%H0HH4ADu3LlumCH:uH:swTnbuaHFHHI;v IH+HILH9CHL\$@HȄzuSHCHع뒀puB<B< w\HIsRtLMdt itDMLcMD|$(HψT$ I L\$@HHHȄcu&I;AHÈHHȄXMMc6H7MD|$(HD$ dI;MHLBE3I HIH+Hlf "D$`EHH~HDEAFHL$`OwH7AJ@ Eƺ|$`uHAHL$`S HL$PHD$`D$8HWD|$0E3HD$(MHt$ 6 L;HLd$PL\$@H"HȄ;I;H%HȄALƈT$ HIHL\$@HHȄIMHMÀTHD$8D|$0HL$(IHt$ L\$@HHȄLd$PCHL\$@ȄI+HH$H3HA_A^A]A\_^][H\$ UVWATAUAVAWH$H H4H3H LP E3L8ILD$@EIHL$PILLIE8<`uCHA<-uKLKMxLEMx*uhAIIIBDt/H0HAIPHuAAAIBDuH;HBI@HFHIAD`dD|d9BDt.IH0HAIPHuAAIIBDuA<.AII*uoAIIBDt2ffI@Iу0H HJI@ABDuI@H;HFHI@HIAD`dD|dA>BDt(I@Iу0H HJA I@BDuAI@IHD| dHL$@H3HXA_A^_^][HL@HHSVWHpHh3L`ILhH+L$MLpILxL5qH$MHMHI?AHLEI@8$tDIUI;HWHHIGH;HGIGHH;v4Hs3(HOIHWHIH;wHHL$MHL$@MHL$ III$H|$@Ll$`I+$t8L$MHՈD$0HD$(`HL$ IHH+3LEt%H9H;sHA H+HH+kHLIHHȅtA.FHLt$XEL|$PLd$hH$u'DI9H;sI+A H+HHp_^[HHp_^[Mt#H+ LɈIHt MuHIH+@fD HDHEuMt#H+ LɈIHt MuHILD$LT$ LL$ L MtAI@HI;t1AIHLD$uMBILD$HMuDHHH\$Hl$Ht$H|$ ATAVAWHH'H3H$L$AAHEEDAHA$AH;LH *DtDCHDu<+t<-u nCHL<0u fHÀ;0tE33EJ= A< w0)A<w7A<wA$WAO+L A;}H} AHHL;u!3A3McI|7FD A;|JA8ADƙAAIAȋI}EuT$ ;|ʅy|A;~}"3A;|A $eHH$H3L$I[ Ik(Is0I{8IA_A^A\M;rAH JAM;rÁw6H HDH HtA At At3:tfLHt :uHIfHHuHT$LD$LL$ LL$Ht:ILHˆHHT$uIQIHT$IHuAHHDEtH+@HRA:uDEu3@SH HcكLDH Mt IHAELBH|$0HcHIH;BwHBjLAx H|$0AX3IHI@IIH [H\$Hl$Ht$ WH H9LHcAHD[HsA Dȋ+A }: AA+?T$4H;vS3AIAD D\$0n3H;vDCD¸FH+A t7A+AAAA ?D$4H;vSAAA ЉT$0A?DD$0D\$4D$0H\$8Hl$@Ht$HH _̋ALHcR+uML HMILIAHA;uL+I;v!HHA;t;ʸAAB3H\$HT$UVWATAUAVAWH MY MLA Mt IIA /MYIC I;AwIA I聿LACAC 3IsI[I3Et$AAEt$A|$xEt |$xA$D$`tHHL$`&Dt%D+Aϋ T$`~+D$`É~HL$xED$xA[CHL$hEt5A+AEˋL+A]H\$pIH A_A^A]A\_^]H\$Ht$WH HcBMȋyLH+uTLH MILIRHA ;u L+DI;ADH ;t;ȿBLt$0IIHIIIK LHxLcKL3LHcNK~HcHH3LIM HIIcFLAt9A E+̋HAA ʼnG*HI;r/DD|$h@HHI;rD|$hD~M;ur&M;us IcFH JD)INt)I@H\$pHH A_A^A]A\_^]H\$Hl$Ht$ WATAUAVAWH DIHD;JLLMHMIAGIcwLcgHA4A;_ \$PNHcLHL,3MIJ(H;LGMtI3H LM?I>K,I4L;sa3A It?MHL+LDfDA H@IIHI PLI H;rDHL;r\$PIIͅ~yHIu˅Hl$`IHt$hA^H\$XH A_A^A]A\_H\$Hl$Ht$ WH HcqHH IIcE3LcfDHIIAHHAH D;|Ht{;s |jKHLt$05LcCHSLHHNy H;]r&H;]s HcKH HD)HH\)HILt$0HH|AlAHHI;rINEDPHI;>0uED0fHI;>0tHt$Pˋ\$8DBЃ w( } <fD/vA((W^AY(WIu E=A(A()|$(AY(uW5#DD$(uAXÁD$ ADd$$E3L$ AA@D$hDe$D] E YXL$ HD$ H %=|r/HD$hH =u |$hAD$ Dd$$DHAPDd$$t$ DHEfD/rH,ǺWDH*EuWL$ 0H0H +4E,3E(E(Y0XWf.L$ zDd$$D$ 0H\$pH;H;}HcGHHDňHH|͈H\$pE43E0E0Yt$ Xt$ Dd$$EuHT$ H %;n,fnf~0\EuuufD/$=fD/fA/ "HƌL;r&L;}s IcGHHDňIL|͈H\$pI蓌L;r'L;ms!IcE HHDňIELl͈H\$pI_L;r=L;us7IcFLT$0LL$P~ L|$xNHHDňILt͈L|$x4ILT$0LL$PL|$xEtmDHA%=Et"A%=wk+Ⱥ0;u;AD\$ ADd$$0Au;DHt$ D@Et*AA@DDX@S0HD$ WH %-@D\@f.ED90AA%=ID9u A~LD$pAILIcEAV+uHML@HPIEA INA;uL+I;vpBDH ;t;ȺBE3ۅ~NDHEt&A%=w=pwWDt$ .AD$ ADd$$ E3DHt$ EtD$lP9D\$hYt$hH\$0H;|$pr!H;}sHcGHHDňHH|͈H蕉L;|$pr!L;}sIcGHHDňIL|͈IeL;l$pr"L;msIcEHHDňIELl͈I4H;\$pr!H;]sHcCHHDňHH\͈HL;t$pr(L;us"IcF}HLňII͈(($H ]f,,,,@UWAUAVAWH E3E2ILtMHE3TfLGH\$PHHt$XLd$`H@t]LHILL;7r/L;wHws%IcF(H HDIHYLqMI趇HwMH:Hwt~EtLLHHmLH;r&H;s!HcK HHLH HZHMHUI=H;s H60LHH HALd$`H\$PMt-L;?r L;>sIcGH HDILyIHt$XIH A_A^A]_]@SVH(DRHHD9Q} 3H(^[L AIc3H|$HE3H9A Lt$XL|$ M<My I-I A@<MufA0IBD$@LD$@Iv2@3IHIȋD+C LAH=wEt,DAA˙IDHH+B AuM+fDC IA I„u3HL$PH3H\$pH`_HhHeH3HD$PLLEyHy I-IMufA0IAHL$PH3訇HhD$@LD$@LIv8HIHIHHHL+ALBAHwEt@@gfffIAADH HH+BAuM+fC IA IuHL$PH3HhIHHMO+MM;rÁsA.sAsA srAAII;v A+AȃtIt.tu=$? AB$? ABʁ0?ɀAJAA3H\$Hl$WATAUAVAWH Ld$pJ,LqxMIHLMH;stHt$PLHL$pH0*Hc~PDT$pE;w$INAHELMt AEDT$pMLAI~ HHHH;rHt$PHl$`I+HH\$XH A_A^A]A\_H\$Hl$VWAVH :HHqxHHLDLHT$@HP(LcЅD$@;wHNHLMt AD$@=sb=s@=s= sVȺ?ɀK?ɀK 0?ɀKtIHـ?8Hl$PI+HH\$HH A^_^H\$Hl$WATAUAVAWH Ld$pJ,LqxMIHLMH;suHt$PLHL$pH@(Hc~QDT$pE;w%INAHELMtAETDT$pMLAI~ HHHH;rHt$PHl$`I+HH\$XH A_A^A]A\_H\$Hl$VWAVH :HHqxHHLDLHT$@H`&LcЅD$@;wHNHLMt ADD$@=sb=s@=s= sVȺ?ɀK?ɀK 0?ɀKtIHـ?7Hl$PI+HH\$HH A^_^LI;r s II)sLHBI;vR4<@s0AA4<@s%AA4<@ssrvw3@SH MLIMM;sA s0II)lHL$P3M;IBI+HHQLH [ÀsIBI;wAR4<@sAB4<@sAB4<@ssrvwLIhHD$P3I+HPLHH [H\$Hl$ VAWHD$8J4E3H|$LLt$ I,A_fL;r EL; AA?@π@s/sAr$A ы ѹIIH;w{svEYAˀ@seEqA΀@sTAy@π@sCsAr8vAw-A A ы ѹ ҁEt/t +u1ALЋLB؋D8|$@AE څAD׋Lt$ H|$H\$(Hl$0A_^H\$Hl$ VHD$0J4H|$LһLt$I,fDL;r E3L; 3A?@π@s/sAr$A ы ѹIIH;w{svEYAˀ@seEqA΀@sTAy@π@sCsAr8vAw-A A ы ѹ ҁ+u'EutALЋLB؋3Lt$H|$H\$ Hl$(^H\$Hl$Ht$H|$ AVHD$0J4Lt$8LI,ML;r E3AADRA4<@s/sAr$A A ȸA 3ALʀs Às)AP4<@ ȸA ÀsVAP4<@EPA4<@s  A ȸA ÀsoAP4<@saEPA4<@sREXA4<@sCsr9vw/ A A ȸA 3LI;r s AÀ7s:HBI;vDBA4<@A ȸA ÀshHBI;vDBA4<@DRA4<@s AA A ȸA ÀHBI;vDBA4<@sdDRA4<@sUDZA4<@sFsAr;vAw0A A A ȸA 3@SWAVH IILLI;HT$`Hl$@Hl$hHt$PL|$XL=f;IH;<w+AGWL$HAIL;sA IANLHL$H ~KL$HLcHMǐMt A AL$HAIL;sA L^ IL;]Ht$PHl$@L|$XM+IH A^_[@SVWATAVH IIHLLI;srHl$PHl$pL|$`L|$x?tOIHT$XMLIP(~3L$XHHHH;sHH;s HH;rHl$PL|$`I+HH A^A\_^[DAsAreAsHAH;vA4<@sFHAH;vQ4<@s$A4<@sAs3Cø3fDHfD AfAA ȋHDHHt ABËH\$Ht$H|$ UATAUAVAWHH`HILupMHLLP(HMLUHtMxЅLULePI;MHU0LI@2A҅M0;Mh HH;MXu%I;s MHU0LIUH@HMHULIUtU0HH@u;U`tzMthDEEE;w"IFAHELMtAEBADEA;w!IFHHL MtAAU0U0DED;LUI;3I;L\$`I[8Is@I{HIA_A^A]A\]MHU0LIUE0;Eht";E`u)MHULIUsHHHI;u3I;u3I;MHU0LIU8HcEXH9E0u(I;s#MHU0LIU HHfDI;MHULIULc؅MtjDEEE;w"IFAHEHHtADBADEU0A;w IFHL MtAAU0U0U0DEID;tI;^sExLMljD$HHӋEhILt$@D$8E`D$0EXD$(Ld$ -#HLHvXHLAHIH;vDH;vx HHuHH;wx u'L;s"I;vx HHuHI;wI;vfDx HHuHI;wH\$WH HH|H[uLChH;H\$0H _MtH+BHRIuH\$Ht$WH HD$PILIL+HI;sHII HIܳLHHH\$0Ht$8H _鿳̸B H̋@SWATAVHxHޱH3HD$HMILG^v0wGu t2t# (=vHP0@Ll$`D$L|$XD$BB :HI;v+A+D$LHHH LHHIAAF u-D BCBCCCBCB3D$)BD$*CHl$pHl$(D$+BD$,Ht$hDL$(H\$ IUAMLIADP0;uHHŃr+\$ 3Ht$hHl$pLl$`L|$XHL$HH3PHxA^A\_[HHD$0D$(D$ \HHH\$L\$(JEEH;s-Aȃ?HAAAD3H;rH\$EEM;rÁs A3HX$D$@D$8$D$0$D$(H$HD$ !HXH\$WH H|$PIL;HIBHtLIHu|$XE+\$PH\$0H _I@SH IHLD$PI;LBMtIH訶u+\$PH [H\$WH H|$XLL;HIFH9|$PHF|$PH;LLBMtIIOu+ߋH\$0H _@SH II蟯HH [L+B:u H„u3M;rAH\$Hl$Ht$H|$ AVH@L9D$xMAILFT$xHL;ALIFHtHT$pH;t LH$L ++DŽ$D$xLHӉt$pIH\$PHl$XHt$`H|$hH@A^H\$Ht$H|$H|$(IMHI;Hu(9|$8t HD$03HHH\$Ht$H|$LL;L+LIMM;ttAI:uHCMI;tAIH:t΋D$8t*HT$03D+Aȉ DBDBvBDB BzH\$Ht$H|$H\$3Ht$H|$H\$Hl$Ht$ HL$WATAUAVAWHPHCID$IHLѽHt$ЅL$L$I;D$D$A;tDDA;t7A;u HGI;HEH;tzHH:ujI;t?A;uA;uH;tRHHI;s A;tI;t A;t6I;u3H;L\$PI[8Ik@IsHIA_A^A]A\_øۋHI;t+fD/@A;tH;A;uHHI;u3A;uHGI;t (H@8+tHH;uHHH;tJ$LOLƉD$@HDd$8ID|$0Dl$(Lt$ 56H;t L$랸H\$Ht$H|$H\$0H9\$(HHF|$(L;HIFLAXH;HBLI;s!HB AIFA:u[I;rH;t?LCHHBǹAIDCH+HL;sEP AF8u/IL;r3H\$Ht$H|$ËA+H\$Ht$H|$sAH\$AHt$H|$LAXLMuAHa3A8HAs A:HBBA A ABLAH:v JAAH:v JAA:v AAH:v JAIJr2H\$Hl$DL$ VWAWH0HD$xLL$hHD$(IHD$pHHD$ HLL$hHIt?H;s:$@t0D+H;CH͋HDPxHD$E3HI,$t&H;s!HLDL+HHPxHH\$PI+Hl$XHH0A__^DEAEHH\$H|$L\$(MHyXM;HMGӀ|$0tM;MGMt/I+ffB MII8AA 8:uMuM;vH\$H|$Ë+H\$H|$H\$H|$H\$Ht$H|$LT$(ILYXM;IIBHH;s#fHFAIB D:uXH;rI;tA<-uA<+u_AL3HMHAHHM;uQHD$@A!HtL03L$$H|$8Ht$0Hl$(H\$ HA_A^A3HMHAH؋AHЀ wHwHw:A$~A;}(L;wu;wIcIDLIM;uM;GHD$@HtLHt HL;vHA""L;wutII AVAWHL|$HE3LLLEI;sHI@ADtIM;rH\$ Hl$(Ht$0H|$8L$$M;t>A<-uA<+u_AL3HMHAHHM;uQHD$@A!HtL03L$$H|$8Ht$0Hl$(H\$ HA_A^A3HMHAH؋AHЀ wHwHw:A$~A;}(L;wu;wIcIDLIM;uM;GHL$@HtLtA"H9tII*IHʸIELD$(HII麘H\$UVWHH*H3HD$pD$3D$aIHEyEyA-HƿH͸L\$`ADAAEB D*A0DT$`EtG@fI˸gfffADAADAB D*A0E EEuH\$aII+HH;HBLH;HL$pH3:H$HĀ_^]H\$WHHH3HD$pH$3MLҍ_EyHyH-I‹ID$`LL$`HuLL$_D$_0HvCHIHHLIAB*ʀ0A IIwυtBfffIɸgfffDAADAB*ʀ0A AEuHD$`II+L;HCLII詚HHL$pH39H$HĀ_IHHM1H\$Hl$Ht$H|$ ATAUAVAWLNE3EAM;s"HțA:Dt:IM;rHD$HLHD$P!3H\$(Hl$0Ht$8H|$@A_A^A]A\M;sɍGըuIM;tMB MM;AMGM;sA,0< s I HM;rM;r=HD$HLHD$P@-u EtɃ"pD HceD [ADA+MI@fA HA< sM;ruT<wCK LH.uMuMJIM;rMtAA+AMLžI 5A@MuHM;sA A< s IM;rM;s.uIM;sfDA,0< sIM;rAA+M;sA,0< rIM;reM;A,EIM;ACըuVIM;uNIHD$HLE@-}HL;Wt HD$P"H~ -AM;sH@E A0A s.-u +ƒU A I HM;rċ؀-EIʅuvCHBI;vÍA<v v3RB<>v3ꀀ|FøøMMI;s_DMtU r=HBI;w,A<vA <wDBA@<>v AA|w _>w'HII;rHD$(M+HH@IHL$(M+IHQHM;rÁ AËAI@I;vAPLM;rAs AÍ_>wH QAI@I;vA@H \AAu,B<v wAHA<>v 退|v3øǿ}M;s2AÁwQH  Aft?f;wM;rAI@I;vËAHA3E3I;s/ A_<>w 3HHLI;rIHl$Ht$ ATAUAVAWHl$HJ4IH\$(E3H|$0LL=zIIE^L;r EL;I AA A< vs B9?IBH;w0A<vA <w"ARB<>vB<|wA 뗍IzEH;wIYH;xAkA^HGH;wHCH;wu AtAABHH ABHH ABHH H AABDHIL ABIL ABIL AAH L AAHH AAHH HH H AAHH AAHH AAHH K I#H IHHHH#J"H#I#HL#H HHHHH#H#HH#L;IIAAHH AAHH AAHH H J"I#H HHHHH#H H#HH#HH ;LLAJ vs B:@IIH;w1JvJ w!AYK>vK|w  AEt1t"+u3ALЋL&DBAD8t$PAE څAD֋H|$0H\$(Hl$8Ht$@A_A^A]A\Hl$Ht$ WATAUAWHt$HJ<H\$(H-wILt$0AIII H;r E3L;53A  A< vs )BHBH;w3A<vA <w%DBA@<>vA@<|wAA 떍HZEH;wMAL;wAj^HCH;wI@H;wAu uE3BHH BHH BHH H EDrEHL IBIL BIL AAL L AAIL AAIL AIL AAIL AAIL AAIL K>I#H IHHHH#K:I#I#HL#H IHHHH#I#HL#M;HIAAAHH AAHH AAHH H J:I#H HHHHH#I#HH#HH ;HMEAH vAs E(AEIIH;w5AHv AH w#AYK>vK|wAD AAA+u)EutAHЋL1DBA3Lt$0H\$(Hl$8Ht$@A_A]A\_H\$Hl$Ht$H|$ H|$(JHt$0IMLH H-5tDL;r E3\A A< vs  )=IBH;w.A<vA <w ARB<>vB<|w A AL;r E3_AB< vs *@ICH;w1B<vB <w#ECA@<>vA@<|wA A A+u7EuEtALALH3H\$Hl$Ht$H|$ ËLA`MtHcHHHIH8w3HA$HA$Lk H;vfx HHuHH;wx uL;sI;vx HHuHI;wI;v@x HHuHI;wL\$(EE L;s5@ffA AЃ?IAAAD3L;rDH\$E H\$Hl$Ht$WATAUAVAWH0H$E3MHHEI;Hu D9$tH$L(Dh{HLH+HIH;sefffHMDl$(LHH|$ HPtUHLHHAOȸEAHHH;r3H\$`Hl$hHt$pH0A_A^A]A\_Ë$t'H$A+D)YDqv ;Y ADiH\$DL$ UVWATAUAVAWH H$N$H$LH$H3H\$`EH,H 0IH$3ILH$LI;bH;VMM;D$xuHOI;tH;$;$IMHI3ɃOȃv4H9I;HH;HLjHƈHÃuMLwM;H$PtwA;$.;$!H$I;vIH+LHHrHH MtB !HHMI;rHt$pH\$PH+Hl$XHHt$`H A_A^A]A\_HX$D$@D$8$D$0$D$(H$HD$ HXHX$D$@D$8$D$0$D$(H$HD$ HXH\$Hl$Ht$WATAUAVAWH`H5IIHHAHt$ЅL$E3I;dD$$;@A;;$u HGI;HEHMHHAOȅt6LcM<L;MHH_wIID$H;HH:I;A$;IA;utH;HLHHAOȅt!HLHHAOHHI;s A;tI;t$;t=I;H;AAL\$`I[0Ik8Is@IA_A^A]A\_øAHI;tzD7Dt$PD;tcH;E;udHLHHAOȅt!HLHHAO$HHI;u3MD;$uHGI;t D0HDt$PHMHH|$XHEMăHHDOHAOȅt!HMHHAOHH;Et*McM4L;wIHT$XHuu8IDt$PHLHHAOȅuA;teHLHHAOȅt.HLHHDt$PA̓OȋHLDt$PH8HË$LLƉD$@HӋ$H͉D$8$D$0$D$(Ld$ H;H\$Hl$Ht$WATAUAVAWH`HIIHHAHt$ЅL$E3I;tD$$;@A;;$u HGI;HEHMHHAOȅt6LcM<L;(MHHsIID$&H;HHVXH : I;A$;@A;u{H;HLHHAOȅt!HLHHAOHHI;s A;tI;t$;t=I;H;AAL\$`I[0Ik8Is@IA_A^A]A\_øAHI;txD7A;tcH;A;udHLHHAOȅt!HLHHAO$HHI;u3OD;$uHGI;tD0HHMHH|$XHEMăHHDOHAOȅt!HMHHAOHAHFXD4Dt$PH;EtwMcM4L;wHT$XHpDt$PHLHHAOȅHLHHAOȋH{HLHHAOȅu HFXD84uHË$LLʼnD$@HӋ$HΉD$8$D$0$D$(Ld$ H;HIDt$PH\$VWAVH@HlgH3HD$0HLL$*IHڋLD$ LI<H;wMHT$ HhH HH;rHL$0H3H\$pH@A^_^H\$ UVWATAUAWMHLHHt.L I;sLifBDtHI;rI;t.LH\$@tLiBDt'PHuA$!3LH\$PA_A]A\_^]LE3AIr-u%HA4$~I;tA_D$8A%E$8+uHI;tA D$8A\/+0uEHI;t^80tHH 0 WHDHHI;MLFI;t%0 wCHDQI;uHI;u.HtAIcH\$PA_A]A\_^]AH\$PA_A]A\_^]MLt$HHLp M;MFހ0 w,fffCHDQHI;tH0 vH+ՋHdAHAHHtHHLt$HH\$PA_A]A\_^]I;uI;t 0 v AHiʚ;HDHI;t],0< wTC DHHBHI;t ,0< v\E;wWuE;wPuD;\$8wGAHiʚ;AHHkdAHVAHiʚ;AHHH IK3H;vA$"HEHH%z%R{%D{%.{%y%z%z%z%xz%jz%\z%vx%x%x%x%y%y%"z%y%z%hx%z%x%y%y%y%y%x%z%w%w%nz%y%Rz%y%w%w%w%4y%Vx%x%w%w%y%y%w%y%x%y%y%y%z%Xx%y%lx@SH H3vHvtvHȺ H [H%uHL$H8|vt)H rHD$8HYHD$8HHHBHHD$@H HkH HHkH aHL HkH aHL H 0 H8H(H(̉L$H(utD$0)H qHD$(HqHD$(HHHZHˎ HkH T$0HH ~ MH(H\$ WH@H)sHHT$PHE3tHt2Hd$8HL$XHT$PLHL$0LHL$`HL$(3H\$ tH\$hH@_@SVWH@HrH3E3HT$`HQtHt9Hd$8HL$hHT$`LHL$0LHL$pHL$(3H\$ "tǃ|H@_^[H(MA8HI H(@SEHALALtA@McPLHcL#IcJHCHHCDt DLL3I[ffH; y_uHfuH@SH 3Z'uZ$tsoH YuRt H YnZtYTCuH [ùH(3H(H(oH(YH\$Ht$WH06@2@t$ ؋ 6#uJH8vH v#Yt HuH uX@@t$ HH8tHNtE3AP3HTuHH8tH"tH XXHXHXLHӋMtU@uzX3ұt;|$ u\XH\$@Ht$HH0_ùWL+XH('H(rffHL$L\$M3LT$L+MBeL%M;sfAMAM;uL$L\$HH(t!eH%0HHH;t3H Lu2H(ðH(u5u2.u 3H(@SH =ugwj]t(u$H WuH  Wt.23foIHHHǎH [ùHLMZf9-uxHc -H-Hʁ9PEu_ f9AuTL+QHHAH L H$I;tJ L;r BL;rH(3Hu2z$}2 22H@SH G3҅t uHH [@SH =tu _H [@SH H=HuUHH xU3҅HDHH [H(HH(@SH HHUtHHtH [Ht腘@SH H HHt HH [H\$UHH0HYH2-+H;utHeHM^mHEHElH1EmHMH1E$mEHMH H3EH3EH3HH#H3-+H;HDH9YH\$PHHjYH0]ø@H UH%VmHUH(;H$HH(398YHTHTÃ%H\$UH$@Hٹlt)3HMAOVHMjHHHE3SlHtHI#I;w3Aoo ftftftVfu HIHLAt8uHIITIHI#I;wo8WHϺDfsf: HAtEHDHHuՊII#I;w^Aof:c vIspf:c HcLILHI#I;wD3ELGLQHGD;|H D;ɋڋDى\$((t$ AƒJBȚL+A@LGGAJBȚL+A@LGGAJBȚL+A@LGG AILGG$A;Ift$@HT$@t$8HUD$0L\$`HI[Is I{(u(t$PEIkIA^@UHl$HHBH3HELUwH LHL$0H@ IH0A @@I0HPA@@`IPA`@pHApHHHEHEOHEHcE_LELEoHEEHEIHM@ IJMBHcEgHEIB@HD$(IB(LME3HMI HUILELD$0HD$ HE ZVHMH3vH]LAL!LALAJBȚL+A@MAAAAJBȚL+A@MAAAAJBȚL+A@MAAA AIzMAAA$DRAJBȚL+A@MAAAAJBȚL+A@MAAAAJBȚL+A@IPMAAA AIQAA$ JBȚH+ЋBIQAA JBȚH+ЋBIQAA JBȚH+ЋBLBIQAA MAAA$I@SH HHH;XXs HHX3HKwHXXHH [H\$WH HVH;xXu5KHPXHt'HZH;t HHt*HXXH\$0H _@H( H@`H(H(H@hH(@SH HHX`H [@SH HHXhH [HHXHhHp WH``I`I`H``IY@HPzHX`H]8mHXhdHO8HT$@LOLGD$ HH`E D$8HD$@Hd$0HT$pd$(LLHD$ HL\$`I[Ik Is(I_H\$Hl$Ht$WATAUAVAWH@HMIIL$MgM7I_8M+FfAHHt$0Hl$8HɋDL;DL;|| tD IIHL$0Ѕ~~>csmu(H= tH v :tH_ HEAHIՋ I#DHEHLI͋IG@IHD$(IG(HD$ Q#;;*3Io I+DMBDL;BDL;sF t?3Et4HɋDH;rDH;sBD9Du BD 9D tA;r;uHHHHɃ<tH;uF u'GIAGHDD MADA;UL\$@I[0Ik8Is@IA_A^A]A\_H("u2u"H(H(u "H(H;tH HA H+Њ: u Hu3HtgT$HH9csmuSyuMA - w@HA0Ht7HcPtHQ8HI(* tHA(HHt HH@4SHHH@SH HHPX H9tHRHuBH [3HcHz|LcJHcRI Lc MIH\$WH H9Hف?RCCt?MOCt ?csmt"x0~vH0H\$03H _aHx H[THX(*6H(?H H(H(+H(H(H(HtHnH;tH(H(HtH(H\$Ht$WH =:u3M :0H3H;tgHtH] :0tNJ] :HHt$H0tHCxHH c:30H"LHH\$0Ht$8H _H(H /":t%HmO0tim2H(H( 9t / 9H(LHHXHhHpHx AVI؃yLLcIL5A Hz3LE3A J1B1ȚL+EYAEtlIBDA J1B1ȚL+AAIHH;r+A AJ1B1ȚL+AQE;rEDՋH\$Hl$Ht$ H|$(A^H\$Ht$H|$AUAVAWH0MIHL3A9xtMcxvIHDHzEtWHHcCHH@8yW9{ u 9{I9{| C HHCt2At,HkHt HIVHA9~tIc^~H HϋHu4I9}(HIc^IVIM(vHLHP8;I9}(tiHtdt&HIcFHHHtGA$L$ 3H\$PHt$XH|$`H0A_A^A]H\$Ht$H|$AVH IL3A9X}HAp H2t<ugHWIN(L9_t dHc_HAMHH 0HWIN(fL9_t -Hc_HMHHH\$0Ht$8H|$@H A^&HHXL@UVWATAUAVAWH`L$MLLHHMIIL$LH$MtLHHH$Y9oHcNML$H$HՈL$PIL|$HHt$@\$8|$0Ll$(HD$ H$H`A_A^A]A\_^]@USVWATAUAVAWH$xHH4H3HEpLLLHHT$xIILeID$`M~Htxx~Hxxtxx@xWA~L8t)IcVHV JBȚH+ЋB3;;csm{C - H{0Hx rHX HK8D$`Lh( ;csmu{uC - w H{0Hx8tLC0LHD$pHcLHMI4u1HD$pAEDd$dHM TADd$dD;d$laTLHT$xMňD$XHˊD$`D$PHEHD$HD$@HEHD$8HELd$0HD$(Lt$ L}MGHLAHȚL+A@MGAGAHȚL+A@MGAGAHȚL+A@L$hAG MGI@AIGAW$L$h;MA@tQIH<}v6LLd$8MʼnD$0I׉|$(HLt$ wHx8ubHMpH3HĈA_A^A]A\_^[]òHHM< H HM!+MOCt<>RCCt4HD$pLLD$xID|$8HHD$0Dd$(Lt$ LGHMI } Dd$(HULLt$ EHM-Mfofsf~M;EEL fI~ȉD$`LD$hA@fH~EA;H D;LOHULGHME HEHMHE HEHM]HE tHM Hu}t(VHcUHttDHcMH3xuOE@uIHD$pLLD$xID$XHD$PHD$HHEDd$@HD$8HEHd$0HD$(Lt$ LD$hL IP J B ȚH+ЋBIPA@ J B ȚH+ЋBIPA@ J B ȚH+ЋBA@ HBIP AH$L$`I@L$`;MhHM(H3JH8A_A^A]A\_^[]WHHXHhHpHx AVH 3MHH9YHcqLLtHcwH Hˋ8Yt EtHHcGHHHHcEHH;tK9_tpHHcGHHpLcEILHFL+B+uHut39Ett$AttAttAttH\$0Hl$8Ht$@H|$HH A^H\$Hl$Ht$WAVAWH 3MLH9YHcqLLtHcoH (Hˋ8YHwt AtZHHcGHHZHIcFHH;tO9_t-HHcGHH-McFILHFL+B+uHut3FHwAt t-HHAttAttAttH\$@Hl$HHt$PH A_A^_H\$Hl$Ht$WAVAWHHIIML)lH$3A)A&9p@u+;csmt#D9u{uH{` tD9 t  Cf9wHcWL=HU J9B9ȚH+ЋB9$C D9 ucLE HHDȃ9wt'HcWHU J9B9ȚH+ЋrD;_IHL*D9uDDK8A9HcWHU J9B9ȚH+ЋBD; HK(LHILEHL$PH9t$Pu @;csmum{rg{ "v^HC09ptUHK0LHcQLt@$L͋$MljL$8IH$HL$0HˉD$(IH|$ ?>H$LHD$8MNj$I։D$0Hˊ$D$(H|$ L$I[ Ik(Is0IA_A^_7@SH@$D$8H$HD$0D$xD$(HD$pHD$ 7@xH@[@SH 3WHAHHAAHAHA$A0LA@DIH9B tEHcR ILDHQ JBȚH+ЋBHˉHSHSHH [3WHALHAA9B HcR ILHQ JBȚH+ЋBIQAIQ JBȚH+ЋBIQAA JBȚH+ЋBIQAA JBȚH+ЋBAA HBIQ IAAI$I@SH HHH WH HSHHHt HHH [HaHl HAHQ HHHSVWATAUAWHHE3Dd$ D!$L!d$(L!d$@D`D!`D!`D!`D!`D!`H@(HD$8H@ HD$0HwPH$H_@HG0HD$PL(HGHHD$pHGhHD$xGx$G8$H HHp ?HX(6HP HR(H$}LHD$HL9gXtDŽ$HHpHL$@AIHL$P{HHD$(H}H\pHH\$(IHH|$8L|$0|D$ `@$HxH$$tHHL$@LI DAQ LN DFV08Dd$ H\$(H|$8L|$0Ll$HIEu2>csmu*~u$F - wHN(t H|Lx Hx($Hx@xHHĨA_A]A\_^[ؿ3LgAWHALHA$A0HADHPDIHQAt' JBȚH+ЋBA@IPAtHIPA@ At' JBȚH+ЋBA@$IPLRA@(0AMP"At@<uIc IBI@IH0D"A IcIRIPI@0HBHc I@<u0A JBȚL+A@HARMPI@0D"A u\A APHJBȚL+ABMP IH0A JBȚL+ABMP IH8@SH L IA csmA9 uaAyA uAA A+wHB(I9A(uA9 u3Ayu,AI A+ȃw Iy0u@@3H [H\$WH AMg؅utxxH\$0H _HSVWATAUAVAWH)pH H3H$EIHLHL$pHL$`DL$HHD$hHHQLvHLt$xA>txxA>xxtxx@x@0HH$3H$W$9St?HcSH LDJBȚH+ЋB艄$H$!$H$HD$0HT$8H$HD$PHT$XHD$PHD$ LL$0EŋH$H$H$H$H$L|$8L;9L;|$X.HT$8HL$0L|$8H\$0s$(D$0f$HT$8HCL+L|$8HD$0HD$ DL$AHL$PD$Dd$@E3fofsf~fofsf~ɅDEDL$@EGAAvIcHAIX5HD$`Hfs u f~LfA~LIcHAHL$h|$DLd$pLt$xH$Dl$Hx0~H0H$H3肾($HA_A^A]A\_^[舺H\$Hl$Ht$ WATAUAVAWH HLHE2392HIE0Lc` ILHIE0HcH D4 E~THcHHD$XI]0HIc$HHT$XLHcMHHHuAIEA;uqH\$PAHl$`Ht$hH A_A^A]A\_蚹H\$Hl$Ht$WH 3H9)~P34HcOHƃ|t!HcOHHc\H3HHHmt!H;/|2H\$0Hl$8Ht$@H _ðLLLLAJBȚL+A@LABAJAvuJHHHAJHHHAJH JBȚH+ЋBIABHIHILHEILI[MK T$UVWATAUAVAWH HA@2E2IC3MEHHpL99~CEcA;uH@A;uLA@tEuHT$`H;;}HD$`Ld$xI$It$KHH$HLxKH\$pIH A_A^A]A\_^]H\$Ht$WH0H|$`ILHWI;PwwH9QwqI@HI+JH+H;}-AD$ I;RvKHL$ HT$(HD$(H9Gw-AD$ I9PvHL$ HT$(HL$(H9NwH\$@Ht$HH0_ffffffHL$HT$DD$I HU1HΡH;t#eH%0HH;HrH;Hv )@SH 3HME3H H ʺtMÃrӰ 2H [@SH hMH7MH H + IMu߰H [ffHL6I ffffGPMAÐLJDJ DRLHfDH DPLJDJ LfHDH  fÐ DBDJfD@DHLJDJ LHfDH  DBfD@ÐLJDJ LHDH LJLfHLJLHLJLHË DBfD@Ë DBD@H H Ë ÐI wo BoT BTN H;LFI;Is I ioġ~olILII I+I+MII3o oR oZ@ob` Q Y@a`ooooHHIIxMHIMIG@PMAġ~o ġ~ ġ~o ġ~ ġ~o @ġ~ @ġ~o `ġ~ `ġ~oL ġ~L ġ~oL ġ~L ġ~oL ġ~L ġ~lwfo oR oZ@ob` Q Y@a`oooo牀瑠HHIIxMHIMIGdPMAġ~o ġ} ġ~o ġ} ġ~o @ġ} @ġ~o `ġ} `ġ~oL ġ}L ġ~oL ġ}L ġ~oL ġ}L ġ~lwffHLI ffffGPMAÐLJDJ DRLHfDH DPLJDJ LfHDH  fÐ DBDJfD@DHLJDJ LHfDH  DBfD@ÐLJDJ LHDH LJLfHLJLHLJLHË DBfD@Ë DBD@H H Ë ÐI wo BoT BTN H;LFI; Is I I oġ~olILII I+I+MII3o oR oZ@ob` Q Y@a`ooooHHIIxMHIMIGPMAġ~o ġ~ ġ~o ġ~ ġ~o @ġ~ @ġ~o `ġ~ `ġ~oL ġ~L ġ~oL ġ~L ġ~oL ġ~L ġ~lwfo oR oZ@ob` Q Y@a`oooo牀瑠HHIIxMHIMIGPMAġ~o ġ} ġ~o ġ} ġ~o @ġ} @ġ~o `ġ} `ġ~oL ġ}L ġ~oL ġ}L ġ~oL ġ}L ġ~lwffHLI ffffG QMAÐLJDJ DRLHfDH DPLJDJ LfHDH  fÐ DBDJfD@DHLJDJ LHfDH  DBfD@ÐLJDJ LHDH LJLfHLJLHLJLHË DBfD@Ë DBD@H H Ë ÐI wo BoT BTN H;LFI;?IoBolILIII+I+MIvyfffffo oRoZ ob0f fQfY fa0oJ@oRPoZ`obpfI@fQPfY`fapHH€IIsMHIMIG`QMABoL BL BoL BL BoL BL BoL BL BoL BL BoL BL BoL BL BlffHL&I ffffGQMAÐLJDJ DRLHfDH DPLJDJ LfHDH  fÐ DBDJfD@DHLJDJ LHfDH  DBfD@ÐLJDJ LHDH LJLfHLJLHLJLHË DBfD@Ë DBD@H H Ë ÐI wo BoT BTN H;LFI;IroBolILIII+I+MIvyfffffo oRoZ ob0f fQfY fa0oJ@oRPoZ`obpfI@fQPfY`fapHH€IIsMHIMIGQMABoL BL BoL BL BoL BL BoL BL BoL BL BoL BL BoL BL BlH\$Hl$Ht$WATAUAVAWH L=sIMILIpbI;HM;uIXbHt I;kMh3IAHHu~Wu-DCIH tE33IHHuFIL=IXbHI;lMpb3H\$PHl$XHt$`H A_A^A]A\_HL=}IXbHt HOIHHtHIpb@SH HL h 3LW HX HtHH [H%o!H [H%C@SH L 9 L% H& AHt H [H%&!H [H%j@SH L  L H Ht H [H% H [H%H\$WH HL ̅ HÅ L HӋHt zH\$0H _H\$Ht$WH AL Lz HHx NHHt D3 H\$0Ht$8H _ffffffffH(HL$0HT$8DD$@HH;HHT$8HAH(H(HL$0HT$8DD$@HHH(H(HL$0HT$8HT$8HAH(H(HL$0HT$8LD$@DL$HEHmHL$@HHT$8ANH(ffWVHHI^_ffH+IDHItLHA LL+MItq)fffffff)A) DLH)Ap)I`DPL@I)AP)I@D0L )A0)I D u)AI(MItffHIuItffWVHHI^_ffH+IDHItLHA LL+MItq)fffffff)A) DLH)Ap)I`DPL@I)AP)I@D0L )A0)I D u)AI(MItffHIuIt%U%G%%#%%%%%%%%%-%%)%%%g%Y%C%%o%!%%%%HHXHhHpHx AVH IY8HMHIHILCXE$fظEADDCtLMHHH\$0Hl$8Ht$@H|$HH A^LcA6p>zRH BZR>0" ~lZpHzT f(.$\2H>P8(е@е@0+@P+@P+@P/@(@@@`@@@set sql_mode=''; set sql_safe_updates='OFF'; set default_storage_engine=Aria; set enforce_storage_engine=NULL; set alter_algorithm='DEFAULT'; set use_stat_tables='NEVER'; ALTER TABLE column_stats modify min_value varbinary(255) DEFAULT NULL, modify max_value varbinary(255) DEFAULT NULL, modify hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB'), modify histogram longblob, ENGINE=Aria transactional=0; set @have_innodb= (select count(engine) from information_schema.engines where engine='INNODB' and support != 'NO'); DELETE FROM mysql.plugin WHERE name="rpl_semi_sync_master" AND NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME="rpl_semi_sync_master"); DELETE FROM mysql.plugin WHERE name="rpl_semi_sync_slave" AND NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.PLUGINS WHERE PLUGIN_NAME="rpl_semi_sync_slave"); ALTER TABLE user ENGINE=Aria transactional=1; ALTER TABLE db ENGINE=Aria transactional=1; ALTER TABLE func ENGINE=Aria transactional=1; ALTER TABLE procs_priv ENGINE=Aria transactional=1; ALTER TABLE tables_priv ENGINE=Aria transactional=1; ALTER TABLE columns_priv ENGINE=Aria transactional=1; ALTER TABLE roles_mapping ENGINE=Aria transactional=1; ALTER TABLE plugin ENGINE=Aria transactional=1; ALTER TABLE servers ENGINE=Aria transactional=1; ALTER TABLE time_zone_name ENGINE=Aria transactional=1; ALTER TABLE time_zone ENGINE=Aria transactional=1; ALTER TABLE time_zone_transition ENGINE=Aria transactional=1; ALTER TABLE time_zone_transition_type ENGINE=Aria transactional=1; ALTER TABLE time_zone_leap_second ENGINE=Aria transactional=1; ALTER TABLE proc ENGINE=Aria transactional=1; ALTER TABLE event ENGINE=Aria transactional=1; ALTER TABLE proxies_priv ENGINE=Aria transactional=1; ALTER TABLE help_topic ENGINE=Aria transactional=0; ALTER TABLE help_category ENGINE=Aria transactional=0; ALTER TABLE help_relation ENGINE=Aria transactional=0; ALTER TABLE help_keyword ENGINE=Aria transactional=0; ALTER TABLE table_stats ENGINE=Aria transactional=0; ALTER TABLE index_stats ENGINE=Aria transactional=0; ALTER TABLE user add File_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; SET @hadGrantPriv:=0; SELECT @hadGrantPriv:=1 FROM user WHERE Grant_priv IS NOT NULL; ALTER TABLE user add Grant_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, add References_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, add Index_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, add Alter_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; ALTER TABLE db add Grant_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, add References_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, add Index_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, add Alter_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; UPDATE user SET Grant_priv=File_priv,References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; UPDATE db SET References_priv=Create_priv,Index_priv=Create_priv,Alter_priv=Create_priv WHERE @hadGrantPriv = 0; ALTER TABLE user ADD ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL, ADD ssl_cipher BLOB NOT NULL, ADD x509_issuer BLOB NOT NULL, ADD x509_subject BLOB NOT NULL; ALTER TABLE user MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') DEFAULT '' NOT NULL; ALTER TABLE tables_priv ADD KEY Grantor (Grantor); ALTER TABLE tables_priv MODIFY Host char(255) NOT NULL default '', MODIFY Db char(64) NOT NULL default '', MODIFY User char(128) binary NOT NULL default '', MODIFY Table_name char(64) NOT NULL default '', MODIFY Grantor varchar(384) COLLATE utf8mb3_bin NOT NULL default '', ENGINE=Aria, CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_bin; ALTER TABLE tables_priv MODIFY Column_priv set('Select','Insert','Update','References') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, MODIFY Table_priv set('Select','Insert','Update','Delete','Create', 'Drop','Grant','References','Index','Alter', 'Create View','Show view','Trigger','Delete versioning rows') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, COMMENT='Table privileges'; ALTER TABLE columns_priv CHANGE Type Column_priv set('Select','Insert','Update','References') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL; ALTER TABLE columns_priv MODIFY Host char(255) NOT NULL default '', MODIFY Db char(64) NOT NULL default '', MODIFY User char(128) binary NOT NULL default '', MODIFY Table_name char(64) NOT NULL default '', MODIFY Column_name char(64) NOT NULL default '', ENGINE=Aria, CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_bin, COMMENT='Column privileges'; ALTER TABLE columns_priv MODIFY Column_priv set('Select','Insert','Update','References') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL; ALTER TABLE func add type enum ('function','aggregate') COLLATE utf8mb3_general_ci NOT NULL; SET @hadShowDbPriv:=0; SELECT @hadShowDbPriv:=1 FROM user WHERE Show_db_priv IS NOT NULL; ALTER TABLE user ADD Show_db_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Alter_priv, ADD Super_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Show_db_priv, ADD Create_tmp_table_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Super_priv, ADD Lock_tables_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_tmp_table_priv, ADD Execute_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv, ADD Repl_slave_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Execute_priv, ADD Repl_client_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Repl_slave_priv; UPDATE user SET Show_db_priv= Select_priv, Super_priv=Process_priv, Execute_priv=Process_priv, Create_tmp_table_priv='Y', Lock_tables_priv='Y', Repl_slave_priv=file_priv, Repl_client_priv=File_priv where user<>"" AND @hadShowDbPriv = 0; ALTER TABLE user ADD max_questions int(11) NOT NULL DEFAULT 0 AFTER x509_subject, ADD max_updates int(11) unsigned NOT NULL DEFAULT 0 AFTER max_questions, ADD max_connections int(11) unsigned NOT NULL DEFAULT 0 AFTER max_updates; ALTER TABLE db ADD Create_tmp_table_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, ADD Lock_tables_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; alter table user change max_questions max_questions int(11) unsigned DEFAULT 0 NOT NULL; alter table db comment='Database privileges'; alter table user comment='Users and global privileges'; alter table func comment='User defined functions'; ALTER TABLE user MODIFY Host char(255) NOT NULL default '', MODIFY User char(128) binary NOT NULL default '', ENGINE=Aria, CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_bin; ALTER TABLE user ADD Password char(41) character set latin1 collate latin1_bin NOT NULL default '' AFTER User; UPDATE user SET plugin='unix_socket' WHERE plugin='auth_socket'; DELETE FROM plugin WHERE name='auth_socket'; DELETE plugin FROM information_schema.PLUGINS is_p JOIN plugin ON plugin.name = is_p.PLUGIN_NAME WHERE is_p.PLUGIN_LIBRARY IS NULL; ALTER TABLE user MODIFY Password char(41) character set latin1 collate latin1_bin NOT NULL default '', MODIFY Select_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Insert_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Update_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Delete_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Create_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Drop_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Reload_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Shutdown_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Process_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY File_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Grant_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY References_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Index_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Alter_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Show_db_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Super_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Create_tmp_table_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Lock_tables_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Execute_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Repl_slave_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Repl_client_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY ssl_type enum('','ANY','X509', 'SPECIFIED') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL; ALTER TABLE db MODIFY Host char(255) NOT NULL default '', MODIFY Db char(64) NOT NULL default '', MODIFY User char(128) binary NOT NULL default '', ENGINE=Aria, CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_bin; ALTER TABLE db MODIFY Select_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Insert_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Update_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Delete_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Create_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Drop_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Grant_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY References_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Index_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Alter_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Create_tmp_table_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, MODIFY Lock_tables_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; ALTER TABLE func ENGINE=Aria, CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_bin; ALTER TABLE func MODIFY type enum ('function','aggregate') COLLATE utf8mb3_general_ci NOT NULL; SET @old_log_state = @@global.general_log; SET GLOBAL general_log = 'OFF'; ALTER TABLE general_log MODIFY event_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, MODIFY user_host MEDIUMTEXT NOT NULL, MODIFY server_id INTEGER UNSIGNED NOT NULL, MODIFY command_type VARCHAR(64) NOT NULL, MODIFY argument MEDIUMTEXT NOT NULL, MODIFY thread_id BIGINT(21) UNSIGNED NOT NULL; SET GLOBAL general_log = @old_log_state; SET @old_log_state = @@global.log_slow_query; SET GLOBAL log_slow_query = 'OFF'; ALTER TABLE slow_log ADD COLUMN thread_id BIGINT(21) UNSIGNED NOT NULL AFTER sql_text; ALTER TABLE slow_log ADD COLUMN rows_affected BIGINT UNSIGNED NOT NULL AFTER thread_id; ALTER TABLE slow_log MODIFY start_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, MODIFY user_host MEDIUMTEXT NOT NULL, MODIFY query_time TIME(6) NOT NULL, MODIFY lock_time TIME(6) NOT NULL, MODIFY rows_sent BIGINT UNSIGNED NOT NULL, MODIFY rows_examined BIGINT UNSIGNED NOT NULL, MODIFY db VARCHAR(512) NOT NULL, MODIFY last_insert_id INTEGER NOT NULL, MODIFY insert_id INTEGER NOT NULL, MODIFY server_id INTEGER UNSIGNED NOT NULL, MODIFY sql_text MEDIUMTEXT NOT NULL, MODIFY thread_id BIGINT(21) UNSIGNED NOT NULL; SET GLOBAL log_slow_query = @old_log_state; ALTER TABLE plugin MODIFY name varchar(64) COLLATE utf8mb3_general_ci NOT NULL DEFAULT '', MODIFY dl varchar(128) COLLATE utf8mb3_general_ci NOT NULL DEFAULT '', CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci; SET @hadCreateViewPriv:=0; SELECT @hadCreateViewPriv:=1 FROM user WHERE Create_view_priv IS NOT NULL; ALTER TABLE db ADD Create_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv; ALTER TABLE db MODIFY Create_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Lock_tables_priv; ALTER TABLE user ADD Create_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Repl_client_priv; ALTER TABLE user MODIFY Create_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Repl_client_priv; ALTER TABLE db ADD Show_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; ALTER TABLE db MODIFY Show_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; ALTER TABLE user ADD Show_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; ALTER TABLE user MODIFY Show_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_view_priv; UPDATE user SET Create_view_priv=Create_priv, Show_view_priv=Create_priv where user<>"" AND @hadCreateViewPriv = 0; SET @hadCreateRoutinePriv:=0; SELECT @hadCreateRoutinePriv:=1 FROM user WHERE Create_routine_priv IS NOT NULL; ALTER TABLE db ADD Create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; ALTER TABLE db MODIFY Create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; ALTER TABLE user ADD Create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; ALTER TABLE user MODIFY Create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Show_view_priv; ALTER TABLE db ADD Alter_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; ALTER TABLE db MODIFY Alter_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; ALTER TABLE user ADD Alter_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; ALTER TABLE user MODIFY Alter_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Create_routine_priv; ALTER TABLE db ADD Execute_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; ALTER TABLE db MODIFY Execute_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; UPDATE user SET Create_routine_priv=Create_priv, Alter_routine_priv=Alter_priv where user<>"" AND @hadCreateRoutinePriv = 0; UPDATE db SET Create_routine_priv=Create_priv, Alter_routine_priv=Alter_priv, Execute_priv=Select_priv where user<>"" AND @hadCreateRoutinePriv = 0; ALTER TABLE user ADD max_user_connections int(11) DEFAULT '0' NOT NULL AFTER max_connections; ALTER TABLE user MODIFY max_user_connections int(11) DEFAULT '0' NOT NULL AFTER max_connections; SET @hadCreateUserPriv:=0; SELECT @hadCreateUserPriv:=1 FROM user WHERE Create_user_priv IS NOT NULL; ALTER TABLE user ADD Create_user_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; ALTER TABLE user MODIFY Create_user_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Alter_routine_priv; UPDATE user LEFT JOIN db USING (Host,User) SET Create_user_priv='Y' WHERE @hadCreateUserPriv = 0 AND (user.Grant_priv = 'Y' OR db.Grant_priv = 'Y'); ALTER TABLE procs_priv ENGINE=Aria, CONVERT TO CHARACTER SET utf8mb3 COLLATE utf8mb3_bin; ALTER TABLE procs_priv MODIFY Proc_priv set('Execute','Alter Routine','Grant','Show Create Routine') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL; ALTER IGNORE TABLE procs_priv MODIFY Routine_name char(64) COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL; ALTER TABLE procs_priv ADD Routine_type enum('FUNCTION','PROCEDURE') COLLATE utf8mb3_general_ci NOT NULL AFTER Routine_name; ALTER TABLE procs_priv MODIFY Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER Proc_priv; ALTER TABLE proc MODIFY name char(64) DEFAULT '' NOT NULL, MODIFY specific_name char(64) DEFAULT '' NOT NULL, MODIFY sql_data_access enum('CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA' ) DEFAULT 'CONTAINS_SQL' NOT NULL, MODIFY body longblob NOT NULL, MODIFY returns longblob NOT NULL, MODIFY sql_mode set('REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'IGNORE_BAD_TABLE_OPTIONS', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE', 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH', 'EMPTY_STRING_IS_NULL', 'SIMULTANEOUS_ASSIGNMENT', 'TIME_ROUND_FRACTIONAL' ) DEFAULT '' NOT NULL, DEFAULT CHARACTER SET utf8mb3; ALTER TABLE proc CONVERT TO CHARACTER SET utf8mb3, MODIFY db char(64) binary DEFAULT '' NOT NULL, MODIFY definer varchar(384) binary DEFAULT '' NOT NULL, MODIFY comment text binary NOT NULL; ALTER TABLE proc ADD character_set_client char(32) collate utf8mb3_bin DEFAULT NULL AFTER comment; ALTER TABLE proc MODIFY character_set_client char(32) collate utf8mb3_bin DEFAULT NULL; ALTER TABLE proc MODIFY type enum('FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') NOT NULL; ALTER TABLE procs_priv MODIFY Routine_type enum('FUNCTION', 'PROCEDURE', 'PACKAGE', 'PACKAGE BODY') NOT NULL; SELECT CASE WHEN COUNT(*) > 0 THEN CONCAT ("WARNING: NULL values of the 'character_set_client' column ('mysql.proc' table) have been updated with a default value (", @@character_set_client, "). Please verify if necessary.") ELSE NULL END AS value FROM proc WHERE character_set_client IS NULL; UPDATE proc SET character_set_client = @@character_set_client WHERE character_set_client IS NULL; ALTER TABLE proc ADD collation_connection char(64) collate utf8mb3_bin DEFAULT NULL AFTER character_set_client; ALTER TABLE proc MODIFY collation_connection char(64) collate utf8mb3_bin DEFAULT NULL; SELECT CASE WHEN COUNT(*) > 0 THEN CONCAT ("WARNING: NULL values of the 'collation_connection' column ('mysql.proc' table) have been updated with a default value (", @@collation_connection, "). Please verify if necessary.") ELSE NULL END AS value FROM proc WHERE collation_connection IS NULL; UPDATE proc SET collation_connection = @@collation_connection WHERE collation_connection IS NULL; ALTER TABLE proc ADD db_collation char(64) collate utf8mb3_bin DEFAULT NULL AFTER collation_connection; ALTER TABLE proc MODIFY db_collation char(64) collate utf8mb3_bin DEFAULT NULL; SELECT CASE WHEN COUNT(*) > 0 THEN CONCAT ("WARNING: NULL values of the 'db_collation' column ('mysql.proc' table) have been updated with default values. Please verify if necessary.") ELSE NULL END AS value FROM proc WHERE db_collation IS NULL; UPDATE proc AS p SET db_collation = ( SELECT DEFAULT_COLLATION_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = p.db) WHERE db_collation IS NULL; ALTER TABLE proc ADD body_utf8 longblob DEFAULT NULL AFTER db_collation; ALTER TABLE proc MODIFY body_utf8 longblob DEFAULT NULL; ALTER TABLE proc MODIFY comment text collate utf8mb3_bin NOT NULL; ALTER TABLE proc ADD aggregate enum('NONE', 'GROUP') DEFAULT 'NONE' NOT NULL AFTER body_utf8; UPDATE proc SET Definer = 'mariadb.sys@localhost' WHERE Definer = 'root@localhost' AND Name = 'AddGeometryColumn'; UPDATE proc SET Definer = 'mariadb.sys@localhost' WHERE Definer = 'root@localhost' AND Name = 'DropGeometryColumn'; SET @hadEventPriv := 0; SELECT @hadEventPriv :=1 FROM user WHERE Event_priv IS NOT NULL; ALTER TABLE user ADD Event_priv enum('N','Y') character set utf8mb3 DEFAULT 'N' NOT NULL AFTER Create_user_priv; ALTER TABLE user MODIFY Event_priv enum('N','Y') character set utf8mb3 DEFAULT 'N' NOT NULL AFTER Create_user_priv; UPDATE user SET Event_priv=Super_priv WHERE @hadEventPriv = 0; ALTER TABLE db ADD Event_priv enum('N','Y') character set utf8mb3 DEFAULT 'N' NOT NULL; ALTER TABLE db MODIFY Event_priv enum('N','Y') character set utf8mb3 DEFAULT 'N' NOT NULL; ALTER TABLE event DROP PRIMARY KEY, ADD PRIMARY KEY(db, name); ALTER TABLE event ADD sql_mode set ('IGNORE_BAD_TABLE_OPTIONS') AFTER on_completion; ALTER TABLE event MODIFY sql_mode set('REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'IGNORE_BAD_TABLE_OPTIONS', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE', 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH', 'EMPTY_STRING_IS_NULL', 'SIMULTANEOUS_ASSIGNMENT', 'TIME_ROUND_FRACTIONAL' ) DEFAULT '' NOT NULL AFTER on_completion; ALTER TABLE event MODIFY name char(64) CHARACTER SET utf8mb3 NOT NULL default ''; ALTER TABLE event MODIFY db CHAR(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL DEFAULT ''; ALTER TABLE event MODIFY comment CHAR(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL DEFAULT ''; ALTER TABLE event ADD COLUMN originator INT UNSIGNED NOT NULL AFTER comment; ALTER TABLE event MODIFY COLUMN originator INT UNSIGNED NOT NULL; ALTER TABLE event MODIFY COLUMN status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED'; ALTER TABLE event ADD COLUMN time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM' AFTER originator; ALTER TABLE event ADD character_set_client char(32) collate utf8mb3_bin DEFAULT NULL AFTER time_zone; ALTER TABLE event MODIFY character_set_client char(32) collate utf8mb3_bin DEFAULT NULL; ALTER TABLE event ADD collation_connection char(64) collate utf8mb3_bin DEFAULT NULL AFTER character_set_client; ALTER TABLE event MODIFY collation_connection char(64) collate utf8mb3_bin DEFAULT NULL; ALTER TABLE event ADD db_collation char(64) collate utf8mb3_bin DEFAULT NULL AFTER collation_connection; ALTER TABLE event MODIFY db_collation char(64) collate utf8mb3_bin DEFAULT NULL; ALTER TABLE event ADD body_utf8 longblob DEFAULT NULL AFTER db_collation; ALTER TABLE event MODIFY body_utf8 longblob DEFAULT NULL; alter table event MODIFY definer varchar(384) collate utf8mb3_bin NOT NULL DEFAULT ''; set global event_scheduler=original; SET @hadTriggerPriv := 0; SELECT @hadTriggerPriv :=1 FROM user WHERE Trigger_priv IS NOT NULL; ALTER TABLE user ADD Trigger_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Event_priv; ALTER TABLE user MODIFY Trigger_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Event_priv; ALTER TABLE db ADD Trigger_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; ALTER TABLE db MODIFY Trigger_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL; UPDATE user SET Trigger_priv=Super_priv WHERE @hadTriggerPriv = 0; SET @hadCreateTablespacePriv := 0; SELECT @hadCreateTablespacePriv :=1 FROM user WHERE Create_tablespace_priv IS NOT NULL; ALTER TABLE user ADD Create_tablespace_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Trigger_priv; ALTER TABLE user MODIFY Create_tablespace_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER Trigger_priv; UPDATE user SET Create_tablespace_priv = Super_priv WHERE @hadCreateTablespacePriv = 0; ALTER TABLE user change Truncate_versioning_priv Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N'; ALTER TABLE db change Truncate_versioning_priv Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N'; SET @had_user_delete_history_priv := 0; SELECT @had_user_delete_history_priv :=1 FROM user WHERE Delete_history_priv IS NOT NULL; ALTER TABLE user add Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N' after Create_tablespace_priv; ALTER TABLE user modify Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N'; ALTER TABLE db add Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N' after Trigger_priv; ALTER TABLE db modify Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N'; UPDATE user SET Delete_history_priv = Super_priv WHERE @had_user_delete_history_priv = 0; ALTER TABLE db ADD Show_create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N' AFTER Delete_history_priv; ALTER TABLE db MODIFY Show_create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N'; ALTER TABLE user ADD plugin char(64) CHARACTER SET latin1 DEFAULT '' NOT NULL AFTER max_user_connections, ADD authentication_string TEXT NOT NULL AFTER plugin; ALTER TABLE user CHANGE auth_string authentication_string TEXT NOT NULL; ALTER TABLE user ADD password_expired ENUM('N', 'Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER authentication_string; ALTER TABLE user ADD password_last_changed timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP after password_expired; ALTER TABLE user ADD password_lifetime smallint unsigned DEFAULT NULL after password_last_changed; ALTER TABLE user ADD account_locked enum('N', 'Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL after password_lifetime; ALTER TABLE user ADD is_role enum('N', 'Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER account_locked; ALTER TABLE user ADD default_role char(128) binary DEFAULT '' NOT NULL AFTER is_role; ALTER TABLE user ADD max_statement_time decimal(12,6) DEFAULT 0 NOT NULL AFTER default_role; ALTER TABLE user MODIFY plugin char(64) CHARACTER SET latin1 DEFAULT '' NOT NULL AFTER max_user_connections, MODIFY authentication_string TEXT NOT NULL AFTER plugin, MODIFY password_expired ENUM('N', 'Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER authentication_string, MODIFY is_role enum('N', 'Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL AFTER password_expired, MODIFY default_role char(80) binary DEFAULT '' NOT NULL AFTER is_role, MODIFY max_statement_time decimal(12,6) DEFAULT 0 NOT NULL AFTER default_role, MODIFY IF EXISTS password_last_changed timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP AFTER max_statement_time, MODIFY IF EXISTS password_lifetime smallint unsigned DEFAULT NULL AFTER password_last_changed, MODIFY IF EXISTS account_locked enum('N', 'Y') CHARACTER SET utf8mb3 DEFAULT 'N' NOT NULL after password_lifetime; DELIMITER // BEGIN NOT ATOMIC SET @duplicate_hosts=(SELECT count(*) FROM mysql.user GROUP BY user, lower(host) HAVING count(*) > 1 LIMIT 1); IF @duplicate_hosts > 1 THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Multiple accounts exist for @user_name, @host_name that differ only in Host lettercase; remove all except one of them'; END IF; END // DELIMITER ; SHOW WARNINGS; UPDATE user SET host=LOWER( host ) WHERE LOWER( host ) <> host; if @have_innodb then # fix bad data when upgrading from unfixed InnoDB (MDEV-13360) delete from innodb_index_stats where length(table_name) > 64; delete from innodb_table_stats where length(table_name) > 64; # update table_name and timestamp fields in the innodb stat tables alter table innodb_index_stats modify last_update timestamp not null default current_timestamp on update current_timestamp, modify table_name varchar(199); alter table innodb_table_stats modify last_update timestamp not null default current_timestamp on update current_timestamp, modify table_name varchar(199); alter table innodb_index_stats drop foreign key if exists innodb_index_stats_ibfk_1; end if // alter table user modify User char(128) binary not null default ''; alter table db modify User char(128) binary not null default ''; alter table tables_priv modify User char(128) binary not null default ''; alter table columns_priv modify User char(128) binary not null default ''; alter table procs_priv modify User char(128) binary not null default ''; alter table proc modify definer varchar(384) collate utf8mb3_bin not null default ''; alter table proxies_priv modify User char(128) COLLATE utf8mb3_bin not null default ''; alter table proxies_priv modify Proxied_user char(128) COLLATE utf8mb3_bin not null default ''; alter table proxies_priv modify Grantor varchar(384) COLLATE utf8mb3_bin not null default ''; alter table servers modify Username char(128) not null default ''; alter table procs_priv modify Grantor varchar(384) COLLATE utf8mb3_bin not null default ''; alter table tables_priv modify Grantor varchar(384) COLLATE utf8mb3_bin not null default ''; flush privileges; ALTER TABLE help_category MODIFY url TEXT NOT NULL; ALTER TABLE help_topic MODIFY url TEXT NOT NULL; IF 'BASE TABLE' = (select table_type from information_schema.tables where table_schema=database() and table_name='user') THEN CREATE TABLE IF NOT EXISTS global_priv (Host char(255) binary DEFAULT '', User char(128) binary DEFAULT '', Priv JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Priv)), PRIMARY KEY Host (Host,User)) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Users and global privileges' SELECT Host, User, JSON_COMPACT(JSON_OBJECT('access', 1*('Y'=Select_priv)+ 2*('Y'=Insert_priv)+ 4*('Y'=Update_priv)+ 8*('Y'=Delete_priv)+ 16*('Y'=Create_priv)+ 32*('Y'=Drop_priv)+ 64*('Y'=Reload_priv)+ 128*('Y'=Shutdown_priv)+ 256*('Y'=Process_priv)+ 512*('Y'=File_priv)+ 1024*('Y'=Grant_priv)+ 2048*('Y'=References_priv)+ 4096*('Y'=Index_priv)+ 8192*('Y'=Alter_priv)+ 16384*('Y'=Show_db_priv)+ 32768*('Y'=Super_priv)+ 65536*('Y'=Create_tmp_table_priv)+ 131072*('Y'=Lock_tables_priv)+ 262144*('Y'=Execute_priv)+ 524288*('Y'=Repl_slave_priv)+ 1048576*('Y'=Repl_client_priv)+ 2097152*('Y'=Create_view_priv)+ 4194304*('Y'=Show_view_priv)+ 8388608*('Y'=Create_routine_priv)+ 16777216*('Y'=Alter_routine_priv)+ 33554432*('Y'=Create_user_priv)+ 67108864*('Y'=Event_priv)+ 134217728*('Y'=Trigger_priv)+ 268435456*('Y'=Create_tablespace_priv)+ 536870912*('Y'=Delete_history_priv), 'ssl_type', ssl_type-1, 'ssl_cipher', ssl_cipher, 'x509_issuer', x509_issuer, 'x509_subject', x509_subject, 'max_questions', max_questions, 'max_updates', max_updates, 'max_connections', max_connections, 'max_user_connections', max_user_connections, 'max_statement_time', max_statement_time, 'plugin', if(plugin>'',plugin,if(length(password)=16,'mysql_old_password','mysql_native_password')), 'authentication_string', if(plugin>'' and authentication_string>'',authentication_string,password), 'password_last_changed', if(password_expired='Y', 0, if(password_last_changed, UNIX_TIMESTAMP(password_last_changed), UNIX_TIMESTAMP())), 'password_lifetime', ifnull(password_lifetime, -1), 'account_locked', 'Y'=account_locked, 'default_role', default_role, 'is_role', 'Y'=is_role)) as Priv FROM user; DROP TABLE user; END IF// IF 1 = (SELECT count(*) FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and (DEFINER = 'root@localhost' or (DEFINER = 'mariadb.sys@localhost' and VIEW_DEFINITION LIKE "%'N' AS `password_expired`%"))) THEN DROP VIEW IF EXISTS mysql.user; END IF// ALTER TABLE servers MODIFY Host varchar(2048) NOT NULL DEFAULT '', MODIFY Owner varchar(512) NOT NULL DEFAULT ''; set @orig_storage_engine=@@default_storage_engine; set system_versioning_alter_history=keep; SET @innodb_or_aria=IF(@have_innodb <> 0, 'InnoDB', 'Aria'); CREATE TABLE IF NOT EXISTS db ( Host char(255) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(128) binary DEFAULT '' NOT NULL, Select_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Insert_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Update_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Delete_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Create_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Drop_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Grant_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, References_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Index_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Alter_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Create_tmp_table_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Lock_tables_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Create_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Show_view_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Alter_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Execute_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Event_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Trigger_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Delete_history_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, Show_create_routine_priv enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, PRIMARY KEY /*Host */(Host,Db,User), KEY User (User) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Database privileges'; set @had_db_table= @@warning_count != 0; CREATE TABLE IF NOT EXISTS global_priv (Host char(255) binary DEFAULT '', User char(128) binary DEFAULT '', Priv JSON NOT NULL DEFAULT '{}' CHECK(JSON_VALID(Priv)), PRIMARY KEY (Host,User)) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Users and global privileges'; set @exists_user_view= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user'); set @exists_user_view_by_root= EXISTS (SELECT * FROM information_schema.VIEWS WHERE TABLE_CATALOG = 'def' and TABLE_SCHEMA = 'mysql' and TABLE_NAME='user' and DEFINER = 'mariadb.sys@localhost'); set @need_sys_user_creation= (( NOT @exists_user_view) OR @exists_user_view_by_root); CREATE TEMPORARY TABLE tmp_user_sys LIKE global_priv; INSERT INTO tmp_user_sys (Host,User,Priv) VALUES ('localhost','mariadb.sys','{"access":0,"plugin":"mysql_native_password","authentication_string":"","account_locked":true,"password_last_changed":0}'); INSERT IGNORE INTO global_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; DROP TABLE tmp_user_sys; CREATE DEFINER='mariadb.sys'@'localhost' SQL SECURITY DEFINER VIEW IF NOT EXISTS user AS SELECT Host, User, IF(JSON_VALUE(Priv, '$.plugin') IN ('mysql_native_password', 'mysql_old_password'), IFNULL(JSON_VALUE(Priv, '$.authentication_string'), ''), '') AS Password, IF(JSON_VALUE(Priv, '$.access') & 1, 'Y', 'N') AS Select_priv, IF(JSON_VALUE(Priv, '$.access') & 2, 'Y', 'N') AS Insert_priv, IF(JSON_VALUE(Priv, '$.access') & 4, 'Y', 'N') AS Update_priv, IF(JSON_VALUE(Priv, '$.access') & 8, 'Y', 'N') AS Delete_priv, IF(JSON_VALUE(Priv, '$.access') & 16, 'Y', 'N') AS Create_priv, IF(JSON_VALUE(Priv, '$.access') & 32, 'Y', 'N') AS Drop_priv, IF(JSON_VALUE(Priv, '$.access') & 64, 'Y', 'N') AS Reload_priv, IF(JSON_VALUE(Priv, '$.access') & 128, 'Y', 'N') AS Shutdown_priv, IF(JSON_VALUE(Priv, '$.access') & 256, 'Y', 'N') AS Process_priv, IF(JSON_VALUE(Priv, '$.access') & 512, 'Y', 'N') AS File_priv, IF(JSON_VALUE(Priv, '$.access') & 1024, 'Y', 'N') AS Grant_priv, IF(JSON_VALUE(Priv, '$.access') & 2048, 'Y', 'N') AS References_priv, IF(JSON_VALUE(Priv, '$.access') & 4096, 'Y', 'N') AS Index_priv, IF(JSON_VALUE(Priv, '$.access') & 8192, 'Y', 'N') AS Alter_priv, IF(JSON_VALUE(Priv, '$.access') & 16384, 'Y', 'N') AS Show_db_priv, IF(JSON_VALUE(Priv, '$.access') & 32768, 'Y', 'N') AS Super_priv, IF(JSON_VALUE(Priv, '$.access') & 65536, 'Y', 'N') AS Create_tmp_table_priv, IF(JSON_VALUE(Priv, '$.access') & 131072, 'Y', 'N') AS Lock_tables_priv, IF(JSON_VALUE(Priv, '$.access') & 262144, 'Y', 'N') AS Execute_priv, IF(JSON_VALUE(Priv, '$.access') & 524288, 'Y', 'N') AS Repl_slave_priv, IF(JSON_VALUE(Priv, '$.access') & 1048576, 'Y', 'N') AS Repl_client_priv, IF(JSON_VALUE(Priv, '$.access') & 2097152, 'Y', 'N') AS Create_view_priv, IF(JSON_VALUE(Priv, '$.access') & 4194304, 'Y', 'N') AS Show_view_priv, IF(JSON_VALUE(Priv, '$.access') & 8388608, 'Y', 'N') AS Create_routine_priv, IF(JSON_VALUE(Priv, '$.access') & 16777216, 'Y', 'N') AS Alter_routine_priv, IF(JSON_VALUE(Priv, '$.access') & 33554432, 'Y', 'N') AS Create_user_priv, IF(JSON_VALUE(Priv, '$.access') & 67108864, 'Y', 'N') AS Event_priv, IF(JSON_VALUE(Priv, '$.access') & 134217728, 'Y', 'N') AS Trigger_priv, IF(JSON_VALUE(Priv, '$.access') & 268435456, 'Y', 'N') AS Create_tablespace_priv, IF(JSON_VALUE(Priv, '$.access') & 536870912, 'Y', 'N') AS Delete_history_priv, ELT(IFNULL(JSON_VALUE(Priv, '$.ssl_type'), 0) + 1, '', 'ANY','X509', 'SPECIFIED') AS ssl_type, IFNULL(JSON_VALUE(Priv, '$.ssl_cipher'), '') AS ssl_cipher, IFNULL(JSON_VALUE(Priv, '$.x509_issuer'), '') AS x509_issuer, IFNULL(JSON_VALUE(Priv, '$.x509_subject'), '') AS x509_subject, CAST(IFNULL(JSON_VALUE(Priv, '$.max_questions'), 0) AS UNSIGNED) AS max_questions, CAST(IFNULL(JSON_VALUE(Priv, '$.max_updates'), 0) AS UNSIGNED) AS max_updates, CAST(IFNULL(JSON_VALUE(Priv, '$.max_connections'), 0) AS UNSIGNED) AS max_connections, CAST(IFNULL(JSON_VALUE(Priv, '$.max_user_connections'), 0) AS SIGNED) AS max_user_connections, IFNULL(JSON_VALUE(Priv, '$.plugin'), '') AS plugin, IFNULL(JSON_VALUE(Priv, '$.authentication_string'), '') AS authentication_string, IF(IFNULL(JSON_VALUE(Priv, '$.password_last_changed'), 1) = 0, 'Y', 'N') AS password_expired, ELT(IFNULL(JSON_VALUE(Priv, '$.is_role'), 0) + 1, 'N', 'Y') AS is_role, IFNULL(JSON_VALUE(Priv, '$.default_role'), '') AS default_role, CAST(IFNULL(JSON_VALUE(Priv, '$.max_statement_time'), 0.0) AS DECIMAL(12,6)) AS max_statement_time FROM global_priv; set @had_user_table= @@warning_count != 0; CREATE TABLE IF NOT EXISTS roles_mapping ( Host char(255) binary DEFAULT '' NOT NULL, User char(128) binary DEFAULT '' NOT NULL, Role char(128) binary DEFAULT '' NOT NULL, Admin_option enum('N','Y') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, UNIQUE (Host, User, Role)) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Granted roles'; CREATE TABLE IF NOT EXISTS func ( name char(64) binary DEFAULT '' NOT NULL, ret tinyint(1) DEFAULT '0' NOT NULL, dl char(128) DEFAULT '' NOT NULL, type enum ('function','aggregate') COLLATE utf8mb3_general_ci NOT NULL, PRIMARY KEY (name) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='User defined functions'; CREATE TABLE IF NOT EXISTS plugin ( name varchar(64) DEFAULT '' NOT NULL, dl varchar(128) DEFAULT '' NOT NULL, PRIMARY KEY (name) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci comment='MySQL plugins'; CREATE TABLE IF NOT EXISTS servers ( Server_name char(64) NOT NULL DEFAULT '', Host varchar(2048) NOT NULL DEFAULT '', Db char(64) NOT NULL DEFAULT '', Username char(128) NOT NULL DEFAULT '', Password char(64) NOT NULL DEFAULT '', Port INT(4) NOT NULL DEFAULT '0', Socket char(64) NOT NULL DEFAULT '', Wrapper char(64) NOT NULL DEFAULT '', Owner varchar(512) NOT NULL DEFAULT '', PRIMARY KEY (Server_name)) engine=Aria transactional=1 CHARACTER SET utf8mb3 comment='MySQL Foreign Servers table'; CREATE TABLE IF NOT EXISTS tables_priv ( Host char(255) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(128) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Grantor varchar(384) DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Table_priv set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger','Delete versioning rows') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, Column_priv set('Select','Insert','Update','References') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name), KEY Grantor (Grantor) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Table privileges'; CREATE TEMPORARY TABLE tmp_user_sys LIKE tables_priv; INSERT INTO tmp_user_sys (Host,Db,User,Table_name,Grantor,Timestamp,Table_priv) VALUES ('localhost','mysql','mariadb.sys','global_priv','root@localhost','0','Select,Delete'); INSERT IGNORE INTO tables_priv SELECT * FROM tmp_user_sys WHERE 0 <> @need_sys_user_creation; CREATE TABLE IF NOT EXISTS columns_priv ( Host char(255) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(128) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Column_name char(64) binary DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, Column_priv set('Select','Insert','Update','References') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name,Column_name) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Column privileges'; CREATE TABLE IF NOT EXISTS help_topic ( help_topic_id int unsigned not null, name char(64) not null, help_category_id smallint unsigned not null, description text not null, example text not null, url text not null, primary key (help_topic_id), unique index (name) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 comment='help topics'; CREATE TABLE IF NOT EXISTS help_category ( help_category_id smallint unsigned not null, name char(64) not null, parent_category_id smallint unsigned null, url text not null, primary key (help_category_id), unique index (name) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 comment='help categories'; CREATE TABLE IF NOT EXISTS help_relation ( help_topic_id int unsigned not null references help_topic, help_keyword_id int unsigned not null references help_keyword, primary key (help_keyword_id, help_topic_id) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 comment='keyword-topic relation'; CREATE TABLE IF NOT EXISTS help_keyword ( help_keyword_id int unsigned not null, name char(64) not null, primary key (help_keyword_id), unique index (name) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 comment='help keywords'; CREATE TABLE IF NOT EXISTS time_zone_name ( Name char(64) NOT NULL, Time_zone_id int unsigned NOT NULL, PRIMARY KEY /*Name*/ (Name) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 comment='Time zone names'; CREATE TABLE IF NOT EXISTS time_zone ( Time_zone_id int unsigned NOT NULL auto_increment, Use_leap_seconds enum('Y','N') COLLATE utf8mb3_general_ci DEFAULT 'N' NOT NULL, PRIMARY KEY /*TzId*/ (Time_zone_id) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 comment='Time zones'; CREATE TABLE IF NOT EXISTS time_zone_transition ( Time_zone_id int unsigned NOT NULL, Transition_time bigint signed NOT NULL, Transition_type_id int unsigned NOT NULL, PRIMARY KEY /*TzIdTranTime*/ (Time_zone_id, Transition_time) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 comment='Time zone transitions'; CREATE TABLE IF NOT EXISTS time_zone_transition_type ( Time_zone_id int unsigned NOT NULL, Transition_type_id int unsigned NOT NULL, `Offset` int signed DEFAULT 0 NOT NULL, Is_DST tinyint unsigned DEFAULT 0 NOT NULL, Abbreviation char(8) DEFAULT '' NOT NULL, PRIMARY KEY /*TzIdTrTId*/ (Time_zone_id, Transition_type_id) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 comment='Time zone transition types'; CREATE TABLE IF NOT EXISTS time_zone_leap_second ( Transition_time bigint signed NOT NULL, Correction int signed NOT NULL, PRIMARY KEY /*TranTime*/ (Transition_time) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 comment='Leap seconds information for time zones'; CREATE TABLE IF NOT EXISTS proc (db char(64) collate utf8mb3_bin DEFAULT '' NOT NULL, name char(64) DEFAULT '' NOT NULL, type enum('FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY') NOT NULL, specific_name char(64) DEFAULT '' NOT NULL, language enum('SQL') DEFAULT 'SQL' NOT NULL, sql_data_access enum( 'CONTAINS_SQL', 'NO_SQL', 'READS_SQL_DATA', 'MODIFIES_SQL_DATA') DEFAULT 'CONTAINS_SQL' NOT NULL, is_deterministic enum('YES','NO') DEFAULT 'NO' NOT NULL, security_type enum('INVOKER','DEFINER') DEFAULT 'DEFINER' NOT NULL, param_list blob NOT NULL, returns longblob NOT NULL, body longblob NOT NULL, definer varchar(384) collate utf8mb3_bin DEFAULT '' NOT NULL, created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, modified timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', sql_mode set( 'REAL_AS_FLOAT', 'PIPES_AS_CONCAT', 'ANSI_QUOTES', 'IGNORE_SPACE', 'IGNORE_BAD_TABLE_OPTIONS', 'ONLY_FULL_GROUP_BY', 'NO_UNSIGNED_SUBTRACTION', 'NO_DIR_IN_CREATE', 'POSTGRESQL', 'ORACLE', 'MSSQL', 'DB2', 'MAXDB', 'NO_KEY_OPTIONS', 'NO_TABLE_OPTIONS', 'NO_FIELD_OPTIONS', 'MYSQL323', 'MYSQL40', 'ANSI', 'NO_AUTO_VALUE_ON_ZERO', 'NO_BACKSLASH_ESCAPES', 'STRICT_TRANS_TABLES', 'STRICT_ALL_TABLES', 'NO_ZERO_IN_DATE', 'NO_ZERO_DATE', 'INVALID_DATES', 'ERROR_FOR_DIVISION_BY_ZERO', 'TRADITIONAL', 'NO_AUTO_CREATE_USER', 'HIGH_NOT_PRECEDENCE', 'NO_ENGINE_SUBSTITUTION', 'PAD_CHAR_TO_FULL_LENGTH', 'EMPTY_STRING_IS_NULL', 'SIMULTANEOUS_ASSIGNMENT', 'TIME_ROUND_FRACTIONAL') DEFAULT '' NOT NULL, comment text collate utf8mb3_bin NOT NULL, character_set_client char(32) collate utf8mb3_bin, collation_connection char(64) collate utf8mb3_bin, db_collation char(64) collate utf8mb3_bin, body_utf8 longblob, aggregate enum('NONE', 'GROUP') DEFAULT 'NONE' NOT NULL, PRIMARY KEY (db,name,type)) engine=Aria transactional=1 character set utf8mb3 comment='Stored Procedures'; CREATE TABLE IF NOT EXISTS procs_priv ( Host char(255) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(128) binary DEFAULT '' NOT NULL, Routine_name char(64) COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, Routine_type enum('FUNCTION','PROCEDURE','PACKAGE','PACKAGE BODY') NOT NULL, Grantor varchar(384) DEFAULT '' NOT NULL, Proc_priv set('Execute','Alter Routine','Grant','Show Create Routine') COLLATE utf8mb3_general_ci DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (Host,Db,User,Routine_name,Routine_type), KEY Grantor (Grantor) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Procedure privileges'; SET @have_csv = (SELECT support FROM information_schema.engines WHERE engine = 'CSV'); SET @str = IF (@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS general_log (event_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, user_host MEDIUMTEXT NOT NULL, thread_id BIGINT(21) UNSIGNED NOT NULL, server_id INTEGER UNSIGNED NOT NULL, command_type VARCHAR(64) NOT NULL, argument MEDIUMTEXT NOT NULL) engine=CSV CHARACTER SET utf8mb3 comment="General log"', 'SET @dummy = 0'); PREPARE stmt FROM @str; EXECUTE stmt; DROP PREPARE stmt; SET @str = IF (@have_csv = 'YES', 'CREATE TABLE IF NOT EXISTS slow_log (start_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, user_host MEDIUMTEXT NOT NULL, query_time TIME(6) NOT NULL, lock_time TIME(6) NOT NULL, rows_sent BIGINT UNSIGNED NOT NULL, rows_examined BIGINT UNSIGNED NOT NULL, db VARCHAR(512) NOT NULL, last_insert_id INTEGER NOT NULL, insert_id INTEGER NOT NULL, server_id INTEGER UNSIGNED NOT NULL, sql_text MEDIUMTEXT NOT NULL, thread_id BIGINT(21) UNSIGNED NOT NULL, rows_affected BIGINT UNSIGNED NOT NULL) engine=CSV CHARACTER SET utf8mb3 comment="Slow log"', 'SET @dummy = 0'); CREATE TABLE IF NOT EXISTS event ( db char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL default '', name char(64) CHARACTER SET utf8mb3 NOT NULL default '', body longblob NOT NULL, definer varchar(384) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL default '', execute_at DATETIME default NULL, interval_value int(11) default NULL, interval_field ENUM('YEAR','QUARTER','MONTH','DAY','HOUR','MINUTE','WEEK','SECOND','MICROSECOND','YEAR_MONTH','DAY_HOUR','DAY_MINUTE','DAY_SECOND','HOUR_MINUTE','HOUR_SECOND','MINUTE_SECOND','DAY_MICROSECOND','HOUR_MICROSECOND','MINUTE_MICROSECOND','SECOND_MICROSECOND') default NULL, created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, modified TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00', last_executed DATETIME default NULL, starts DATETIME default NULL, ends DATETIME default NULL, status ENUM('ENABLED','DISABLED','SLAVESIDE_DISABLED') NOT NULL default 'ENABLED', on_completion ENUM('DROP','PRESERVE') NOT NULL default 'DROP', sql_mode set('REAL_AS_FLOAT','PIPES_AS_CONCAT','ANSI_QUOTES','IGNORE_SPACE','IGNORE_BAD_TABLE_OPTIONS','ONLY_FULL_GROUP_BY','NO_UNSIGNED_SUBTRACTION','NO_DIR_IN_CREATE','POSTGRESQL','ORACLE','MSSQL','DB2','MAXDB','NO_KEY_OPTIONS','NO_TABLE_OPTIONS','NO_FIELD_OPTIONS','MYSQL323','MYSQL40','ANSI','NO_AUTO_VALUE_ON_ZERO','NO_BACKSLASH_ESCAPES','STRICT_TRANS_TABLES','STRICT_ALL_TABLES','NO_ZERO_IN_DATE','NO_ZERO_DATE','INVALID_DATES','ERROR_FOR_DIVISION_BY_ZERO','TRADITIONAL','NO_AUTO_CREATE_USER','HIGH_NOT_PRECEDENCE','NO_ENGINE_SUBSTITUTION','PAD_CHAR_TO_FULL_LENGTH','EMPTY_STRING_IS_NULL','SIMULTANEOUS_ASSIGNMENT','TIME_ROUND_FRACTIONAL') DEFAULT '' NOT NULL, comment char(64) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL default '', originator INTEGER UNSIGNED NOT NULL, time_zone char(64) CHARACTER SET latin1 NOT NULL DEFAULT 'SYSTEM', character_set_client char(32) collate utf8mb3_bin, collation_connection char(64) collate utf8mb3_bin, db_collation char(64) collate utf8mb3_bin, body_utf8 longblob, PRIMARY KEY (db, name) ) engine=Aria transactional=1 DEFAULT CHARSET=utf8mb3 COMMENT 'Events'; SET @create_innodb_table_stats="CREATE TABLE IF NOT EXISTS innodb_table_stats ( database_name VARCHAR(64) NOT NULL, table_name VARCHAR(199) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, n_rows BIGINT UNSIGNED NOT NULL, clustered_index_size BIGINT UNSIGNED NOT NULL, sum_of_other_index_sizes BIGINT UNSIGNED NOT NULL, PRIMARY KEY (database_name, table_name) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0"; SET @create_innodb_index_stats="CREATE TABLE IF NOT EXISTS innodb_index_stats ( database_name VARCHAR(64) NOT NULL, table_name VARCHAR(199) NOT NULL, index_name VARCHAR(64) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, /* there are at least: stat_name='size' stat_name='n_leaf_pages' stat_name='n_diff_pfx%' */ stat_name VARCHAR(64) NOT NULL, stat_value BIGINT UNSIGNED NOT NULL, sample_size BIGINT UNSIGNED, stat_description VARCHAR(1024) NOT NULL, PRIMARY KEY (database_name, table_name, index_name, stat_name) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0"; SET @create_transaction_registry="CREATE TABLE IF NOT EXISTS transaction_registry ( transaction_id BIGINT UNSIGNED NOT NULL, commit_id BIGINT UNSIGNED NOT NULL, begin_timestamp TIMESTAMP(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000', commit_timestamp TIMESTAMP(6) NOT NULL DEFAULT '0000-00-00 00:00:00.000000', isolation_level ENUM('READ-UNCOMMITTED', 'READ-COMMITTED', 'REPEATABLE-READ', 'SERIALIZABLE') NOT NULL, PRIMARY KEY (transaction_id), UNIQUE KEY (commit_id), INDEX (begin_timestamp), INDEX (commit_timestamp, transaction_id) ) ENGINE=INNODB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0"; SET @str=IF(@have_innodb <> 0, @create_innodb_table_stats, "SET @dummy = 0"); SET @str=IF(@have_innodb <> 0, @create_innodb_index_stats, "SET @dummy = 0"); SET @str=IF(@have_innodb <> 0, @create_transaction_registry, "SET @dummy = 0"); SET @cmd="CREATE TABLE IF NOT EXISTS slave_relay_log_info ( Number_of_lines INTEGER UNSIGNED NOT NULL COMMENT 'Number of lines in the file or rows in the table. Used to version table definitions.', Relay_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT 'The name of the current relay log file.', Relay_log_pos BIGINT UNSIGNED NOT NULL COMMENT 'The relay log position of the last executed event.', Master_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT 'The name of the master binary log file from which the events in the relay log file were read.', Master_log_pos BIGINT UNSIGNED NOT NULL COMMENT 'The master log position of the last executed event.', Sql_delay INTEGER NOT NULL COMMENT 'The number of seconds that the slave must lag behind the master.', Number_of_workers INTEGER UNSIGNED NOT NULL, Id INTEGER UNSIGNED NOT NULL COMMENT 'Internal Id that uniquely identifies this record.', PRIMARY KEY(Id)) DEFAULT CHARSET=utf8mb3 STATS_PERSISTENT=0 COMMENT 'Relay Log Information'"; SET @str=CONCAT(@cmd, ' ENGINE=', @innodb_or_aria); SET @cmd= "CREATE TABLE IF NOT EXISTS slave_master_info ( Number_of_lines INTEGER UNSIGNED NOT NULL COMMENT 'Number of lines in the file.', Master_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL COMMENT 'The name of the master binary log currently being read from the master.', Master_log_pos BIGINT UNSIGNED NOT NULL COMMENT 'The master log position of the last read event.', Host CHAR(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The host name of the master.', User_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The user name used to connect to the master.', User_password TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The password used to connect to the master.', Port INTEGER UNSIGNED NOT NULL COMMENT 'The network port used to connect to the master.', Connect_retry INTEGER UNSIGNED NOT NULL COMMENT 'The period (in seconds) that the slave will wait before trying to reconnect to the master.', Enabled_ssl BOOLEAN NOT NULL COMMENT 'Indicates whether the server supports SSL connections.', Ssl_ca TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The file used for the Certificate Authority (CA) certificate.', Ssl_capath TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The path to the Certificate Authority (CA) certificates.', Ssl_cert TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The name of the SSL certificate file.', Ssl_cipher TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The name of the cipher in use for the SSL connection.', Ssl_key TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The name of the SSL key file.', Ssl_verify_server_cert BOOLEAN NOT NULL COMMENT 'Whether to verify the server certificate.', Heartbeat FLOAT NOT NULL COMMENT '', Bind TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'Displays which interface is employed when connecting to the MySQL server', Ignored_server_ids TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The number of server IDs to be ignored, followed by the actual server IDs', Uuid TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The master server uuid.', Retry_count BIGINT UNSIGNED NOT NULL COMMENT 'Number of reconnect attempts, to the master, before giving up.', Ssl_crl TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The file used for the Certificate Revocation List (CRL)', Ssl_crlpath TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin COMMENT 'The path used for Certificate Revocation List (CRL) files', Enabled_auto_position BOOLEAN NOT NULL COMMENT 'Indicates whether GTIDs will be used to retrieve events from the master.', PRIMARY KEY(Host, Port)) DEFAULT CHARSET=utf8mb3 STATS_PERSISTENT=0 COMMENT 'Master Information'"; SET @cmd= "CREATE TABLE IF NOT EXISTS slave_worker_info ( Id INTEGER UNSIGNED NOT NULL, Relay_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, Relay_log_pos BIGINT UNSIGNED NOT NULL, Master_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, Master_log_pos BIGINT UNSIGNED NOT NULL, Checkpoint_relay_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, Checkpoint_relay_log_pos BIGINT UNSIGNED NOT NULL, Checkpoint_master_log_name TEXT CHARACTER SET utf8mb3 COLLATE utf8mb3_bin NOT NULL, Checkpoint_master_log_pos BIGINT UNSIGNED NOT NULL, Checkpoint_seqno INT UNSIGNED NOT NULL, Checkpoint_group_size INTEGER UNSIGNED NOT NULL, Checkpoint_group_bitmap BLOB NOT NULL, PRIMARY KEY(Id)) DEFAULT CHARSET=utf8mb3 STATS_PERSISTENT=0 COMMENT 'Worker Information'"; CREATE TABLE IF NOT EXISTS proxies_priv (Host char(255) binary DEFAULT '' NOT NULL, User char(128) binary DEFAULT '' NOT NULL, Proxied_host char(255) binary DEFAULT '' NOT NULL, Proxied_user char(128) binary DEFAULT '' NOT NULL, With_grant BOOL DEFAULT 0 NOT NULL, Grantor varchar(384) DEFAULT '' NOT NULL, Timestamp timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY /*Host*/ (Host,User,Proxied_host,Proxied_user), KEY Grantor (Grantor) ) engine=Aria transactional=1 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='User proxy privileges'; set @had_proxies_priv_table= @@warning_count != 0; CREATE TEMPORARY TABLE tmp_proxies_priv LIKE proxies_priv; INSERT INTO tmp_proxies_priv VALUES ('localhost', 'root', '', '', TRUE, '', now()); REPLACE INTO tmp_proxies_priv SELECT 'localhost',IFNULL(@auth_root_socket, 'root'), '', '', TRUE, '', now() FROM DUAL; INSERT INTO proxies_priv SELECT * FROM tmp_proxies_priv WHERE @had_proxies_priv_table=0; DROP TABLE tmp_proxies_priv; CREATE TABLE IF NOT EXISTS table_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, cardinality bigint(21) unsigned DEFAULT NULL, PRIMARY KEY (db_name,table_name) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Statistics on Tables'; CREATE TABLE IF NOT EXISTS column_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, column_name varchar(64) NOT NULL, min_value varbinary(255) DEFAULT NULL, max_value varbinary(255) DEFAULT NULL, nulls_ratio decimal(12,4) DEFAULT NULL, avg_length decimal(12,4) DEFAULT NULL, avg_frequency decimal(12,4) DEFAULT NULL, hist_size tinyint unsigned, hist_type enum('SINGLE_PREC_HB','DOUBLE_PREC_HB','JSON_HB'), histogram longblob, PRIMARY KEY (db_name,table_name,column_name) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Statistics on Columns'; CREATE TABLE IF NOT EXISTS index_stats (db_name varchar(64) NOT NULL, table_name varchar(64) NOT NULL, index_name varchar(64) NOT NULL, prefix_arity int(11) unsigned NOT NULL, avg_frequency decimal(12,4) DEFAULT NULL, PRIMARY KEY (db_name,table_name,index_name,prefix_arity) ) engine=Aria transactional=0 CHARACTER SET utf8mb3 COLLATE utf8mb3_bin comment='Statistics on Indexes'; SET @cmd= "CREATE TABLE IF NOT EXISTS gtid_slave_pos ( domain_id INT UNSIGNED NOT NULL, sub_id BIGINT UNSIGNED NOT NULL, server_id INT UNSIGNED NOT NULL, seq_no BIGINT UNSIGNED NOT NULL, PRIMARY KEY (domain_id, sub_id)) CHARSET=latin1 COMMENT='Replication slave GTID position'"; set default_storage_engine=@orig_storage_engine; drop table if exists mysql.ndb_binlog_index; drop table if exists mysql.host; set @have_old_pfs= (select count(*) from information_schema.schemata where schema_name='performance_schema'); SET @cmd="SET @broken_tables = (select count(*) from information_schema.tables where engine != 'PERFORMANCE_SCHEMA' and table_schema='performance_schema')"; SET @str = IF(@have_old_pfs = 1, @cmd, 'SET @broken_tables = 0'); SET @cmd="SET @broken_views = (select count(*) from information_schema.views where table_schema='performance_schema')"; SET @str = IF(@have_old_pfs = 1, @cmd, 'SET @broken_views = 0'); SET @broken_routines = (select count(*) from mysql.proc where db='performance_schema'); SET @broken_events = (select count(*) from mysql.event where db='performance_schema'); SET @broken_pfs= (select @broken_tables + @broken_views + @broken_routines + @broken_events); SET @cmd= "DROP DATABASE IF EXISTS performance_schema"; SET @str = IF(@broken_pfs = 0, @cmd, 'SET @dummy = 0'); SET @cmd= "CREATE DATABASE performance_schema character set utf8mb3"; SET NAMES utf8; SET @sql_log_bin = @@sql_log_bin; SET sql_log_bin = 0; CREATE DATABASE IF NOT EXISTS sys DEFAULT CHARACTER SET utf8; USE sys; CREATE OR REPLACE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW version ( sys_version, mysql_version ) AS SELECT '1.5.2' AS sys_version, version() AS mysql_version; CREATE TABLE IF NOT EXISTS sys_config ( variable VARCHAR(128) PRIMARY KEY, value VARCHAR(128), set_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, set_by VARCHAR(128) ) ENGINE = Aria; INSERT IGNORE INTO sys.sys_config (variable, value) VALUES ('statement_truncate_len', 64), ('statement_performance_analyzer.limit', 100), ('statement_performance_analyzer.view', NULL), ('diagnostics.allow_i_s_tables', 'OFF'), ('diagnostics.include_raw', 'OFF'), ('ps_thread_trx_info.max_length', 65535); FLUSH TABLES sys.sys_config; DROP TRIGGER IF EXISTS sys_config_insert_set_user; DROP TRIGGER IF EXISTS sys_config_update_set_user; DROP FUNCTION IF EXISTS extract_schema_from_file_name; DELIMITER $$ CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION extract_schema_from_file_name ( path VARCHAR(512) ) RETURNS VARCHAR(64) COMMENT ' Description Takes a raw file path, and attempts to extract the schema name from it. Useful for when interacting with Performance Schema data concerning IO statistics, for example. Currently relies on the fact that a table data file will be within a specified database directory (will not work with partitions or tables that specify an individual DATA_DIRECTORY). Parameters path (VARCHAR(512)): The full file path to a data file to extract the schema name from. Returns VARCHAR(64) Example mysql> SELECT sys.extract_schema_from_file_name(\'/var/lib/mysql/employees/employee.ibd\'); +----------------------------------------------------------------------------+ | sys.extract_schema_from_file_name(\'/var/lib/mysql/employees/employee.ibd\') | +----------------------------------------------------------------------------+ | employees | +----------------------------------------------------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN RETURN LEFT(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE(path, '\\', '/'), '/', -2), '/', 1), 64); END$$ DROP FUNCTION IF EXISTS extract_table_from_file_name; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION extract_table_from_file_name ( path VARCHAR(512) ) RETURNS VARCHAR(64) COMMENT ' Description Takes a raw file path, and extracts the table name from it. Useful for when interacting with Performance Schema data concerning IO statistics, for example. Parameters path (VARCHAR(512)): The full file path to a data file to extract the table name from. Returns VARCHAR(64) Example mysql> SELECT sys.extract_table_from_file_name(\'/var/lib/mysql/employees/employee.ibd\'); +---------------------------------------------------------------------------+ | sys.extract_table_from_file_name(\'/var/lib/mysql/employees/employee.ibd\') | +---------------------------------------------------------------------------+ | employee | +---------------------------------------------------------------------------+ 1 row in set (0.02 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN RETURN LEFT(SUBSTRING_INDEX(REPLACE(SUBSTRING_INDEX(REPLACE(path, '\\', '/'), '/', -1), '@0024', '$'), '.', 1), 64); END$$ DROP FUNCTION IF EXISTS format_bytes; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION format_bytes ( bytes TEXT ) RETURNS TEXT COMMENT ' Description Takes a raw bytes value, and converts it to a human readable format. Parameters bytes (TEXT): A raw bytes value. Returns TEXT Example mysql> SELECT sys.format_bytes(2348723492723746) AS size; +----------+ | size | +----------+ | 2.09 PiB | +----------+ 1 row in set (0.00 sec) mysql> SELECT sys.format_bytes(2348723492723) AS size; +----------+ | size | +----------+ | 2.14 TiB | +----------+ 1 row in set (0.00 sec) mysql> SELECT sys.format_bytes(23487234) AS size; +-----------+ | size | +-----------+ | 22.40 MiB | +-----------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN IF bytes IS NULL THEN RETURN NULL; ELSEIF bytes >= 1125899906842624 THEN RETURN CONCAT(ROUND(bytes / 1125899906842624, 2), ' PiB'); ELSEIF bytes >= 1099511627776 THEN RETURN CONCAT(ROUND(bytes / 1099511627776, 2), ' TiB'); ELSEIF bytes >= 1073741824 THEN RETURN CONCAT(ROUND(bytes / 1073741824, 2), ' GiB'); ELSEIF bytes >= 1048576 THEN RETURN CONCAT(ROUND(bytes / 1048576, 2), ' MiB'); ELSEIF bytes >= 1024 THEN RETURN CONCAT(ROUND(bytes / 1024, 2), ' KiB'); ELSE RETURN CONCAT(ROUND(bytes, 0), ' bytes'); END IF; END$$ DROP FUNCTION IF EXISTS format_path; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION format_path ( in_path VARCHAR(512) ) RETURNS VARCHAR(512) CHARSET UTF8 COMMENT ' Description Takes a raw path value, and strips out the datadir or tmpdir replacing with @@datadir and @@tmpdir respectively. Also normalizes the paths across operating systems, so backslashes on Windows are converted to forward slashes Parameters path (VARCHAR(512)): The raw file path value to format. Returns VARCHAR(512) CHARSET UTF8 Example mysql> select @@datadir; +-----------------------------------------------+ | @@datadir | +-----------------------------------------------+ | /Users/mark/sandboxes/SmallTree/AMaster/data/ | +-----------------------------------------------+ 1 row in set (0.06 sec) mysql> select format_path(\'/Users/mark/sandboxes/SmallTree/AMaster/data/mysql/proc.MYD\') AS path; +--------------------------+ | path | +--------------------------+ | @@datadir/mysql/proc.MYD | +--------------------------+ 1 row in set (0.03 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN DECLARE v_dir VARCHAR(1024); DECLARE v_path VARCHAR(512); DECLARE path_separator CHAR(1) DEFAULT '/'; IF @@global.version_compile_os LIKE 'win%' THEN SET path_separator = '\\'; END IF; IF in_path LIKE '/private/%' THEN SET v_path = REPLACE(in_path, '/private', ''); ELSE SET v_path = in_path; END IF; SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), ''); IF v_path IS NULL THEN RETURN NULL; END IF; IF v_path LIKE CONCAT(@@global.datadir, IF(SUBSTRING(@@global.datadir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, @@global.datadir, CONCAT('@@datadir', IF(SUBSTRING(@@global.datadir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; IF v_path LIKE CONCAT(@@global.tmpdir, IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, @@global.tmpdir, CONCAT('@@tmpdir', IF(SUBSTRING(@@global.tmpdir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_data_home_dir'), ''); IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_data_home_dir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_log_group_home_dir'), ''); IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_log_group_home_dir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; SET v_dir= IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'slave_load_tmpdir'), ''); IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, v_dir, CONCAT('@@slave_load_tmpdir', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; SET v_dir = IFNULL((SELECT VARIABLE_VALUE FROM information_schema.global_variables WHERE VARIABLE_NAME = 'innodb_undo_directory'), ''); IF v_path LIKE CONCAT(v_dir, IF(SUBSTRING(v_dir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, v_dir, CONCAT('@@innodb_undo_directory', IF(SUBSTRING(v_dir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; IF v_path LIKE CONCAT(@@global.basedir, IF(SUBSTRING(@@global.basedir, -1) = path_separator, '%', CONCAT(path_separator, '%'))) ESCAPE '|' THEN SET v_path = REPLACE(v_path, @@global.basedir, CONCAT('@@basedir', IF(SUBSTRING(@@global.basedir, -1) = path_separator, path_separator, ''))); RETURN v_path; END IF; RETURN v_path; END$$ DROP FUNCTION IF EXISTS format_statement; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION format_statement ( statement LONGTEXT ) RETURNS LONGTEXT COMMENT ' Description Formats a normalized statement, truncating it if it is > 64 characters long by default. To configure the length to truncate the statement to by default, update the `statement_truncate_len` variable with `sys_config` table to a different value. Alternatively, to change it just for just your particular session, use `SET @sys.statement_truncate_len := `. Useful for printing statement related data from Performance Schema from the command line. Parameters statement (LONGTEXT): The statement to format. Returns LONGTEXT Example mysql> SELECT sys.format_statement(digest_text) -> FROM performance_schema.events_statements_summary_by_digest -> ORDER by sum_timer_wait DESC limit 5; +-------------------------------------------------------------------+ | sys.format_statement(digest_text) | +-------------------------------------------------------------------+ | CREATE SQL SECURITY INVOKER VI ... KE ? AND `variable_value` > ? | | CREATE SQL SECURITY INVOKER VI ... ait` IS NOT NULL , `esc` . ... | | CREATE SQL SECURITY INVOKER VI ... ait` IS NOT NULL , `sys` . ... | | CREATE SQL SECURITY INVOKER VI ... , `compressed_size` ) ) DESC | | CREATE SQL SECURITY INVOKER VI ... LIKE ? ORDER BY `timer_start` | +-------------------------------------------------------------------+ 5 rows in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN IF @sys.statement_truncate_len IS NULL THEN SET @sys.statement_truncate_len = sys_get_config('statement_truncate_len', 64); END IF; IF CHAR_LENGTH(statement) > @sys.statement_truncate_len THEN RETURN REPLACE(CONCAT(LEFT(statement, (@sys.statement_truncate_len/2)-2), ' ... ', RIGHT(statement, (@sys.statement_truncate_len/2)-2)), '\n', ' '); ELSE RETURN REPLACE(statement, '\n', ' '); END IF; END$$ DROP FUNCTION IF EXISTS format_time; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION format_time ( picoseconds TEXT ) RETURNS TEXT CHARSET UTF8 COMMENT ' Description OBSOLETE. USE BUILT-IN format_pico_time() INSTEAD Takes a raw picoseconds value, and converts it to a human readable form. Picoseconds are the precision that all latency values are printed in within Performance Schema, however are not user friendly when wanting to scan output from the command line. Parameters picoseconds (TEXT): The raw picoseconds value to convert. Returns TEXT Example mysql> select format_time(342342342342345); +------------------------------+ | format_time(342342342342345) | +------------------------------+ | 00:05:42 | +------------------------------+ 1 row in set (0.00 sec) mysql> select format_time(342342342); +------------------------+ | format_time(342342342) | +------------------------+ | 342.34 us | +------------------------+ 1 row in set (0.00 sec) mysql> select format_time(34234); +--------------------+ | format_time(34234) | +--------------------+ | 34.23 ns | +--------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN IF picoseconds IS NULL THEN RETURN NULL; ELSEIF picoseconds >= 604800000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 604800000000000000, 2), ' w'); ELSEIF picoseconds >= 86400000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 86400000000000000, 2), ' d'); ELSEIF picoseconds >= 3600000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 3600000000000000, 2), ' h'); ELSEIF picoseconds >= 60000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 60000000000000, 2), ' m'); ELSEIF picoseconds >= 1000000000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000000000, 2), ' s'); ELSEIF picoseconds >= 1000000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000000, 2), ' ms'); ELSEIF picoseconds >= 1000000 THEN RETURN CONCAT(ROUND(picoseconds / 1000000, 2), ' us'); ELSEIF picoseconds >= 1000 THEN RETURN CONCAT(ROUND(picoseconds / 1000, 2), ' ns'); ELSE RETURN CONCAT(picoseconds, ' ps'); END IF; END$$ DROP FUNCTION IF EXISTS list_add; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION list_add ( in_list TEXT, in_add_value TEXT ) RETURNS TEXT COMMENT ' Description Takes a list, and a value to add to the list, and returns the resulting list. Useful for altering certain session variables, like sql_mode or optimizer_switch for instance. Parameters in_list (TEXT): The comma separated list to add a value to in_add_value (TEXT): The value to add to the input list Returns TEXT Example mysql> select @@sql_mode; +-----------------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------------+ | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> set sql_mode = sys.list_add(@@sql_mode, ''ANSI_QUOTES''); Query OK, 0 rows affected (0.06 sec) mysql> select @@sql_mode; +-----------------------------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------------------------+ | ANSI_QUOTES,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC CONTAINS SQL BEGIN IF (in_add_value IS NULL) THEN SIGNAL SQLSTATE '02200' SET MESSAGE_TEXT = 'Function sys.list_add: in_add_value input variable should not be NULL', MYSQL_ERRNO = 1138; END IF; IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN RETURN in_add_value; END IF; RETURN (SELECT CONCAT(TRIM(BOTH ',' FROM TRIM(in_list)), ',', in_add_value)); END$$ DROP FUNCTION IF EXISTS list_drop; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION list_drop ( in_list TEXT, in_drop_value TEXT ) RETURNS TEXT COMMENT ' Description Takes a list, and a value to attempt to remove from the list, and returns the resulting list. Useful for altering certain session variables, like sql_mode or optimizer_switch for instance. Parameters in_list (TEXT): The comma separated list to drop a value from in_drop_value (TEXT): The value to drop from the input list Returns TEXT Example mysql> select @@sql_mode; +-----------------------------------------------------------------------------------------------+ | @@sql_mode | +-----------------------------------------------------------------------------------------------+ | ANSI_QUOTES,ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +-----------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> set sql_mode = sys.list_drop(@@sql_mode, ''ONLY_FULL_GROUP_BY''); Query OK, 0 rows affected (0.03 sec) mysql> select @@sql_mode; +----------------------------------------------------------------------------+ | @@sql_mode | +----------------------------------------------------------------------------+ | ANSI_QUOTES,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +----------------------------------------------------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC CONTAINS SQL BEGIN IF (in_drop_value IS NULL) THEN SIGNAL SQLSTATE '02200' SET MESSAGE_TEXT = 'Function sys.list_drop: in_drop_value input variable should not be NULL', MYSQL_ERRNO = 1138; END IF; IF (in_list IS NULL OR LENGTH(in_list) = 0) THEN RETURN in_list; END IF; RETURN (SELECT TRIM(BOTH ',' FROM REPLACE(REPLACE(CONCAT(',', in_list), CONCAT(',', in_drop_value), ''), CONCAT(', ', in_drop_value), ''))); END$$ DROP FUNCTION IF EXISTS ps_is_account_enabled; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_is_account_enabled ( in_host VARCHAR(60), in_user VARCHAR(16) ) RETURNS ENUM('YES', 'NO') COMMENT ' Description Determines whether instrumentation of an account is enabled within Performance Schema. Parameters in_host VARCHAR(60): The hostname of the account to check. in_user (VARCHAR(16)): The username of the account to check. Returns ENUM(\'YES\', \'NO\', \'PARTIAL\') Example mysql> SELECT sys.ps_is_account_enabled(\'localhost\', \'root\'); +------------------------------------------------+ | sys.ps_is_account_enabled(\'localhost\', \'root\') | +------------------------------------------------+ | YES | +------------------------------------------------+ 1 row in set (0.01 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN RETURN IF(EXISTS(SELECT 1 FROM performance_schema.setup_actors WHERE (`HOST` = '%' OR in_host LIKE `HOST`) AND (`USER` = '%' OR `USER` = in_user) ), 'YES', 'NO' ); END$$ DROP FUNCTION IF EXISTS ps_is_consumer_enabled; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_is_consumer_enabled ( in_consumer varchar(64) ) RETURNS enum('YES', 'NO') COMMENT ' Description Determines whether a consumer is enabled (taking the consumer hierarchy into consideration) within the Performance Schema. Parameters in_consumer VARCHAR(64): The name of the consumer to check. Returns ENUM(\'YES\', \'NO\') Example mysql> SELECT sys.ps_is_consumer_enabled(\'events_stages_history\'); +-----------------------------------------------------+ | sys.ps_is_consumer_enabled(\'events_stages_history\') | +-----------------------------------------------------+ | NO | +-----------------------------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN RETURN ( SELECT (CASE WHEN c.NAME = 'global_instrumentation' THEN c.ENABLED WHEN c.NAME = 'thread_instrumentation' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO') WHEN c.NAME LIKE '%\_digest' THEN IF(cg.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO') WHEN c.NAME LIKE '%\_current' THEN IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES', 'YES', 'NO') ELSE IF(cg.ENABLED = 'YES' AND ct.ENABLED = 'YES' AND c.ENABLED = 'YES' AND ( SELECT cc.ENABLED FROM performance_schema.setup_consumers cc WHERE NAME = CONCAT(SUBSTRING_INDEX(c.NAME, '_', 2), '_current') ) = 'YES', 'YES', 'NO') END) AS IsEnabled FROM performance_schema.setup_consumers c INNER JOIN performance_schema.setup_consumers cg INNER JOIN performance_schema.setup_consumers ct WHERE cg.NAME = 'global_instrumentation' AND ct.NAME = 'thread_instrumentation' AND c.NAME = in_consumer ); END$$ DROP FUNCTION IF EXISTS ps_is_instrument_default_enabled; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_is_instrument_default_enabled ( in_instrument VARCHAR(128) ) RETURNS ENUM('YES', 'NO') COMMENT ' Description Returns whether an instrument is enabled by default in this version of MySQL. Parameters in_instrument VARCHAR(128): The instrument to check. Returns ENUM(\'YES\', \'NO\') Example mysql> SELECT sys.ps_is_instrument_default_enabled(\'statement/sql/select\'); +--------------------------------------------------------------+ | sys.ps_is_instrument_default_enabled(\'statement/sql/select\') | +--------------------------------------------------------------+ | YES | +--------------------------------------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN DECLARE v_enabled ENUM('YES', 'NO'); SET v_enabled = IF(in_instrument LIKE 'wait/io/file/%' OR in_instrument LIKE 'wait/io/table/%' OR in_instrument LIKE 'statement/%' OR in_instrument LIKE 'memory/performance_schema/%' OR in_instrument IN ('wait/lock/table/sql/handler', 'idle') /*!50707 OR in_instrument LIKE 'stage/innodb/%' OR in_instrument = 'stage/sql/copy to tmp table' */ , 'YES', 'NO' ); RETURN v_enabled; END$$ DROP FUNCTION IF EXISTS ps_is_instrument_default_timed; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_is_instrument_default_timed ( in_instrument VARCHAR(128) ) RETURNS ENUM('YES', 'NO') COMMENT ' Description Returns whether an instrument is timed by default in this version of MySQL. Parameters in_instrument VARCHAR(128): The instrument to check. Returns ENUM(\'YES\', \'NO\') Example mysql> SELECT sys.ps_is_instrument_default_timed(\'statement/sql/select\'); +------------------------------------------------------------+ | sys.ps_is_instrument_default_timed(\'statement/sql/select\') | +------------------------------------------------------------+ | YES | +------------------------------------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN DECLARE v_timed ENUM('YES', 'NO'); SET v_timed = IF(in_instrument LIKE 'wait/io/file/%' OR in_instrument LIKE 'wait/io/table/%' OR in_instrument LIKE 'statement/%' OR in_instrument IN ('wait/lock/table/sql/handler', 'idle') /*!50707 OR in_instrument LIKE 'stage/innodb/%' OR in_instrument = 'stage/sql/copy to tmp table' */ , 'YES', 'NO' ); RETURN v_timed; END$$ DROP FUNCTION IF EXISTS ps_is_thread_instrumented; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_is_thread_instrumented ( in_connection_id BIGINT UNSIGNED ) RETURNS ENUM('YES', 'NO', 'UNKNOWN') COMMENT ' Description Checks whether the provided connection id is instrumented within Performance Schema. Parameters in_connection_id (BIGINT UNSIGNED): The id of the connection to check. Returns ENUM(\'YES\', \'NO\', \'UNKNOWN\') Example mysql> SELECT sys.ps_is_thread_instrumented(CONNECTION_ID()); +------------------------------------------------+ | sys.ps_is_thread_instrumented(CONNECTION_ID()) | +------------------------------------------------+ | YES | +------------------------------------------------+ ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE v_enabled ENUM('YES', 'NO', 'UNKNOWN'); IF (in_connection_id IS NULL) THEN RETURN NULL; END IF; SELECT INSTRUMENTED INTO v_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = in_connection_id; IF (v_enabled IS NULL) THEN RETURN 'UNKNOWN'; ELSE RETURN v_enabled; END IF; END$$ DROP FUNCTION IF EXISTS ps_thread_id; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_thread_id ( in_connection_id BIGINT UNSIGNED ) RETURNS BIGINT UNSIGNED COMMENT ' Description Return the Performance Schema THREAD_ID for the specified connection ID. Parameters in_connection_id (BIGINT UNSIGNED): The id of the connection to return the thread id for. If NULL, the current connection thread id is returned. Example mysql> SELECT sys.ps_thread_id(79); +----------------------+ | sys.ps_thread_id(79) | +----------------------+ | 98 | +----------------------+ 1 row in set (0.00 sec) mysql> SELECT sys.ps_thread_id(CONNECTION_ID()); +-----------------------------------+ | sys.ps_thread_id(CONNECTION_ID()) | +-----------------------------------+ | 98 | +-----------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN RETURN (SELECT THREAD_ID FROM `performance_schema`.`threads` WHERE PROCESSLIST_ID = IFNULL(in_connection_id, CONNECTION_ID()) ); END$$ DROP FUNCTION IF EXISTS ps_thread_account; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_thread_account ( in_thread_id BIGINT UNSIGNED ) RETURNS TEXT COMMENT ' Description Return the user@host account for the given Performance Schema thread id. Parameters in_thread_id (BIGINT UNSIGNED): The id of the thread to return the account for. Example mysql> select thread_id, processlist_user, processlist_host from performance_schema.threads where type = ''foreground''; +-----------+------------------+------------------+ | thread_id | processlist_user | processlist_host | +-----------+------------------+------------------+ | 23 | NULL | NULL | | 30 | root | localhost | | 31 | msandbox | localhost | | 32 | msandbox | localhost | +-----------+------------------+------------------+ 4 rows in set (0.00 sec) mysql> select sys.ps_thread_account(31); +---------------------------+ | sys.ps_thread_account(31) | +---------------------------+ | msandbox@localhost | +---------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN RETURN (SELECT IF( type = 'FOREGROUND', CONCAT(processlist_user, '@', processlist_host), type ) AS account FROM `performance_schema`.`threads` WHERE thread_id = in_thread_id); END$$ DROP FUNCTION IF EXISTS ps_thread_stack; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_thread_stack ( thd_id BIGINT UNSIGNED, debug BOOLEAN ) RETURNS LONGTEXT CHARSET latin1 COMMENT ' Description Outputs a JSON formatted stack of all statements, stages and events within Performance Schema for the specified thread. Parameters thd_id (BIGINT UNSIGNED): The id of the thread to trace. This should match the thread_id column from the performance_schema.threads table. in_verbose (BOOLEAN): Include file:lineno information in the events. Example (line separation added for output) mysql> SELECT sys.ps_thread_stack(37, FALSE) AS thread_stack\\G *************************** 1. row *************************** thread_stack: {"rankdir": "LR","nodesep": "0.10","stack_created": "2014-02-19 13:39:03", "mysql_version": "5.7.3-m13","mysql_user": "root@localhost","events": [{"nesting_event_id": "0", "event_id": "10", "timer_wait": 256.35, "event_info": "sql/select", "wait_info": "select @@version_comment limit 1\\nerrors: 0\\nwarnings: 0\\nlock time: ... ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE json_objects LONGTEXT; /*!50602 UPDATE performance_schema.threads SET instrumented = 'NO' WHERE processlist_id = CONNECTION_ID(); */ SET SESSION group_concat_max_len=@@global.max_allowed_packet; SELECT GROUP_CONCAT(CONCAT( '{' , CONCAT_WS( ', ' , CONCAT('"nesting_event_id": "', IF(nesting_event_id IS NULL, '0', nesting_event_id), '"') , CONCAT('"event_id": "', event_id, '"') , CONCAT( '"timer_wait": ', ROUND(timer_wait/1000000, 2)) , CONCAT( '"event_info": "' , CASE WHEN event_name NOT LIKE 'wait/io%' THEN REPLACE(SUBSTRING_INDEX(event_name, '/', -2), '\\', '\\\\') WHEN event_name NOT LIKE 'wait/io/file%' OR event_name NOT LIKE 'wait/io/socket%' THEN REPLACE(SUBSTRING_INDEX(event_name, '/', -4), '\\', '\\\\') ELSE event_name END , '"' ) , CONCAT( '"wait_info": "', IFNULL(wait_info, ''), '"') , CONCAT( '"source": "', IF(true AND event_name LIKE 'wait%', IFNULL(wait_info, ''), ''), '"') , CASE WHEN event_name LIKE 'wait/io/file%' THEN '"event_type": "io/file"' WHEN event_name LIKE 'wait/io/table%' THEN '"event_type": "io/table"' WHEN event_name LIKE 'wait/io/socket%' THEN '"event_type": "io/socket"' WHEN event_name LIKE 'wait/synch/mutex%' THEN '"event_type": "synch/mutex"' WHEN event_name LIKE 'wait/synch/cond%' THEN '"event_type": "synch/cond"' WHEN event_name LIKE 'wait/synch/rwlock%' THEN '"event_type": "synch/rwlock"' WHEN event_name LIKE 'wait/lock%' THEN '"event_type": "lock"' WHEN event_name LIKE 'statement/%' THEN '"event_type": "stmt"' WHEN event_name LIKE 'stage/%' THEN '"event_type": "stage"' WHEN event_name LIKE '%idle%' THEN '"event_type": "idle"' ELSE '' END ) , '}' ) ORDER BY event_id ASC SEPARATOR ',') event INTO json_objects FROM ( /*!50600 (SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, CONCAT(sql_text, '\\n', 'errors: ', errors, '\\n', 'warnings: ', warnings, '\\n', 'lock time: ', ROUND(lock_time/1000000, 2),'us\\n', 'rows affected: ', rows_affected, '\\n', 'rows sent: ', rows_sent, '\\n', 'rows examined: ', rows_examined, '\\n', 'tmp tables: ', created_tmp_tables, '\\n', 'tmp disk tables: ', created_tmp_disk_tables, '\\n', 'select scan: ', select_scan, '\\n', 'select full join: ', select_full_join, '\\n', 'select full range join: ', select_full_range_join, '\\n', 'select range: ', select_range, '\\n', 'select range check: ', select_range_check, '\\n', 'sort merge passes: ', sort_merge_passes, '\\n', 'sort rows: ', sort_rows, '\\n', 'sort range: ', sort_range, '\\n', 'sort scan: ', sort_scan, '\\n', 'no index used: ', IF(no_index_used, 'TRUE', 'FALSE'), '\\n', 'no good index used: ', IF(no_good_index_used, 'TRUE', 'FALSE'), '\\n' ) AS wait_info FROM performance_schema.events_statements_history_long WHERE thread_id = thd_id) UNION (SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, null AS wait_info FROM performance_schema.events_stages_history_long WHERE thread_id = thd_id) UNION */ (SELECT thread_id, event_id, CONCAT(event_name , IF(event_name NOT LIKE 'wait/synch/mutex%', IFNULL(CONCAT(' - ', operation), ''), ''), IF(number_of_bytes IS NOT NULL, CONCAT(' ', number_of_bytes, ' bytes'), ''), IF(event_name LIKE 'wait/io/file%', '\\n', ''), IF(object_schema IS NOT NULL, CONCAT('\\nObject: ', object_schema, '.'), ''), IF(object_name IS NOT NULL, IF (event_name LIKE 'wait/io/socket%', CONCAT(IF (object_name LIKE ':0%', @@socket, object_name)), object_name), ''), /*!50600 IF(index_name IS NOT NULL, CONCAT(' Index: ', index_name), ''),*/'\\n' ) AS event_name, timer_wait, timer_start, nesting_event_id, source AS wait_info FROM performance_schema.events_waits_history_long WHERE thread_id = thd_id)) events ORDER BY event_id; RETURN CONCAT('{', CONCAT_WS(',', '"rankdir": "LR"', '"nodesep": "0.10"', CONCAT('"stack_created": "', NOW(), '"'), CONCAT('"mysql_version": "', VERSION(), '"'), CONCAT('"mysql_user": "', CURRENT_USER(), '"'), CONCAT('"events": [', IFNULL(json_objects,''), ']') ), '}'); END$$ DROP FUNCTION IF EXISTS ps_thread_trx_info; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION ps_thread_trx_info ( in_thread_id BIGINT UNSIGNED ) RETURNS LONGTEXT COMMENT ' Description Returns a JSON object with info on the given threads current transaction, and the statements it has already executed, derived from the performance_schema.events_transactions_current and performance_schema.events_statements_history tables (so the consumers for these also have to be enabled within Performance Schema to get full data in the object). When the output exceeds the default truncation length (65535), a JSON error object is returned, such as: { "error": "Trx info truncated: Row 6 was cut by GROUP_CONCAT()" } Similar error objects are returned for other warnings/and exceptions raised when calling the function. The max length of the output of this function can be controlled with the ps_thread_trx_info.max_length variable set via sys_config, or the @sys.ps_thread_trx_info.max_length user variable, as appropriate. Parameters in_thread_id (BIGINT UNSIGNED): The id of the thread to return the transaction info for. Example SELECT sys.ps_thread_trx_info(48)\\G *************************** 1. row *************************** sys.ps_thread_trx_info(48): [ { "time": "790.70 us", "state": "COMMITTED", "mode": "READ WRITE", "autocommitted": "NO", "gtid": "AUTOMATIC", "isolation": "REPEATABLE READ", "statements_executed": [ { "sql_text": "INSERT INTO info VALUES (1, \'foo\')", "time": "471.02 us", "schema": "trx", "rows_examined": 0, "rows_affected": 1, "rows_sent": 0, "tmp_tables": 0, "tmp_disk_tables": 0, "sort_rows": 0, "sort_merge_passes": 0 }, { "sql_text": "COMMIT", "time": "254.42 us", "schema": "trx", "rows_examined": 0, "rows_affected": 0, "rows_sent": 0, "tmp_tables": 0, "tmp_disk_tables": 0, "sort_rows": 0, "sort_merge_passes": 0 } ] }, { "time": "426.20 us", "state": "COMMITTED", "mode": "READ WRITE", "autocommitted": "NO", "gtid": "AUTOMATIC", "isolation": "REPEATABLE READ", "statements_executed": [ { "sql_text": "INSERT INTO info VALUES (2, \'bar\')", "time": "107.33 us", "schema": "trx", "rows_examined": 0, "rows_affected": 1, "rows_sent": 0, "tmp_tables": 0, "tmp_disk_tables": 0, "sort_rows": 0, "sort_merge_passes": 0 }, { "sql_text": "COMMIT", "time": "213.23 us", "schema": "trx", "rows_examined": 0, "rows_affected": 0, "rows_sent": 0, "tmp_tables": 0, "tmp_disk_tables": 0, "sort_rows": 0, "sort_merge_passes": 0 } ] } ] 1 row in set (0.03 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE v_output LONGTEXT DEFAULT '{}'; DECLARE v_msg_text TEXT DEFAULT ''; DECLARE v_signal_msg TEXT DEFAULT ''; DECLARE v_mysql_errno INT; DECLARE v_max_output_len BIGINT; DECLARE EXIT HANDLER FOR SQLWARNING, SQLEXCEPTION BEGIN GET DIAGNOSTICS CONDITION 1 v_msg_text = MESSAGE_TEXT, v_mysql_errno = MYSQL_ERRNO; IF v_mysql_errno = 1260 THEN SET v_signal_msg = CONCAT('{ "error": "Trx info truncated: ', v_msg_text, '" }'); ELSE SET v_signal_msg = CONCAT('{ "error": "', v_msg_text, '" }'); END IF; RETURN v_signal_msg; END; IF (@sys.ps_thread_trx_info.max_length IS NULL) THEN SET @sys.ps_thread_trx_info.max_length = sys.sys_get_config('ps_thread_trx_info.max_length', 65535); END IF; IF (@sys.ps_thread_trx_info.max_length != @@session.group_concat_max_len) THEN SET @old_group_concat_max_len = @@session.group_concat_max_len; SET v_max_output_len = (@sys.ps_thread_trx_info.max_length - 5); SET SESSION group_concat_max_len = v_max_output_len; END IF; SET v_output = ( SELECT CONCAT('[', IFNULL(GROUP_CONCAT(trx_info ORDER BY event_id), ''), '\n]') AS trx_info FROM (SELECT trxi.thread_id, trxi.event_id, GROUP_CONCAT( IFNULL( CONCAT('\n {\n', ' "time": "', IFNULL(format_pico_time(trxi.timer_wait), ''), '",\n', ' "state": "', IFNULL(trxi.state, ''), '",\n', ' "mode": "', IFNULL(trxi.access_mode, ''), '",\n', ' "autocommitted": "', IFNULL(trxi.autocommit, ''), '",\n', ' "gtid": "', IFNULL(trxi.gtid, ''), '",\n', ' "isolation": "', IFNULL(trxi.isolation_level, ''), '",\n', ' "statements_executed": [', IFNULL(s.stmts, ''), IF(s.stmts IS NULL, ' ]\n', '\n ]\n'), ' }' ), '') ORDER BY event_id) AS trx_info FROM ( (SELECT thread_id, event_id, timer_wait, state,access_mode, autocommit, gtid, isolation_level FROM performance_schema.events_transactions_current WHERE thread_id = in_thread_id AND end_event_id IS NULL) UNION (SELECT thread_id, event_id, timer_wait, state,access_mode, autocommit, gtid, isolation_level FROM performance_schema.events_transactions_history WHERE thread_id = in_thread_id) ) AS trxi LEFT JOIN (SELECT thread_id, nesting_event_id, GROUP_CONCAT( IFNULL( CONCAT('\n {\n', ' "sql_text": "', IFNULL(sys.format_statement(REPLACE(sql_text, '\\', '\\\\')), ''), '",\n', ' "time": "', IFNULL(format_pico_time(timer_wait), ''), '",\n', ' "schema": "', IFNULL(current_schema, ''), '",\n', ' "rows_examined": ', IFNULL(rows_examined, ''), ',\n', ' "rows_affected": ', IFNULL(rows_affected, ''), ',\n', ' "rows_sent": ', IFNULL(rows_sent, ''), ',\n', ' "tmp_tables": ', IFNULL(created_tmp_tables, ''), ',\n', ' "tmp_disk_tables": ', IFNULL(created_tmp_disk_tables, ''), ',\n', ' "sort_rows": ', IFNULL(sort_rows, ''), ',\n', ' "sort_merge_passes": ', IFNULL(sort_merge_passes, ''), '\n', ' }'), '') ORDER BY event_id) AS stmts FROM performance_schema.events_statements_history WHERE sql_text IS NOT NULL AND thread_id = in_thread_id GROUP BY thread_id, nesting_event_id ) AS s ON trxi.thread_id = s.thread_id AND trxi.event_id = s.nesting_event_id WHERE trxi.thread_id = in_thread_id GROUP BY trxi.thread_id, trxi.event_id ) trxs GROUP BY thread_id ); IF (@old_group_concat_max_len IS NOT NULL) THEN SET SESSION group_concat_max_len = @old_group_concat_max_len; END IF; RETURN v_output; END$$ DROP FUNCTION IF EXISTS quote_identifier; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION quote_identifier(in_identifier TEXT) RETURNS TEXT CHARSET UTF8 COMMENT ' Description Takes an unquoted identifier (schema name, table name, etc.) and returns the identifier quoted with backticks. Parameters in_identifier (TEXT): The identifier to quote. Returns TEXT Example mysql> SELECT sys.quote_identifier(''my_identifier'') AS Identifier; +-----------------+ | Identifier | +-----------------+ | `my_identifier` | +-----------------+ 1 row in set (0.00 sec) mysql> SELECT sys.quote_identifier(''my`idenfier'') AS Identifier; +----------------+ | Identifier | +----------------+ | `my``idenfier` | +----------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER DETERMINISTIC NO SQL BEGIN RETURN CONCAT('`', REPLACE(in_identifier, '`', '``'), '`'); END$$ DROP FUNCTION IF EXISTS sys_get_config; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION sys_get_config ( in_variable_name VARCHAR(128), in_default_value VARCHAR(128) ) RETURNS VARCHAR(128) COMMENT ' Description Returns the value for the requested variable using the following logic: 1. If the option exists in sys.sys_config return the value from there. 2. Else fall back on the provided default value. Notes for using sys_get_config(): * If the default value argument to sys_get_config() is NULL and case 2. is reached, NULL is returned. It is then expected that the caller is able to handle NULL for the given configuration option. * The convention is to name the user variables @sys.. It is that is stored in the sys_config table and is what is expected as the argument to sys_get_config(). * If you want to check whether the configuration option has already been set and if not assign with the return value of sys_get_config() you can use IFNULL(...) (see example below). However this should not be done inside a loop (e.g. for each row in a result set) as for repeated calls where assignment is only needed in the first iteration using IFNULL(...) is expected to be significantly slower than using an IF (...) THEN ... END IF; block (see example below). Parameters in_variable_name (VARCHAR(128)): The name of the config option to return the value for. in_default_value (VARCHAR(128)): The default value to return if the variable does not exist in sys.sys_config. Returns VARCHAR(128) Example mysql> SELECT sys.sys_get_config(''statement_truncate_len'', 128) AS Value; +-------+ | Value | +-------+ | 64 | +-------+ 1 row in set (0.00 sec) mysql> SET @sys.statement_truncate_len = IFNULL(@sys.statement_truncate_len, sys.sys_get_config(''statement_truncate_len'', 64)); Query OK, 0 rows affected (0.00 sec) IF (@sys.statement_truncate_len IS NULL) THEN SET @sys.statement_truncate_len = sys.sys_get_config(''statement_truncate_len'', 64); END IF; ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN DECLARE v_value VARCHAR(128) DEFAULT NULL; DECLARE old_val INTEGER DEFAULT NULL; SET v_value = (SELECT value FROM sys.sys_config WHERE variable = in_variable_name); IF (v_value IS NULL) THEN SET v_value = in_default_value; END IF; RETURN v_value; END $$ DROP FUNCTION IF EXISTS version_major; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION version_major () RETURNS TINYINT UNSIGNED COMMENT ' Description Returns the major version of MySQL Server. Returns TINYINT UNSIGNED Example mysql> SELECT VERSION(), sys.version_major(); +--------------------------------------+---------------------+ | VERSION() | sys.version_major() | +--------------------------------------+---------------------+ | 5.7.9-enterprise-commercial-advanced | 5 | +--------------------------------------+---------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC NO SQL BEGIN RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-', 1), '.', 1); END$$ DROP FUNCTION IF EXISTS version_minor; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION version_minor () RETURNS TINYINT UNSIGNED COMMENT ' Description Returns the minor (release series) version of MySQL Server. Returns TINYINT UNSIGNED Example mysql> SELECT VERSION(), sys.server_minor(); +--------------------------------------+---------------------+ | VERSION() | sys.version_minor() | +--------------------------------------+---------------------+ | 5.7.9-enterprise-commercial-advanced | 7 | +--------------------------------------+---------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC NO SQL BEGIN RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-', 1), '.', 2), '.', -1); END$$ DROP FUNCTION IF EXISTS version_patch; CREATE DEFINER='mariadb.sys'@'localhost' FUNCTION version_patch () RETURNS TINYINT UNSIGNED COMMENT ' Description Returns the patch release version of MySQL Server. Returns TINYINT UNSIGNED Example mysql> SELECT VERSION(), sys.version_patch(); +--------------------------------------+---------------------+ | VERSION() | sys.version_patch() | +--------------------------------------+---------------------+ | 5.7.9-enterprise-commercial-advanced | 9 | +--------------------------------------+---------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC NO SQL BEGIN RETURN SUBSTRING_INDEX(SUBSTRING_INDEX(VERSION(), '-', 1), '.', -1); END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW innodb_buffer_stats_by_schema ( object_schema, allocated, data, pages, pages_hashed, pages_old, rows_cached ) AS SELECT IF(LOCATE('.', ibp.table_name) = 0, 'InnoDB System', REPLACE(SUBSTRING_INDEX(ibp.table_name, '.', 1), '`', '')) AS object_schema, sys.format_bytes(SUM(IF(ibp.compressed_size = 0, 16384, compressed_size))) AS allocated, sys.format_bytes(SUM(ibp.data_size)) AS data, COUNT(ibp.page_number) AS pages, COUNT(IF(ibp.is_hashed = 'YES', 1, NULL)) AS pages_hashed, COUNT(IF(ibp.is_old = 'YES', 1, NULL)) AS pages_old, ROUND(SUM(ibp.number_records)/COUNT(DISTINCT ibp.index_name)) AS rows_cached FROM information_schema.innodb_buffer_page ibp WHERE table_name IS NOT NULL GROUP BY object_schema ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$innodb_buffer_stats_by_schema ( object_schema, allocated, data, pages, pages_hashed, pages_old, rows_cached ) AS SELECT IF(LOCATE('.', ibp.table_name) = 0, 'InnoDB System', REPLACE(SUBSTRING_INDEX(ibp.table_name, '.', 1), '`', '')) AS object_schema, SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) AS allocated, SUM(ibp.data_size) AS data, COUNT(ibp.page_number) AS pages, COUNT(IF(ibp.is_hashed, 1, NULL)) AS pages_hashed, COUNT(IF(ibp.is_old, 1, NULL)) AS pages_old, ROUND(IFNULL(SUM(ibp.number_records)/NULLIF(COUNT(DISTINCT ibp.index_name), 0), 0)) AS rows_cached FROM information_schema.innodb_buffer_page ibp WHERE table_name IS NOT NULL GROUP BY object_schema ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW innodb_buffer_stats_by_table ( object_schema, object_name, allocated, data, pages, pages_hashed, pages_old, rows_cached ) AS SELECT IF(LOCATE('.', ibp.table_name) = 0, 'InnoDB System', REPLACE(SUBSTRING_INDEX(ibp.table_name, '.', 1), '`', '')) AS object_schema, REPLACE(SUBSTRING_INDEX(ibp.table_name, '.', -1), '`', '') AS object_name, sys.format_bytes(SUM(IF(ibp.compressed_size = 0, 16384, compressed_size))) AS allocated, sys.format_bytes(SUM(ibp.data_size)) AS data, COUNT(ibp.page_number) AS pages, COUNT(IF(ibp.is_hashed = 'YES', 1, NULL)) AS pages_hashed, COUNT(IF(ibp.is_old = 'YES', 1, NULL)) AS pages_old, ROUND(SUM(ibp.number_records)/COUNT(DISTINCT ibp.index_name)) AS rows_cached FROM information_schema.innodb_buffer_page ibp WHERE table_name IS NOT NULL GROUP BY object_schema, object_name ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$innodb_buffer_stats_by_table ( object_schema, object_name, allocated, data, pages, pages_hashed, pages_old, rows_cached ) AS SELECT IF(LOCATE('.', ibp.table_name) = 0, 'InnoDB System', REPLACE(SUBSTRING_INDEX(ibp.table_name, '.', 1), '`', '')) AS object_schema, REPLACE(SUBSTRING_INDEX(ibp.table_name, '.', -1), '`', '') AS object_name, SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) AS allocated, SUM(ibp.data_size) AS data, COUNT(ibp.page_number) AS pages, COUNT(IF(ibp.is_hashed, 1, NULL)) AS pages_hashed, COUNT(IF(ibp.is_old, 1, NULL)) AS pages_old, ROUND(IFNULL(SUM(ibp.number_records)/NULLIF(COUNT(DISTINCT ibp.index_name), 0), 0)) AS rows_cached FROM information_schema.innodb_buffer_page ibp WHERE table_name IS NOT NULL GROUP BY object_schema, object_name ORDER BY SUM(IF(ibp.compressed_size = 0, 16384, compressed_size)) DESC; END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW innodb_lock_waits ( wait_started, wait_age, wait_age_secs, locked_table, locked_index, locked_type, waiting_trx_id, waiting_trx_started, waiting_trx_age, waiting_trx_rows_locked, waiting_trx_rows_modified, waiting_pid, waiting_query, waiting_lock_id, waiting_lock_mode, blocking_trx_id, blocking_pid, blocking_query, blocking_lock_id, blocking_lock_mode, blocking_trx_started, blocking_trx_age, blocking_trx_rows_locked, blocking_trx_rows_modified, sql_kill_blocking_query, sql_kill_blocking_connection ) AS SELECT r.trx_wait_started AS wait_started, TIMEDIFF(NOW(), r.trx_wait_started) AS wait_age, TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) AS wait_age_secs, rl.lock_table AS locked_table, rl.lock_index AS locked_index, rl.lock_type AS locked_type, r.trx_id AS waiting_trx_id, r.trx_started as waiting_trx_started, TIMEDIFF(NOW(), r.trx_started) AS waiting_trx_age, r.trx_rows_locked AS waiting_trx_rows_locked, r.trx_rows_modified AS waiting_trx_rows_modified, r.trx_mysql_thread_id AS waiting_pid, sys.format_statement(r.trx_query) AS waiting_query, rl.lock_id AS waiting_lock_id, rl.lock_mode AS waiting_lock_mode, b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_pid, sys.format_statement(b.trx_query) AS blocking_query, bl.lock_id AS blocking_lock_id, bl.lock_mode AS blocking_lock_mode, b.trx_started AS blocking_trx_started, TIMEDIFF(NOW(), b.trx_started) AS blocking_trx_age, b.trx_rows_locked AS blocking_trx_rows_locked, b.trx_rows_modified AS blocking_trx_rows_modified, CONCAT('KILL QUERY ', b.trx_mysql_thread_id) AS sql_kill_blocking_query, CONCAT('KILL ', b.trx_mysql_thread_id) AS sql_kill_blocking_connection FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id INNER JOIN information_schema.innodb_locks bl ON bl.lock_id = w.blocking_lock_id INNER JOIN information_schema.innodb_locks rl ON rl.lock_id = w.requested_lock_id ORDER BY r.trx_wait_started; END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$innodb_lock_waits ( wait_started, wait_age, wait_age_secs, locked_table, locked_index, locked_type, waiting_trx_id, waiting_trx_started, waiting_trx_age, waiting_trx_rows_locked, waiting_trx_rows_modified, waiting_pid, waiting_query, waiting_lock_id, waiting_lock_mode, blocking_trx_id, blocking_pid, blocking_query, blocking_lock_id, blocking_lock_mode, blocking_trx_started, blocking_trx_age, blocking_trx_rows_locked, blocking_trx_rows_modified, sql_kill_blocking_query, sql_kill_blocking_connection ) AS SELECT r.trx_wait_started AS wait_started, TIMEDIFF(NOW(), r.trx_wait_started) AS wait_age, TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) AS wait_age_secs, rl.lock_table AS locked_table, rl.lock_index AS locked_index, rl.lock_type AS locked_type, r.trx_id AS waiting_trx_id, r.trx_started as waiting_trx_started, TIMEDIFF(NOW(), r.trx_started) AS waiting_trx_age, r.trx_rows_locked AS waiting_trx_rows_locked, r.trx_rows_modified AS waiting_trx_rows_modified, r.trx_mysql_thread_id AS waiting_pid, r.trx_query AS waiting_query, rl.lock_id AS waiting_lock_id, rl.lock_mode AS waiting_lock_mode, b.trx_id AS blocking_trx_id, b.trx_mysql_thread_id AS blocking_pid, b.trx_query AS blocking_query, bl.lock_id AS blocking_lock_id, bl.lock_mode AS blocking_lock_mode, b.trx_started AS blocking_trx_started, TIMEDIFF(NOW(), b.trx_started) AS blocking_trx_age, b.trx_rows_locked AS blocking_trx_rows_locked, b.trx_rows_modified AS blocking_trx_rows_modified, CONCAT('KILL QUERY ', b.trx_mysql_thread_id) AS sql_kill_blocking_query, CONCAT('KILL ', b.trx_mysql_thread_id) AS sql_kill_blocking_connection FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id INNER JOIN information_schema.innodb_locks bl ON bl.lock_id = w.blocking_lock_id INNER JOIN information_schema.innodb_locks rl ON rl.lock_id = w.requested_lock_id ORDER BY r.trx_wait_started; END$$ CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_object_overview ( db, object_type, count ) AS SELECT ROUTINE_SCHEMA AS db, ROUTINE_TYPE AS object_type, COUNT(*) AS count FROM information_schema.routines GROUP BY ROUTINE_SCHEMA, ROUTINE_TYPE UNION SELECT TABLE_SCHEMA, TABLE_TYPE, COUNT(*) FROM information_schema.tables GROUP BY TABLE_SCHEMA, TABLE_TYPE UNION SELECT TABLE_SCHEMA, CONCAT('INDEX (', INDEX_TYPE, ')'), COUNT(*) FROM information_schema.statistics GROUP BY TABLE_SCHEMA, INDEX_TYPE UNION SELECT TRIGGER_SCHEMA, 'TRIGGER', COUNT(*) FROM information_schema.triggers GROUP BY TRIGGER_SCHEMA UNION SELECT EVENT_SCHEMA, 'EVENT', COUNT(*) FROM information_schema.events GROUP BY EVENT_SCHEMA ORDER BY DB, OBJECT_TYPE; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_auto_increment_columns ( table_schema, table_name, column_name, data_type, column_type, is_signed, is_unsigned, max_value, auto_increment, auto_increment_ratio ) AS SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, (LOCATE('unsigned', COLUMN_TYPE) = 0) AS is_signed, (LOCATE('unsigned', COLUMN_TYPE) > 0) AS is_unsigned, ( CASE DATA_TYPE WHEN 'tinyint' THEN 255 WHEN 'smallint' THEN 65535 WHEN 'mediumint' THEN 16777215 WHEN 'int' THEN 4294967295 WHEN 'bigint' THEN 18446744073709551615 END >> IF(LOCATE('unsigned', COLUMN_TYPE) > 0, 0, 1) ) AS max_value, AUTO_INCREMENT, AUTO_INCREMENT / ( CASE DATA_TYPE WHEN 'tinyint' THEN 255 WHEN 'smallint' THEN 65535 WHEN 'mediumint' THEN 16777215 WHEN 'int' THEN 4294967295 WHEN 'bigint' THEN 18446744073709551615 END >> IF(LOCATE('unsigned', COLUMN_TYPE) > 0, 0, 1) ) AS auto_increment_ratio FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN INFORMATION_SCHEMA.TABLES USING (TABLE_SCHEMA, TABLE_NAME) WHERE TABLE_SCHEMA NOT IN ('mysql', 'sys', 'INFORMATION_SCHEMA', 'performance_schema') AND TABLE_TYPE='BASE TABLE' AND EXTRA='auto_increment' ORDER BY auto_increment_ratio DESC, max_value; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$schema_flattened_keys ( table_schema, table_name, index_name, non_unique, subpart_exists, index_columns ) AS SELECT TABLE_SCHEMA, TABLE_NAME, INDEX_NAME, MAX(NON_UNIQUE) AS non_unique, MAX(IF(SUB_PART IS NULL, 0, 1)) AS subpart_exists, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS index_columns FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_TYPE='BTREE' AND TABLE_SCHEMA NOT IN ('mysql', 'sys', 'INFORMATION_SCHEMA', 'PERFORMANCE_SCHEMA') GROUP BY TABLE_SCHEMA, TABLE_NAME, INDEX_NAME; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_redundant_indexes ( table_schema, table_name, redundant_index_name, redundant_index_columns, redundant_index_non_unique, dominant_index_name, dominant_index_columns, dominant_index_non_unique, subpart_exists, sql_drop_index ) AS SELECT redundant_keys.table_schema, redundant_keys.table_name, redundant_keys.index_name AS redundant_index_name, redundant_keys.index_columns AS redundant_index_columns, redundant_keys.non_unique AS redundant_index_non_unique, dominant_keys.index_name AS dominant_index_name, dominant_keys.index_columns AS dominant_index_columns, dominant_keys.non_unique AS dominant_index_non_unique, IF(redundant_keys.subpart_exists OR dominant_keys.subpart_exists, 1 ,0) AS subpart_exists, CONCAT( 'ALTER TABLE `', redundant_keys.table_schema, '`.`', redundant_keys.table_name, '` DROP INDEX `', redundant_keys.index_name, '`' ) AS sql_drop_index FROM x$schema_flattened_keys AS redundant_keys INNER JOIN x$schema_flattened_keys AS dominant_keys USING (TABLE_SCHEMA, TABLE_NAME) WHERE redundant_keys.index_name != dominant_keys.index_name AND ( ( /* Identical columns */ (redundant_keys.index_columns = dominant_keys.index_columns) AND ( (redundant_keys.non_unique > dominant_keys.non_unique) OR (redundant_keys.non_unique = dominant_keys.non_unique AND IF(redundant_keys.index_name='PRIMARY', '', redundant_keys.index_name) > IF(dominant_keys.index_name='PRIMARY', '', dominant_keys.index_name) ) ) ) OR ( /* Non-unique prefix columns */ LOCATE(CONCAT(redundant_keys.index_columns, ','), dominant_keys.index_columns) = 1 AND redundant_keys.non_unique = 1 ) OR ( /* Unique prefix columns */ LOCATE(CONCAT(dominant_keys.index_columns, ','), redundant_keys.index_columns) = 1 AND dominant_keys.non_unique = 0 ) ); CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW privileges_by_table_by_level ( TABLE_SCHEMA, TABLE_NAME, GRANTEE, PRIVILEGE, LEVEL ) AS SELECT t.TABLE_SCHEMA, t.TABLE_NAME, privs.GRANTEE, privs.PRIVILEGE_TYPE, privs.LEVEL FROM INFORMATION_SCHEMA.TABLES AS t JOIN ( SELECT NULL AS TABLE_SCHEMA, NULL AS TABLE_NAME, GRANTEE, PRIVILEGE_TYPE, 'GLOBAL' LEVEL FROM INFORMATION_SCHEMA.USER_PRIVILEGES UNION SELECT TABLE_SCHEMA, NULL AS TABLE_NAME, GRANTEE, PRIVILEGE_TYPE, 'SCHEMA' LEVEL FROM INFORMATION_SCHEMA.SCHEMA_PRIVILEGES UNION SELECT TABLE_SCHEMA, TABLE_NAME, GRANTEE, PRIVILEGE_TYPE, 'TABLE' LEVEL FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES ) privs ON (t.TABLE_SCHEMA = privs.TABLE_SCHEMA OR privs.TABLE_SCHEMA IS NULL) AND (t.TABLE_NAME = privs.TABLE_NAME OR privs.TABLE_NAME IS NULL) AND privs.PRIVILEGE_TYPE IN ('SELECT', 'INSERT', 'UPDATE', 'DELETE', 'CREATE', 'ALTER', 'DROP', 'INDEX', 'REFERENCES', 'TRIGGER', 'GRANT OPTION', 'SHOW VIEW', 'DELETE HISTORY') WHERE t.TABLE_SCHEMA NOT IN ('sys', 'mysql','information_schema', 'performance_schema'); CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW ps_check_lost_instrumentation ( variable_name, variable_value ) AS SELECT variable_name, variable_value FROM performance_schema.global_status WHERE variable_name LIKE 'perf%lost' AND variable_value > 0; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW latest_file_io ( thread, file, latency, operation, requested ) AS SELECT IF(id IS NULL, CONCAT(SUBSTRING_INDEX(name, '/', -1), ':', thread_id), CONCAT(user, '@', host, ':', id) ) thread, sys.format_path(object_name) file, format_pico_time(timer_wait) AS latency, operation, sys.format_bytes(number_of_bytes) AS requested FROM performance_schema.events_waits_history_long JOIN performance_schema.threads USING (thread_id) LEFT JOIN information_schema.processlist ON processlist_id = id WHERE object_name IS NOT NULL AND event_name LIKE 'wait/io/file/%' ORDER BY timer_start; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$latest_file_io ( thread, file, latency, operation, requested ) AS SELECT IF(id IS NULL, CONCAT(SUBSTRING_INDEX(name, '/', -1), ':', thread_id), CONCAT(user, '@', host, ':', id) ) thread, object_name file, timer_wait AS latency, operation, number_of_bytes AS requested FROM performance_schema.events_waits_history_long JOIN performance_schema.threads USING (thread_id) LEFT JOIN information_schema.processlist ON processlist_id = id WHERE object_name IS NOT NULL AND event_name LIKE 'wait/io/file/%' ORDER BY timer_start; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW io_by_thread_by_latency ( user, total, total_latency, min_latency, avg_latency, max_latency, thread_id, processlist_id ) AS SELECT IF(processlist_id IS NULL, SUBSTRING_INDEX(name, '/', -1), CONCAT(processlist_user, '@', processlist_host) ) user, SUM(count_star) total, format_pico_time(SUM(sum_timer_wait)) total_latency, format_pico_time(MIN(min_timer_wait)) min_latency, format_pico_time(AVG(avg_timer_wait)) avg_latency, format_pico_time(MAX(max_timer_wait)) max_latency, thread_id, processlist_id FROM performance_schema.events_waits_summary_by_thread_by_event_name LEFT JOIN performance_schema.threads USING (thread_id) WHERE event_name LIKE 'wait/io/file/%' AND sum_timer_wait > 0 GROUP BY thread_id, processlist_id, user ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$io_by_thread_by_latency ( user, total, total_latency, min_latency, avg_latency, max_latency, thread_id, processlist_id ) AS SELECT IF(processlist_id IS NULL, SUBSTRING_INDEX(name, '/', -1), CONCAT(processlist_user, '@', processlist_host) ) user, SUM(count_star) total, SUM(sum_timer_wait) total_latency, MIN(min_timer_wait) min_latency, AVG(avg_timer_wait) avg_latency, MAX(max_timer_wait) max_latency, thread_id, processlist_id FROM performance_schema.events_waits_summary_by_thread_by_event_name LEFT JOIN performance_schema.threads USING (thread_id) WHERE event_name LIKE 'wait/io/file/%' AND sum_timer_wait > 0 GROUP BY thread_id, processlist_id, user ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW io_global_by_file_by_bytes ( file, count_read, total_read, avg_read, count_write, total_written, avg_write, total, write_pct ) AS SELECT sys.format_path(file_name) AS file, count_read, sys.format_bytes(sum_number_of_bytes_read) AS total_read, sys.format_bytes(IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0)) AS avg_read, count_write, sys.format_bytes(sum_number_of_bytes_write) AS total_written, sys.format_bytes(IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0.00)) AS avg_write, sys.format_bytes(sum_number_of_bytes_read + sum_number_of_bytes_write) AS total, IFNULL(ROUND(100-((sum_number_of_bytes_read/ NULLIF((sum_number_of_bytes_read+sum_number_of_bytes_write), 0))*100), 2), 0.00) AS write_pct FROM performance_schema.file_summary_by_instance ORDER BY sum_number_of_bytes_read + sum_number_of_bytes_write DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$io_global_by_file_by_bytes ( file, count_read, total_read, avg_read, count_write, total_written, avg_write, total, write_pct ) AS SELECT file_name AS file, count_read, sum_number_of_bytes_read AS total_read, IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0) AS avg_read, count_write, sum_number_of_bytes_write AS total_written, IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0.00) AS avg_write, sum_number_of_bytes_read + sum_number_of_bytes_write AS total, IFNULL(ROUND(100-((sum_number_of_bytes_read/ NULLIF((sum_number_of_bytes_read+sum_number_of_bytes_write), 0))*100), 2), 0.00) AS write_pct FROM performance_schema.file_summary_by_instance ORDER BY sum_number_of_bytes_read + sum_number_of_bytes_write DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW io_global_by_file_by_latency ( file, total, total_latency, count_read, read_latency, count_write, write_latency, count_misc, misc_latency ) AS SELECT sys.format_path(file_name) AS file, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, count_read, format_pico_time(sum_timer_read) AS read_latency, count_write, format_pico_time(sum_timer_write) AS write_latency, count_misc, format_pico_time(sum_timer_misc) AS misc_latency FROM performance_schema.file_summary_by_instance ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$io_global_by_file_by_latency ( file, total, total_latency, count_read, read_latency, count_write, write_latency, count_misc, misc_latency ) AS SELECT file_name AS file, count_star AS total, sum_timer_wait AS total_latency, count_read, sum_timer_read AS read_latency, count_write, sum_timer_write AS write_latency, count_misc, sum_timer_misc AS misc_latency FROM performance_schema.file_summary_by_instance ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW io_global_by_wait_by_bytes ( event_name, total, total_latency, min_latency, avg_latency, max_latency, count_read, total_read, avg_read, count_write, total_written, avg_written, total_requested ) AS SELECT SUBSTRING_INDEX(event_name, '/', -2) event_name, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(min_timer_wait) AS min_latency, format_pico_time(avg_timer_wait) AS avg_latency, format_pico_time(max_timer_wait) AS max_latency, count_read, sys.format_bytes(sum_number_of_bytes_read) AS total_read, sys.format_bytes(IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0)) AS avg_read, count_write, sys.format_bytes(sum_number_of_bytes_write) AS total_written, sys.format_bytes(IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0)) AS avg_written, sys.format_bytes(sum_number_of_bytes_write + sum_number_of_bytes_read) AS total_requested FROM performance_schema.file_summary_by_event_name WHERE event_name LIKE 'wait/io/file/%' AND count_star > 0 ORDER BY sum_number_of_bytes_write + sum_number_of_bytes_read DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$io_global_by_wait_by_bytes ( event_name, total, total_latency, min_latency, avg_latency, max_latency, count_read, total_read, avg_read, count_write, total_written, avg_written, total_requested ) AS SELECT SUBSTRING_INDEX(event_name, '/', -2) AS event_name, count_star AS total, sum_timer_wait AS total_latency, min_timer_wait AS min_latency, avg_timer_wait AS avg_latency, max_timer_wait AS max_latency, count_read, sum_number_of_bytes_read AS total_read, IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0) AS avg_read, count_write, sum_number_of_bytes_write AS total_written, IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0) AS avg_written, sum_number_of_bytes_write + sum_number_of_bytes_read AS total_requested FROM performance_schema.file_summary_by_event_name WHERE event_name LIKE 'wait/io/file/%' AND count_star > 0 ORDER BY sum_number_of_bytes_write + sum_number_of_bytes_read DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW io_global_by_wait_by_latency ( event_name, total, total_latency, avg_latency, max_latency, read_latency, write_latency, misc_latency, count_read, total_read, avg_read, count_write, total_written, avg_written ) AS SELECT SUBSTRING_INDEX(event_name, '/', -2) AS event_name, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(avg_timer_wait) AS avg_latency, format_pico_time(max_timer_wait) AS max_latency, format_pico_time(sum_timer_read) AS read_latency, format_pico_time(sum_timer_write) AS write_latency, format_pico_time(sum_timer_misc) AS misc_latency, count_read, sys.format_bytes(sum_number_of_bytes_read) AS total_read, sys.format_bytes(IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0)) AS avg_read, count_write, sys.format_bytes(sum_number_of_bytes_write) AS total_written, sys.format_bytes(IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0)) AS avg_written FROM performance_schema.file_summary_by_event_name WHERE event_name LIKE 'wait/io/file/%' AND count_star > 0 ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$io_global_by_wait_by_latency ( event_name, total, total_latency, avg_latency, max_latency, read_latency, write_latency, misc_latency, count_read, total_read, avg_read, count_write, total_written, avg_written ) AS SELECT SUBSTRING_INDEX(event_name, '/', -2) AS event_name, count_star AS total, sum_timer_wait AS total_latency, avg_timer_wait AS avg_latency, max_timer_wait AS max_latency, sum_timer_read AS read_latency, sum_timer_write AS write_latency, sum_timer_misc AS misc_latency, count_read, sum_number_of_bytes_read AS total_read, IFNULL(sum_number_of_bytes_read / NULLIF(count_read, 0), 0) AS avg_read, count_write, sum_number_of_bytes_write AS total_written, IFNULL(sum_number_of_bytes_write / NULLIF(count_write, 0), 0) AS avg_written FROM performance_schema.file_summary_by_event_name WHERE event_name LIKE 'wait/io/file/%' AND count_star > 0 ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW memory_by_user_by_current_bytes ( user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUM(current_count_used) AS current_count_used, sys.format_bytes(SUM(current_number_of_bytes_used)) AS current_allocated, sys.format_bytes(IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0)) AS current_avg_alloc, sys.format_bytes(MAX(current_number_of_bytes_used)) AS current_max_alloc, sys.format_bytes(SUM(sum_number_of_bytes_alloc)) AS total_allocated FROM performance_schema.memory_summary_by_user_by_event_name GROUP BY IF(user IS NULL, 'background', user) ORDER BY SUM(current_number_of_bytes_used) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$memory_by_user_by_current_bytes ( user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUM(current_count_used) AS current_count_used, SUM(current_number_of_bytes_used) AS current_allocated, IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0) AS current_avg_alloc, MAX(current_number_of_bytes_used) AS current_max_alloc, SUM(sum_number_of_bytes_alloc) AS total_allocated FROM performance_schema.memory_summary_by_user_by_event_name GROUP BY IF(user IS NULL, 'background', user) ORDER BY SUM(current_number_of_bytes_used) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW memory_by_host_by_current_bytes ( host, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUM(current_count_used) AS current_count_used, sys.format_bytes(SUM(current_number_of_bytes_used)) AS current_allocated, sys.format_bytes(IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0)) AS current_avg_alloc, sys.format_bytes(MAX(current_number_of_bytes_used)) AS current_max_alloc, sys.format_bytes(SUM(sum_number_of_bytes_alloc)) AS total_allocated FROM performance_schema.memory_summary_by_host_by_event_name GROUP BY IF(host IS NULL, 'background', host) ORDER BY SUM(current_number_of_bytes_used) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$memory_by_host_by_current_bytes ( host, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUM(current_count_used) AS current_count_used, SUM(current_number_of_bytes_used) AS current_allocated, IFNULL(SUM(current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0) AS current_avg_alloc, MAX(current_number_of_bytes_used) AS current_max_alloc, SUM(sum_number_of_bytes_alloc) AS total_allocated FROM performance_schema.memory_summary_by_host_by_event_name GROUP BY IF(host IS NULL, 'background', host) ORDER BY SUM(current_number_of_bytes_used) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW memory_by_thread_by_current_bytes ( thread_id, user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated ) AS SELECT thread_id, IF(t.name = 'thread/sql/one_connection', CONCAT(t.processlist_user, '@', t.processlist_host), REPLACE(t.name, 'thread/', '')) user, SUM(mt.current_count_used) AS current_count_used, sys.format_bytes(SUM(mt.current_number_of_bytes_used)) AS current_allocated, sys.format_bytes(IFNULL(SUM(mt.current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0)) AS current_avg_alloc, sys.format_bytes(MAX(mt.current_number_of_bytes_used)) AS current_max_alloc, sys.format_bytes(SUM(mt.sum_number_of_bytes_alloc)) AS total_allocated FROM performance_schema.memory_summary_by_thread_by_event_name AS mt JOIN performance_schema.threads AS t USING (thread_id) GROUP BY thread_id, IF(t.name = 'thread/sql/one_connection', CONCAT(t.processlist_user, '@', t.processlist_host), REPLACE(t.name, 'thread/', '')) ORDER BY SUM(current_number_of_bytes_used) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$memory_by_thread_by_current_bytes ( thread_id, user, current_count_used, current_allocated, current_avg_alloc, current_max_alloc, total_allocated ) AS SELECT t.thread_id, IF(t.name = 'thread/sql/one_connection', CONCAT(t.processlist_user, '@', t.processlist_host), REPLACE(t.name, 'thread/', '')) user, SUM(mt.current_count_used) AS current_count_used, SUM(mt.current_number_of_bytes_used) AS current_allocated, IFNULL(SUM(mt.current_number_of_bytes_used) / NULLIF(SUM(current_count_used), 0), 0) AS current_avg_alloc, MAX(mt.current_number_of_bytes_used) AS current_max_alloc, SUM(mt.sum_number_of_bytes_alloc) AS total_allocated FROM performance_schema.memory_summary_by_thread_by_event_name AS mt JOIN performance_schema.threads AS t USING (thread_id) GROUP BY thread_id, IF(t.name = 'thread/sql/one_connection', CONCAT(t.processlist_user, '@', t.processlist_host), REPLACE(t.name, 'thread/', '')) ORDER BY SUM(mt.current_number_of_bytes_used) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW memory_global_by_current_bytes ( event_name, current_count, current_alloc, current_avg_alloc, high_count, high_alloc, high_avg_alloc ) AS SELECT event_name, current_count_used AS current_count, sys.format_bytes(current_number_of_bytes_used) AS current_alloc, sys.format_bytes(IFNULL(current_number_of_bytes_used / NULLIF(current_count_used, 0), 0)) AS current_avg_alloc, high_count_used AS high_count, sys.format_bytes(high_number_of_bytes_used) AS high_alloc, sys.format_bytes(IFNULL(high_number_of_bytes_used / NULLIF(high_count_used, 0), 0)) AS high_avg_alloc FROM performance_schema.memory_summary_global_by_event_name WHERE current_number_of_bytes_used > 0 ORDER BY current_number_of_bytes_used DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$memory_global_by_current_bytes ( event_name, current_count, current_alloc, current_avg_alloc, high_count, high_alloc, high_avg_alloc ) AS SELECT event_name, current_count_used AS current_count, current_number_of_bytes_used AS current_alloc, IFNULL(current_number_of_bytes_used / NULLIF(current_count_used, 0), 0) AS current_avg_alloc, high_count_used AS high_count, high_number_of_bytes_used AS high_alloc, IFNULL(high_number_of_bytes_used / NULLIF(high_count_used, 0), 0) AS high_avg_alloc FROM performance_schema.memory_summary_global_by_event_name WHERE current_number_of_bytes_used > 0 ORDER BY current_number_of_bytes_used DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW memory_global_total ( total_allocated ) AS SELECT sys.format_bytes(SUM(CURRENT_NUMBER_OF_BYTES_USED)) total_allocated FROM performance_schema.memory_summary_global_by_event_name; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$memory_global_total ( total_allocated ) AS SELECT SUM(CURRENT_NUMBER_OF_BYTES_USED) total_allocated FROM performance_schema.memory_summary_global_by_event_name; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_index_statistics ( table_schema, table_name, index_name, rows_selected, select_latency, rows_inserted, insert_latency, rows_updated, update_latency, rows_deleted, delete_latency ) AS SELECT OBJECT_SCHEMA AS table_schema, OBJECT_NAME AS table_name, INDEX_NAME as index_name, COUNT_FETCH AS rows_selected, format_pico_time(SUM_TIMER_FETCH) AS select_latency, COUNT_INSERT AS rows_inserted, format_pico_time(SUM_TIMER_INSERT) AS insert_latency, COUNT_UPDATE AS rows_updated, format_pico_time(SUM_TIMER_UPDATE) AS update_latency, COUNT_DELETE AS rows_deleted, format_pico_time(SUM_TIMER_INSERT) AS delete_latency FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NOT NULL ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$schema_index_statistics ( table_schema, table_name, index_name, rows_selected, select_latency, rows_inserted, insert_latency, rows_updated, update_latency, rows_deleted, delete_latency ) AS SELECT OBJECT_SCHEMA AS table_schema, OBJECT_NAME AS table_name, INDEX_NAME as index_name, COUNT_FETCH AS rows_selected, SUM_TIMER_FETCH AS select_latency, COUNT_INSERT AS rows_inserted, SUM_TIMER_INSERT AS insert_latency, COUNT_UPDATE AS rows_updated, SUM_TIMER_UPDATE AS update_latency, COUNT_DELETE AS rows_deleted, SUM_TIMER_INSERT AS delete_latency FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NOT NULL ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$ps_schema_table_statistics_io ( table_schema, table_name, count_read, sum_number_of_bytes_read, sum_timer_read, count_write, sum_number_of_bytes_write, sum_timer_write, count_misc, sum_timer_misc ) AS SELECT extract_schema_from_file_name(file_name) AS table_schema, extract_table_from_file_name(file_name) AS table_name, SUM(count_read) AS count_read, SUM(sum_number_of_bytes_read) AS sum_number_of_bytes_read, SUM(sum_timer_read) AS sum_timer_read, SUM(count_write) AS count_write, SUM(sum_number_of_bytes_write) AS sum_number_of_bytes_write, SUM(sum_timer_write) AS sum_timer_write, SUM(count_misc) AS count_misc, SUM(sum_timer_misc) AS sum_timer_misc FROM performance_schema.file_summary_by_instance GROUP BY table_schema, table_name; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_table_statistics ( table_schema, table_name, total_latency, rows_fetched, fetch_latency, rows_inserted, insert_latency, rows_updated, update_latency, rows_deleted, delete_latency, io_read_requests, io_read, io_read_latency, io_write_requests, io_write, io_write_latency, io_misc_requests, io_misc_latency ) AS SELECT pst.object_schema AS table_schema, pst.object_name AS table_name, format_pico_time(pst.sum_timer_wait) AS total_latency, pst.count_fetch AS rows_fetched, format_pico_time(pst.sum_timer_fetch) AS fetch_latency, pst.count_insert AS rows_inserted, format_pico_time(pst.sum_timer_insert) AS insert_latency, pst.count_update AS rows_updated, format_pico_time(pst.sum_timer_update) AS update_latency, pst.count_delete AS rows_deleted, format_pico_time(pst.sum_timer_delete) AS delete_latency, fsbi.count_read AS io_read_requests, sys.format_bytes(fsbi.sum_number_of_bytes_read) AS io_read, format_pico_time(fsbi.sum_timer_read) AS io_read_latency, fsbi.count_write AS io_write_requests, sys.format_bytes(fsbi.sum_number_of_bytes_write) AS io_write, format_pico_time(fsbi.sum_timer_write) AS io_write_latency, fsbi.count_misc AS io_misc_requests, format_pico_time(fsbi.sum_timer_misc) AS io_misc_latency FROM performance_schema.table_io_waits_summary_by_table AS pst LEFT JOIN x$ps_schema_table_statistics_io AS fsbi ON pst.object_schema = fsbi.table_schema AND pst.object_name = fsbi.table_name ORDER BY pst.sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$schema_table_statistics ( table_schema, table_name, total_latency, rows_fetched, fetch_latency, rows_inserted, insert_latency, rows_updated, update_latency, rows_deleted, delete_latency, io_read_requests, io_read, io_read_latency, io_write_requests, io_write, io_write_latency, io_misc_requests, io_misc_latency ) AS SELECT pst.object_schema AS table_schema, pst.object_name AS table_name, pst.sum_timer_wait AS total_latency, pst.count_fetch AS rows_fetched, pst.sum_timer_fetch AS fetch_latency, pst.count_insert AS rows_inserted, pst.sum_timer_insert AS insert_latency, pst.count_update AS rows_updated, pst.sum_timer_update AS update_latency, pst.count_delete AS rows_deleted, pst.sum_timer_delete AS delete_latency, fsbi.count_read AS io_read_requests, fsbi.sum_number_of_bytes_read AS io_read, fsbi.sum_timer_read AS io_read_latency, fsbi.count_write AS io_write_requests, fsbi.sum_number_of_bytes_write AS io_write, fsbi.sum_timer_write AS io_write_latency, fsbi.count_misc AS io_misc_requests, fsbi.sum_timer_misc AS io_misc_latency FROM performance_schema.table_io_waits_summary_by_table AS pst LEFT JOIN x$ps_schema_table_statistics_io AS fsbi ON pst.object_schema = fsbi.table_schema AND pst.object_name = fsbi.table_name ORDER BY pst.sum_timer_wait DESC; BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_table_statistics_with_buffer ( table_schema, table_name, rows_fetched, fetch_latency, rows_inserted, insert_latency, rows_updated, update_latency, rows_deleted, delete_latency, io_read_requests, io_read, io_read_latency, io_write_requests, io_write, io_write_latency, io_misc_requests, io_misc_latency, innodb_buffer_allocated, innodb_buffer_data, innodb_buffer_free, innodb_buffer_pages, innodb_buffer_pages_hashed, innodb_buffer_pages_old, innodb_buffer_rows_cached ) AS SELECT pst.object_schema AS table_schema, pst.object_name AS table_name, pst.count_fetch AS rows_fetched, format_pico_time(pst.sum_timer_fetch) AS fetch_latency, pst.count_insert AS rows_inserted, format_pico_time(pst.sum_timer_insert) AS insert_latency, pst.count_update AS rows_updated, format_pico_time(pst.sum_timer_update) AS update_latency, pst.count_delete AS rows_deleted, format_pico_time(pst.sum_timer_delete) AS delete_latency, fsbi.count_read AS io_read_requests, sys.format_bytes(fsbi.sum_number_of_bytes_read) AS io_read, format_pico_time(fsbi.sum_timer_read) AS io_read_latency, fsbi.count_write AS io_write_requests, sys.format_bytes(fsbi.sum_number_of_bytes_write) AS io_write, format_pico_time(fsbi.sum_timer_write) AS io_write_latency, fsbi.count_misc AS io_misc_requests, format_pico_time(fsbi.sum_timer_misc) AS io_misc_latency, sys.format_bytes(ibp.allocated) AS innodb_buffer_allocated, sys.format_bytes(ibp.data) AS innodb_buffer_data, sys.format_bytes(ibp.allocated - ibp.data) AS innodb_buffer_free, ibp.pages AS innodb_buffer_pages, ibp.pages_hashed AS innodb_buffer_pages_hashed, ibp.pages_old AS innodb_buffer_pages_old, ibp.rows_cached AS innodb_buffer_rows_cached FROM performance_schema.table_io_waits_summary_by_table AS pst LEFT JOIN x$ps_schema_table_statistics_io AS fsbi ON pst.object_schema = fsbi.table_schema AND pst.object_name = fsbi.table_name LEFT JOIN sys.x$innodb_buffer_stats_by_table AS ibp ON pst.object_schema = ibp.object_schema AND pst.object_name = ibp.object_name ORDER BY pst.sum_timer_wait DESC; END$$ BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$schema_table_statistics_with_buffer ( table_schema, table_name, rows_fetched, fetch_latency, rows_inserted, insert_latency, rows_updated, update_latency, rows_deleted, delete_latency, io_read_requests, io_read, io_read_latency, io_write_requests, io_write, io_write_latency, io_misc_requests, io_misc_latency, innodb_buffer_allocated, innodb_buffer_data, innodb_buffer_free, innodb_buffer_pages, innodb_buffer_pages_hashed, innodb_buffer_pages_old, innodb_buffer_rows_cached ) AS SELECT pst.object_schema AS table_schema, pst.object_name AS table_name, pst.count_fetch AS rows_fetched, pst.sum_timer_fetch AS fetch_latency, pst.count_insert AS rows_inserted, pst.sum_timer_insert AS insert_latency, pst.count_update AS rows_updated, pst.sum_timer_update AS update_latency, pst.count_delete AS rows_deleted, pst.sum_timer_delete AS delete_latency, fsbi.count_read AS io_read_requests, fsbi.sum_number_of_bytes_read AS io_read, fsbi.sum_timer_read AS io_read_latency, fsbi.count_write AS io_write_requests, fsbi.sum_number_of_bytes_write AS io_write, fsbi.sum_timer_write AS io_write_latency, fsbi.count_misc AS io_misc_requests, fsbi.sum_timer_misc AS io_misc_latency, ibp.allocated AS innodb_buffer_allocated, ibp.data AS innodb_buffer_data, (ibp.allocated - ibp.data) AS innodb_buffer_free, ibp.pages AS innodb_buffer_pages, ibp.pages_hashed AS innodb_buffer_pages_hashed, ibp.pages_old AS innodb_buffer_pages_old, ibp.rows_cached AS innodb_buffer_rows_cached FROM performance_schema.table_io_waits_summary_by_table AS pst LEFT JOIN x$ps_schema_table_statistics_io AS fsbi ON pst.object_schema = fsbi.table_schema AND pst.object_name = fsbi.table_name LEFT JOIN sys.x$innodb_buffer_stats_by_table AS ibp ON pst.object_schema = ibp.object_schema AND pst.object_name = ibp.object_name ORDER BY pst.sum_timer_wait DESC; END$$ CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_tables_with_full_table_scans ( object_schema, object_name, rows_full_scanned, latency ) AS SELECT object_schema, object_name, count_read AS rows_full_scanned, format_pico_time(sum_timer_wait) AS latency FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NULL AND count_read > 0 ORDER BY count_read DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$schema_tables_with_full_table_scans ( object_schema, object_name, rows_full_scanned, latency ) AS SELECT object_schema, object_name, count_read AS rows_full_scanned, sum_timer_wait AS latency FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NULL AND count_read > 0 ORDER BY count_read DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_unused_indexes ( object_schema, object_name, index_name ) AS SELECT object_schema, object_name, index_name FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NOT NULL AND count_star = 0 AND object_schema != 'mysql' AND index_name != 'PRIMARY' ORDER BY object_schema, object_name; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW schema_table_lock_waits ( object_schema, object_name, waiting_thread_id, waiting_pid, waiting_account, waiting_lock_type, waiting_lock_duration, waiting_query, waiting_query_secs, waiting_query_rows_affected, waiting_query_rows_examined, blocking_thread_id, blocking_pid, blocking_account, blocking_lock_type, blocking_lock_duration, sql_kill_blocking_query, sql_kill_blocking_connection ) AS SELECT g.object_schema AS object_schema, g.object_name AS object_name, pt.thread_id AS waiting_thread_id, pt.processlist_id AS waiting_pid, sys.ps_thread_account(p.owner_thread_id) AS waiting_account, p.lock_type AS waiting_lock_type, p.lock_duration AS waiting_lock_duration, sys.format_statement(pt.processlist_info) AS waiting_query, pt.processlist_time AS waiting_query_secs, ps.rows_affected AS waiting_query_rows_affected, ps.rows_examined AS waiting_query_rows_examined, gt.thread_id AS blocking_thread_id, gt.processlist_id AS blocking_pid, sys.ps_thread_account(g.owner_thread_id) AS blocking_account, g.lock_type AS blocking_lock_type, g.lock_duration AS blocking_lock_duration, CONCAT('KILL QUERY ', gt.processlist_id) AS sql_kill_blocking_query, CONCAT('KILL ', gt.processlist_id) AS sql_kill_blocking_connection FROM performance_schema.metadata_locks g INNER JOIN performance_schema.metadata_locks p ON g.object_type = p.object_type AND g.object_schema = p.object_schema AND g.object_name = p.object_name AND g.lock_status = 'GRANTED' AND p.lock_status = 'PENDING' INNER JOIN performance_schema.threads gt ON g.owner_thread_id = gt.thread_id INNER JOIN performance_schema.threads pt ON p.owner_thread_id = pt.thread_id LEFT JOIN performance_schema.events_statements_current gs ON g.owner_thread_id = gs.thread_id LEFT JOIN performance_schema.events_statements_current ps ON p.owner_thread_id = ps.thread_id WHERE g.object_type = 'TABLE'; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$schema_table_lock_waits ( object_schema, object_name, waiting_thread_id, waiting_pid, waiting_account, waiting_lock_type, waiting_lock_duration, waiting_query, waiting_query_secs, waiting_query_rows_affected, waiting_query_rows_examined, blocking_thread_id, blocking_pid, blocking_account, blocking_lock_type, blocking_lock_duration, sql_kill_blocking_query, sql_kill_blocking_connection ) AS SELECT g.object_schema AS object_schema, g.object_name AS object_name, pt.thread_id AS waiting_thread_id, pt.processlist_id AS waiting_pid, sys.ps_thread_account(p.owner_thread_id) AS waiting_account, p.lock_type AS waiting_lock_type, p.lock_duration AS waiting_lock_duration, pt.processlist_info AS waiting_query, pt.processlist_time AS waiting_query_secs, ps.rows_affected AS waiting_query_rows_affected, ps.rows_examined AS waiting_query_rows_examined, gt.thread_id AS blocking_thread_id, gt.processlist_id AS blocking_pid, sys.ps_thread_account(g.owner_thread_id) AS blocking_account, g.lock_type AS blocking_lock_type, g.lock_duration AS blocking_lock_duration, CONCAT('KILL QUERY ', gt.processlist_id) AS sql_kill_blocking_query, CONCAT('KILL ', gt.processlist_id) AS sql_kill_blocking_connection FROM performance_schema.metadata_locks g INNER JOIN performance_schema.metadata_locks p ON g.object_type = p.object_type AND g.object_schema = p.object_schema AND g.object_name = p.object_name AND g.lock_status = 'GRANTED' AND p.lock_status = 'PENDING' INNER JOIN performance_schema.threads gt ON g.owner_thread_id = gt.thread_id INNER JOIN performance_schema.threads pt ON p.owner_thread_id = pt.thread_id LEFT JOIN performance_schema.events_statements_current gs ON g.owner_thread_id = gs.thread_id LEFT JOIN performance_schema.events_statements_current ps ON p.owner_thread_id = ps.thread_id WHERE g.object_type = 'TABLE'; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW statement_analysis ( query, db, full_scan, exec_count, err_count, warn_count, total_latency, max_latency, avg_latency, lock_latency, rows_sent, rows_sent_avg, rows_examined, rows_examined_avg, rows_affected, rows_affected_avg, tmp_tables, tmp_disk_tables, rows_sorted, sort_merge_passes, digest, first_seen, last_seen ) AS SELECT sys.format_statement(DIGEST_TEXT) AS query, SCHEMA_NAME AS db, IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan, COUNT_STAR AS exec_count, SUM_ERRORS AS err_count, SUM_WARNINGS AS warn_count, format_pico_time(SUM_TIMER_WAIT) AS total_latency, format_pico_time(MAX_TIMER_WAIT) AS max_latency, format_pico_time(AVG_TIMER_WAIT) AS avg_latency, format_pico_time(SUM_LOCK_TIME) AS lock_latency, SUM_ROWS_SENT AS rows_sent, ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg, SUM_ROWS_EXAMINED AS rows_examined, ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg, SUM_ROWS_AFFECTED AS rows_affected, ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg, SUM_CREATED_TMP_TABLES AS tmp_tables, SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables, SUM_SORT_ROWS AS rows_sorted, SUM_SORT_MERGE_PASSES AS sort_merge_passes, DIGEST AS digest, FIRST_SEEN AS first_seen, LAST_SEEN as last_seen FROM performance_schema.events_statements_summary_by_digest ORDER BY SUM_TIMER_WAIT DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$statement_analysis ( query, db, full_scan, exec_count, err_count, warn_count, total_latency, max_latency, avg_latency, lock_latency, rows_sent, rows_sent_avg, rows_examined, rows_examined_avg, rows_affected, rows_affected_avg, tmp_tables, tmp_disk_tables, rows_sorted, sort_merge_passes, digest, first_seen, last_seen ) AS SELECT DIGEST_TEXT AS query, SCHEMA_NAME AS db, IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan, COUNT_STAR AS exec_count, SUM_ERRORS AS err_count, SUM_WARNINGS AS warn_count, SUM_TIMER_WAIT AS total_latency, MAX_TIMER_WAIT AS max_latency, AVG_TIMER_WAIT AS avg_latency, SUM_LOCK_TIME AS lock_latency, SUM_ROWS_SENT AS rows_sent, ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg, SUM_ROWS_EXAMINED AS rows_examined, ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg, SUM_ROWS_AFFECTED AS rows_affected, ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg, SUM_CREATED_TMP_TABLES AS tmp_tables, SUM_CREATED_TMP_DISK_TABLES AS tmp_disk_tables, SUM_SORT_ROWS AS rows_sorted, SUM_SORT_MERGE_PASSES AS sort_merge_passes, DIGEST AS digest, FIRST_SEEN AS first_seen, LAST_SEEN as last_seen FROM performance_schema.events_statements_summary_by_digest ORDER BY SUM_TIMER_WAIT DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW statements_with_errors_or_warnings ( query, db, exec_count, errors, error_pct, warnings, warning_pct, first_seen, last_seen, digest ) AS SELECT sys.format_statement(DIGEST_TEXT) AS query, SCHEMA_NAME as db, COUNT_STAR AS exec_count, SUM_ERRORS AS errors, IFNULL(SUM_ERRORS / NULLIF(COUNT_STAR, 0), 0) * 100 as error_pct, SUM_WARNINGS AS warnings, IFNULL(SUM_WARNINGS / NULLIF(COUNT_STAR, 0), 0) * 100 as warning_pct, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE SUM_ERRORS > 0 OR SUM_WARNINGS > 0 ORDER BY SUM_ERRORS DESC, SUM_WARNINGS DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$statements_with_errors_or_warnings ( query, db, exec_count, errors, error_pct, warnings, warning_pct, first_seen, last_seen, digest ) AS SELECT DIGEST_TEXT AS query, SCHEMA_NAME as db, COUNT_STAR AS exec_count, SUM_ERRORS AS errors, IFNULL(SUM_ERRORS / NULLIF(COUNT_STAR, 0), 0) * 100 as error_pct, SUM_WARNINGS AS warnings, IFNULL(SUM_WARNINGS / NULLIF(COUNT_STAR, 0), 0) * 100 as warning_pct, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE SUM_ERRORS > 0 OR SUM_WARNINGS > 0 ORDER BY SUM_ERRORS DESC, SUM_WARNINGS DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW statements_with_full_table_scans ( query, db, exec_count, total_latency, no_index_used_count, no_good_index_used_count, no_index_used_pct, rows_sent, rows_examined, rows_sent_avg, rows_examined_avg, first_seen, last_seen, digest ) AS SELECT sys.format_statement(DIGEST_TEXT) AS query, SCHEMA_NAME as db, COUNT_STAR AS exec_count, format_pico_time(SUM_TIMER_WAIT) AS total_latency, SUM_NO_INDEX_USED AS no_index_used_count, SUM_NO_GOOD_INDEX_USED AS no_good_index_used_count, ROUND(IFNULL(SUM_NO_INDEX_USED / NULLIF(COUNT_STAR, 0), 0) * 100) AS no_index_used_pct, SUM_ROWS_SENT AS rows_sent, SUM_ROWS_EXAMINED AS rows_examined, ROUND(SUM_ROWS_SENT/COUNT_STAR) AS rows_sent_avg, ROUND(SUM_ROWS_EXAMINED/COUNT_STAR) AS rows_examined_avg, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE (SUM_NO_INDEX_USED > 0 OR SUM_NO_GOOD_INDEX_USED > 0) AND DIGEST_TEXT NOT LIKE 'SHOW%' ORDER BY no_index_used_pct DESC, total_latency DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$statements_with_full_table_scans ( query, db, exec_count, total_latency, no_index_used_count, no_good_index_used_count, no_index_used_pct, rows_sent, rows_examined, rows_sent_avg, rows_examined_avg, first_seen, last_seen, digest ) AS SELECT DIGEST_TEXT AS query, SCHEMA_NAME as db, COUNT_STAR AS exec_count, SUM_TIMER_WAIT AS total_latency, SUM_NO_INDEX_USED AS no_index_used_count, SUM_NO_GOOD_INDEX_USED AS no_good_index_used_count, ROUND(IFNULL(SUM_NO_INDEX_USED / NULLIF(COUNT_STAR, 0), 0) * 100) AS no_index_used_pct, SUM_ROWS_SENT AS rows_sent, SUM_ROWS_EXAMINED AS rows_examined, ROUND(SUM_ROWS_SENT/COUNT_STAR) AS rows_sent_avg, ROUND(SUM_ROWS_EXAMINED/COUNT_STAR) AS rows_examined_avg, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE (SUM_NO_INDEX_USED > 0 OR SUM_NO_GOOD_INDEX_USED > 0) AND DIGEST_TEXT NOT LIKE 'SHOW%' ORDER BY no_index_used_pct DESC, total_latency DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$ps_digest_avg_latency_distribution ( cnt, avg_us ) AS SELECT COUNT(*) cnt, ROUND(avg_timer_wait/1000000) AS avg_us FROM performance_schema.events_statements_summary_by_digest GROUP BY avg_us; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$ps_digest_95th_percentile_by_avg_us ( avg_us, percentile ) AS SELECT s2.avg_us avg_us, IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest), 0), 0) percentile FROM sys.x$ps_digest_avg_latency_distribution AS s1 JOIN sys.x$ps_digest_avg_latency_distribution AS s2 ON s1.avg_us <= s2.avg_us GROUP BY s2.avg_us HAVING IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM performance_schema.events_statements_summary_by_digest), 0), 0) > 0.95 ORDER BY percentile LIMIT 1; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW statements_with_runtimes_in_95th_percentile ( query, db, full_scan, exec_count, err_count, warn_count, total_latency, max_latency, avg_latency, rows_sent, rows_sent_avg, rows_examined, rows_examined_avg, first_seen, last_seen, digest ) AS SELECT sys.format_statement(DIGEST_TEXT) AS query, SCHEMA_NAME as db, IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan, COUNT_STAR AS exec_count, SUM_ERRORS AS err_count, SUM_WARNINGS AS warn_count, format_pico_time(SUM_TIMER_WAIT) AS total_latency, format_pico_time(MAX_TIMER_WAIT) AS max_latency, format_pico_time(AVG_TIMER_WAIT) AS avg_latency, SUM_ROWS_SENT AS rows_sent, ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg, SUM_ROWS_EXAMINED AS rows_examined, ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg, FIRST_SEEN AS first_seen, LAST_SEEN AS last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest stmts JOIN sys.x$ps_digest_95th_percentile_by_avg_us AS top_percentile ON ROUND(stmts.avg_timer_wait/1000000) >= top_percentile.avg_us ORDER BY AVG_TIMER_WAIT DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$statements_with_runtimes_in_95th_percentile ( query, db, full_scan, exec_count, err_count, warn_count, total_latency, max_latency, avg_latency, rows_sent, rows_sent_avg, rows_examined, rows_examined_avg, first_seen, last_seen, digest ) AS SELECT DIGEST_TEXT AS query, SCHEMA_NAME AS db, IF(SUM_NO_GOOD_INDEX_USED > 0 OR SUM_NO_INDEX_USED > 0, '*', '') AS full_scan, COUNT_STAR AS exec_count, SUM_ERRORS AS err_count, SUM_WARNINGS AS warn_count, SUM_TIMER_WAIT AS total_latency, MAX_TIMER_WAIT AS max_latency, AVG_TIMER_WAIT AS avg_latency, SUM_ROWS_SENT AS rows_sent, ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg, SUM_ROWS_EXAMINED AS rows_examined, ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest stmts JOIN sys.x$ps_digest_95th_percentile_by_avg_us AS top_percentile ON ROUND(stmts.avg_timer_wait/1000000) >= top_percentile.avg_us ORDER BY AVG_TIMER_WAIT DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW statements_with_sorting ( query, db, exec_count, total_latency, sort_merge_passes, avg_sort_merges, sorts_using_scans, sort_using_range, rows_sorted, avg_rows_sorted, first_seen, last_seen, digest ) AS SELECT sys.format_statement(DIGEST_TEXT) AS query, SCHEMA_NAME db, COUNT_STAR AS exec_count, format_pico_time(SUM_TIMER_WAIT) AS total_latency, SUM_SORT_MERGE_PASSES AS sort_merge_passes, ROUND(IFNULL(SUM_SORT_MERGE_PASSES / NULLIF(COUNT_STAR, 0), 0)) AS avg_sort_merges, SUM_SORT_SCAN AS sorts_using_scans, SUM_SORT_RANGE AS sort_using_range, SUM_SORT_ROWS AS rows_sorted, ROUND(IFNULL(SUM_SORT_ROWS / NULLIF(COUNT_STAR, 0), 0)) AS avg_rows_sorted, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE SUM_SORT_ROWS > 0 ORDER BY SUM_TIMER_WAIT DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$statements_with_sorting ( query, db, exec_count, total_latency, sort_merge_passes, avg_sort_merges, sorts_using_scans, sort_using_range, rows_sorted, avg_rows_sorted, first_seen, last_seen, digest ) AS SELECT DIGEST_TEXT AS query, SCHEMA_NAME db, COUNT_STAR AS exec_count, SUM_TIMER_WAIT AS total_latency, SUM_SORT_MERGE_PASSES AS sort_merge_passes, ROUND(IFNULL(SUM_SORT_MERGE_PASSES / NULLIF(COUNT_STAR, 0), 0)) AS avg_sort_merges, SUM_SORT_SCAN AS sorts_using_scans, SUM_SORT_RANGE AS sort_using_range, SUM_SORT_ROWS AS rows_sorted, ROUND(IFNULL(SUM_SORT_ROWS / NULLIF(COUNT_STAR, 0), 0)) AS avg_rows_sorted, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE SUM_SORT_ROWS > 0 ORDER BY SUM_TIMER_WAIT DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW statements_with_temp_tables ( query, db, exec_count, total_latency, memory_tmp_tables, disk_tmp_tables, avg_tmp_tables_per_query, tmp_tables_to_disk_pct, first_seen, last_seen, digest ) AS SELECT sys.format_statement(DIGEST_TEXT) AS query, SCHEMA_NAME as db, COUNT_STAR AS exec_count, format_pico_time(SUM_TIMER_WAIT) as total_latency, SUM_CREATED_TMP_TABLES AS memory_tmp_tables, SUM_CREATED_TMP_DISK_TABLES AS disk_tmp_tables, ROUND(IFNULL(SUM_CREATED_TMP_TABLES / NULLIF(COUNT_STAR, 0), 0)) AS avg_tmp_tables_per_query, ROUND(IFNULL(SUM_CREATED_TMP_DISK_TABLES / NULLIF(SUM_CREATED_TMP_TABLES, 0), 0) * 100) AS tmp_tables_to_disk_pct, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE SUM_CREATED_TMP_TABLES > 0 ORDER BY SUM_CREATED_TMP_DISK_TABLES DESC, SUM_CREATED_TMP_TABLES DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$statements_with_temp_tables ( query, db, exec_count, total_latency, memory_tmp_tables, disk_tmp_tables, avg_tmp_tables_per_query, tmp_tables_to_disk_pct, first_seen, last_seen, digest ) AS SELECT DIGEST_TEXT AS query, SCHEMA_NAME as db, COUNT_STAR AS exec_count, SUM_TIMER_WAIT as total_latency, SUM_CREATED_TMP_TABLES AS memory_tmp_tables, SUM_CREATED_TMP_DISK_TABLES AS disk_tmp_tables, ROUND(IFNULL(SUM_CREATED_TMP_TABLES / NULLIF(COUNT_STAR, 0), 0)) AS avg_tmp_tables_per_query, ROUND(IFNULL(SUM_CREATED_TMP_DISK_TABLES / NULLIF(SUM_CREATED_TMP_TABLES, 0), 0) * 100) AS tmp_tables_to_disk_pct, FIRST_SEEN as first_seen, LAST_SEEN as last_seen, DIGEST AS digest FROM performance_schema.events_statements_summary_by_digest WHERE SUM_CREATED_TMP_TABLES > 0 ORDER BY SUM_CREATED_TMP_DISK_TABLES DESC, SUM_CREATED_TMP_TABLES DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW user_summary_by_file_io_type ( user, event_name, total, latency, max_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, event_name, count_star AS total, format_pico_time(sum_timer_wait) AS latency, format_pico_time(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_by_user_by_event_name WHERE event_name LIKE 'wait/io/file%' AND count_star > 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$user_summary_by_file_io_type ( user, event_name, total, latency, max_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, event_name, count_star AS total, sum_timer_wait AS latency, max_timer_wait AS max_latency FROM performance_schema.events_waits_summary_by_user_by_event_name WHERE event_name LIKE 'wait/io/file%' AND count_star > 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW user_summary_by_file_io ( user, ios, io_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUM(count_star) AS ios, format_pico_time(SUM(sum_timer_wait)) AS io_latency FROM performance_schema.events_waits_summary_by_user_by_event_name WHERE event_name LIKE 'wait/io/file/%' GROUP BY IF(user IS NULL, 'background', user) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$user_summary_by_file_io ( user, ios, io_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUM(count_star) AS ios, SUM(sum_timer_wait) AS io_latency FROM performance_schema.events_waits_summary_by_user_by_event_name WHERE event_name LIKE 'wait/io/file/%' GROUP BY IF(user IS NULL, 'background', user) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW user_summary_by_statement_type ( user, statement, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUBSTRING_INDEX(event_name, '/', -1) AS statement, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(max_timer_wait) AS max_latency, format_pico_time(sum_lock_time) AS lock_latency, sum_rows_sent AS rows_sent, sum_rows_examined AS rows_examined, sum_rows_affected AS rows_affected, sum_no_index_used + sum_no_good_index_used AS full_scans FROM performance_schema.events_statements_summary_by_user_by_event_name WHERE sum_timer_wait != 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$user_summary_by_statement_type ( user, statement, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUBSTRING_INDEX(event_name, '/', -1) AS statement, count_star AS total, sum_timer_wait AS total_latency, max_timer_wait AS max_latency, sum_lock_time AS lock_latency, sum_rows_sent AS rows_sent, sum_rows_examined AS rows_examined, sum_rows_affected AS rows_affected, sum_no_index_used + sum_no_good_index_used AS full_scans FROM performance_schema.events_statements_summary_by_user_by_event_name WHERE sum_timer_wait != 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW user_summary_by_statement_latency ( user, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUM(count_star) AS total, format_pico_time(SUM(sum_timer_wait)) AS total_latency, format_pico_time(SUM(max_timer_wait)) AS max_latency, format_pico_time(SUM(sum_lock_time)) AS lock_latency, SUM(sum_rows_sent) AS rows_sent, SUM(sum_rows_examined) AS rows_examined, SUM(sum_rows_affected) AS rows_affected, SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans FROM performance_schema.events_statements_summary_by_user_by_event_name GROUP BY IF(user IS NULL, 'background', user) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$user_summary_by_statement_latency ( user, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(user IS NULL, 'background', user) AS user, SUM(count_star) AS total, SUM(sum_timer_wait) AS total_latency, SUM(max_timer_wait) AS max_latency, SUM(sum_lock_time) AS lock_latency, SUM(sum_rows_sent) AS rows_sent, SUM(sum_rows_examined) AS rows_examined, SUM(sum_rows_affected) AS rows_affected, SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans FROM performance_schema.events_statements_summary_by_user_by_event_name GROUP BY IF(user IS NULL, 'background', user) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW user_summary_by_stages ( user, event_name, total, total_latency, avg_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, event_name, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(avg_timer_wait) AS avg_latency FROM performance_schema.events_stages_summary_by_user_by_event_name WHERE sum_timer_wait != 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$user_summary_by_stages ( user, event_name, total, total_latency, avg_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, event_name, count_star AS total, sum_timer_wait AS total_latency, avg_timer_wait AS avg_latency FROM performance_schema.events_stages_summary_by_user_by_event_name WHERE sum_timer_wait != 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW user_summary ( user, statements, statement_latency, statement_avg_latency, table_scans, file_ios, file_io_latency, current_connections, total_connections, unique_hosts, current_memory, total_memory_allocated ) AS SELECT IF(accounts.user IS NULL, 'background', accounts.user) AS user, SUM(stmt.total) AS statements, format_pico_time(SUM(stmt.total_latency)) AS statement_latency, format_pico_time(IFNULL(SUM(stmt.total_latency) / NULLIF(SUM(stmt.total), 0), 0)) AS statement_avg_latency, SUM(stmt.full_scans) AS table_scans, SUM(io.ios) AS file_ios, format_pico_time(SUM(io.io_latency)) AS file_io_latency, SUM(accounts.current_connections) AS current_connections, SUM(accounts.total_connections) AS total_connections, COUNT(DISTINCT host) AS unique_hosts, sys.format_bytes(SUM(mem.current_allocated)) AS current_memory, sys.format_bytes(SUM(mem.total_allocated)) AS total_memory_allocated FROM performance_schema.accounts LEFT JOIN sys.x$user_summary_by_statement_latency AS stmt ON IF(accounts.user IS NULL, 'background', accounts.user) = stmt.user LEFT JOIN sys.x$user_summary_by_file_io AS io ON IF(accounts.user IS NULL, 'background', accounts.user) = io.user LEFT JOIN sys.x$memory_by_user_by_current_bytes mem ON IF(accounts.user IS NULL, 'background', accounts.user) = mem.user GROUP BY IF(accounts.user IS NULL, 'background', accounts.user) ORDER BY SUM(stmt.total_latency) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$user_summary ( user, statements, statement_latency, statement_avg_latency, table_scans, file_ios, file_io_latency, current_connections, total_connections, unique_hosts, current_memory, total_memory_allocated ) AS SELECT IF(accounts.user IS NULL, 'background', accounts.user) AS user, SUM(stmt.total) AS statements, SUM(stmt.total_latency) AS statement_latency, IFNULL(SUM(stmt.total_latency) / NULLIF(SUM(stmt.total), 0), 0) AS statement_avg_latency, SUM(stmt.full_scans) AS table_scans, SUM(io.ios) AS file_ios, SUM(io.io_latency) AS file_io_latency, SUM(accounts.current_connections) AS current_connections, SUM(accounts.total_connections) AS total_connections, COUNT(DISTINCT host) AS unique_hosts, SUM(mem.current_allocated) AS current_memory, SUM(mem.total_allocated) AS total_memory_allocated FROM performance_schema.accounts LEFT JOIN sys.x$user_summary_by_statement_latency AS stmt ON IF(accounts.user IS NULL, 'background', accounts.user) = stmt.user LEFT JOIN sys.x$user_summary_by_file_io AS io ON IF(accounts.user IS NULL, 'background', accounts.user) = io.user LEFT JOIN sys.x$memory_by_user_by_current_bytes mem ON IF(accounts.user IS NULL, 'background', accounts.user) = mem.user GROUP BY IF(accounts.user IS NULL, 'background', accounts.user) ORDER BY SUM(stmt.total_latency) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW host_summary_by_file_io_type ( host, event_name, total, total_latency, max_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, event_name, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_by_host_by_event_name WHERE event_name LIKE 'wait/io/file%' AND count_star > 0 ORDER BY IF(host IS NULL, 'background', host), sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$host_summary_by_file_io_type ( host, event_name, total, total_latency, max_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, event_name, count_star AS total, sum_timer_wait AS total_latency, max_timer_wait AS max_latency FROM performance_schema.events_waits_summary_by_host_by_event_name WHERE event_name LIKE 'wait/io/file%' AND count_star > 0 ORDER BY IF(host IS NULL, 'background', host), sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW host_summary_by_file_io ( host, ios, io_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUM(count_star) AS ios, format_pico_time(SUM(sum_timer_wait)) AS io_latency FROM performance_schema.events_waits_summary_by_host_by_event_name WHERE event_name LIKE 'wait/io/file/%' GROUP BY IF(host IS NULL, 'background', host) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$host_summary_by_file_io ( host, ios, io_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUM(count_star) AS ios, SUM(sum_timer_wait) AS io_latency FROM performance_schema.events_waits_summary_by_host_by_event_name WHERE event_name LIKE 'wait/io/file/%' GROUP BY IF(host IS NULL, 'background', host) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW host_summary_by_statement_type ( host, statement, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUBSTRING_INDEX(event_name, '/', -1) AS statement, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(max_timer_wait) AS max_latency, format_pico_time(sum_lock_time) AS lock_latency, sum_rows_sent AS rows_sent, sum_rows_examined AS rows_examined, sum_rows_affected AS rows_affected, sum_no_index_used + sum_no_good_index_used AS full_scans FROM performance_schema.events_statements_summary_by_host_by_event_name WHERE sum_timer_wait != 0 ORDER BY IF(host IS NULL, 'background', host), sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$host_summary_by_statement_type ( host, statement, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUBSTRING_INDEX(event_name, '/', -1) AS statement, count_star AS total, sum_timer_wait AS total_latency, max_timer_wait AS max_latency, sum_lock_time AS lock_latency, sum_rows_sent AS rows_sent, sum_rows_examined AS rows_examined, sum_rows_affected AS rows_affected, sum_no_index_used + sum_no_good_index_used AS full_scans FROM performance_schema.events_statements_summary_by_host_by_event_name WHERE sum_timer_wait != 0 ORDER BY IF(host IS NULL, 'background', host), sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW host_summary_by_statement_latency ( host, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUM(count_star) AS total, format_pico_time(SUM(sum_timer_wait)) AS total_latency, format_pico_time(MAX(max_timer_wait)) AS max_latency, format_pico_time(SUM(sum_lock_time)) AS lock_latency, SUM(sum_rows_sent) AS rows_sent, SUM(sum_rows_examined) AS rows_examined, SUM(sum_rows_affected) AS rows_affected, SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans FROM performance_schema.events_statements_summary_by_host_by_event_name GROUP BY IF(host IS NULL, 'background', host) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$host_summary_by_statement_latency ( host, total, total_latency, max_latency, lock_latency, rows_sent, rows_examined, rows_affected, full_scans ) AS SELECT IF(host IS NULL, 'background', host) AS host, SUM(count_star) AS total, SUM(sum_timer_wait) AS total_latency, MAX(max_timer_wait) AS max_latency, SUM(sum_lock_time) AS lock_latency, SUM(sum_rows_sent) AS rows_sent, SUM(sum_rows_examined) AS rows_examined, SUM(sum_rows_affected) AS rows_affected, SUM(sum_no_index_used) + SUM(sum_no_good_index_used) AS full_scans FROM performance_schema.events_statements_summary_by_host_by_event_name GROUP BY IF(host IS NULL, 'background', host) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW host_summary_by_stages ( host, event_name, total, total_latency, avg_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, event_name, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(avg_timer_wait) AS avg_latency FROM performance_schema.events_stages_summary_by_host_by_event_name WHERE sum_timer_wait != 0 ORDER BY IF(host IS NULL, 'background', host), sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$host_summary_by_stages ( host, event_name, total, total_latency, avg_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, event_name, count_star AS total, sum_timer_wait AS total_latency, avg_timer_wait AS avg_latency FROM performance_schema.events_stages_summary_by_host_by_event_name WHERE sum_timer_wait != 0 ORDER BY IF(host IS NULL, 'background', host), sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW host_summary ( host, statements, statement_latency, statement_avg_latency, table_scans, file_ios, file_io_latency, current_connections, total_connections, unique_users, current_memory, total_memory_allocated ) AS SELECT IF(accounts.host IS NULL, 'background', accounts.host) AS host, SUM(stmt.total) AS statements, format_pico_time(SUM(stmt.total_latency)) AS statement_latency, format_pico_time(IFNULL(SUM(stmt.total_latency) / NULLIF(SUM(stmt.total), 0), 0)) AS statement_avg_latency, SUM(stmt.full_scans) AS table_scans, SUM(io.ios) AS file_ios, format_pico_time(SUM(io.io_latency)) AS file_io_latency, SUM(accounts.current_connections) AS current_connections, SUM(accounts.total_connections) AS total_connections, COUNT(DISTINCT user) AS unique_users, sys.format_bytes(SUM(mem.current_allocated)) AS current_memory, sys.format_bytes(SUM(mem.total_allocated)) AS total_memory_allocated FROM performance_schema.accounts JOIN sys.x$host_summary_by_statement_latency AS stmt ON accounts.host = stmt.host JOIN sys.x$host_summary_by_file_io AS io ON accounts.host = io.host JOIN sys.x$memory_by_host_by_current_bytes mem ON accounts.host = mem.host GROUP BY IF(accounts.host IS NULL, 'background', accounts.host); CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$host_summary ( host, statements, statement_latency, statement_avg_latency, table_scans, file_ios, file_io_latency, current_connections, total_connections, unique_users, current_memory, total_memory_allocated ) AS SELECT IF(accounts.host IS NULL, 'background', accounts.host) AS host, SUM(stmt.total) AS statements, SUM(stmt.total_latency) AS statement_latency, SUM(stmt.total_latency) / SUM(stmt.total) AS statement_avg_latency, SUM(stmt.full_scans) AS table_scans, SUM(io.ios) AS file_ios, SUM(io.io_latency) AS file_io_latency, SUM(accounts.current_connections) AS current_connections, SUM(accounts.total_connections) AS total_connections, COUNT(DISTINCT accounts.user) AS unique_users, SUM(mem.current_allocated) AS current_memory, SUM(mem.total_allocated) AS total_memory_allocated FROM performance_schema.accounts JOIN sys.x$host_summary_by_statement_latency AS stmt ON accounts.host = stmt.host JOIN sys.x$host_summary_by_file_io AS io ON accounts.host = io.host JOIN sys.x$memory_by_host_by_current_bytes mem ON accounts.host = mem.host GROUP BY IF(accounts.host IS NULL, 'background', accounts.host); CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW wait_classes_global_by_avg_latency ( event_class, total, total_latency, min_latency, avg_latency, max_latency ) AS SELECT SUBSTRING_INDEX(event_name,'/', 3) AS event_class, SUM(COUNT_STAR) AS total, format_pico_time(CAST(SUM(sum_timer_wait) AS UNSIGNED)) AS total_latency, format_pico_time(MIN(min_timer_wait)) AS min_latency, format_pico_time(IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0)) AS avg_latency, format_pico_time(CAST(MAX(max_timer_wait) AS UNSIGNED)) AS max_latency FROM performance_schema.events_waits_summary_global_by_event_name WHERE sum_timer_wait > 0 AND event_name != 'idle' GROUP BY event_class ORDER BY IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$wait_classes_global_by_avg_latency ( event_class, total, total_latency, min_latency, avg_latency, max_latency ) AS SELECT SUBSTRING_INDEX(event_name,'/', 3) AS event_class, SUM(COUNT_STAR) AS total, SUM(sum_timer_wait) AS total_latency, MIN(min_timer_wait) AS min_latency, IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) AS avg_latency, MAX(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_global_by_event_name WHERE sum_timer_wait > 0 AND event_name != 'idle' GROUP BY event_class ORDER BY IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW wait_classes_global_by_latency ( event_class, total, total_latency, min_latency, avg_latency, max_latency ) AS SELECT SUBSTRING_INDEX(event_name,'/', 3) AS event_class, SUM(COUNT_STAR) AS total, format_pico_time(SUM(sum_timer_wait)) AS total_latency, format_pico_time(MIN(min_timer_wait)) min_latency, format_pico_time(IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0)) AS avg_latency, format_pico_time(MAX(max_timer_wait)) AS max_latency FROM performance_schema.events_waits_summary_global_by_event_name WHERE sum_timer_wait > 0 AND event_name != 'idle' GROUP BY SUBSTRING_INDEX(event_name,'/', 3) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$wait_classes_global_by_latency ( event_class, total, total_latency, min_latency, avg_latency, max_latency ) AS SELECT SUBSTRING_INDEX(event_name,'/', 3) AS event_class, SUM(COUNT_STAR) AS total, SUM(sum_timer_wait) AS total_latency, MIN(min_timer_wait) AS min_latency, IFNULL(SUM(sum_timer_wait) / NULLIF(SUM(COUNT_STAR), 0), 0) AS avg_latency, MAX(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_global_by_event_name WHERE sum_timer_wait > 0 AND event_name != 'idle' GROUP BY SUBSTRING_INDEX(event_name,'/', 3) ORDER BY SUM(sum_timer_wait) DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW waits_by_user_by_latency ( user, event, total, total_latency, avg_latency, max_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, event_name AS event, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(avg_timer_wait) AS avg_latency, format_pico_time(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_by_user_by_event_name WHERE event_name != 'idle' AND user IS NOT NULL AND sum_timer_wait > 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$waits_by_user_by_latency ( user, event, total, total_latency, avg_latency, max_latency ) AS SELECT IF(user IS NULL, 'background', user) AS user, event_name AS event, count_star AS total, sum_timer_wait AS total_latency, avg_timer_wait AS avg_latency, max_timer_wait AS max_latency FROM performance_schema.events_waits_summary_by_user_by_event_name WHERE event_name != 'idle' AND user IS NOT NULL AND sum_timer_wait > 0 ORDER BY user, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW waits_by_host_by_latency ( host, event, total, total_latency, avg_latency, max_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, event_name AS event, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(avg_timer_wait) AS avg_latency, format_pico_time(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_by_host_by_event_name WHERE event_name != 'idle' AND sum_timer_wait > 0 ORDER BY host, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$waits_by_host_by_latency ( host, event, total, total_latency, avg_latency, max_latency ) AS SELECT IF(host IS NULL, 'background', host) AS host, event_name AS event, count_star AS total, sum_timer_wait AS total_latency, avg_timer_wait AS avg_latency, max_timer_wait AS max_latency FROM performance_schema.events_waits_summary_by_host_by_event_name WHERE event_name != 'idle' AND sum_timer_wait > 0 ORDER BY host, sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW waits_global_by_latency ( events, total, total_latency, avg_latency, max_latency ) AS SELECT event_name AS event, count_star AS total, format_pico_time(sum_timer_wait) AS total_latency, format_pico_time(avg_timer_wait) AS avg_latency, format_pico_time(max_timer_wait) AS max_latency FROM performance_schema.events_waits_summary_global_by_event_name WHERE event_name != 'idle' AND sum_timer_wait > 0 ORDER BY sum_timer_wait DESC; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$waits_global_by_latency ( events, total, total_latency, avg_latency, max_latency ) AS SELECT event_name AS event, count_star AS total, sum_timer_wait AS total_latency, avg_timer_wait AS avg_latency, max_timer_wait AS max_latency FROM performance_schema.events_waits_summary_global_by_event_name WHERE event_name != 'idle' AND sum_timer_wait > 0 ORDER BY sum_timer_wait DESC; BEGIN NOT ATOMIC DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN END; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW metrics ( Variable_name, Variable_value, Type, Enabled ) AS ( SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value, 'Global Status' AS Type, 'YES' AS Enabled FROM performance_schema.global_status ) UNION ALL ( SELECT NAME AS Variable_name, COUNT AS Variable_value, CONCAT('InnoDB Metrics - ', SUBSYSTEM) AS Type, 'YES' AS Enabled FROM information_schema.INNODB_METRICS WHERE NAME NOT IN ( 'lock_row_lock_time', 'lock_row_lock_time_avg', 'lock_row_lock_time_max', 'lock_row_lock_waits', 'buffer_pool_reads', 'buffer_pool_read_requests', 'buffer_pool_write_requests', 'buffer_pool_wait_free', 'buffer_pool_read_ahead', 'buffer_pool_read_ahead_evicted', 'buffer_pool_pages_total', 'buffer_pool_pages_misc', 'buffer_pool_pages_data', 'buffer_pool_bytes_data', 'buffer_pool_pages_dirty', 'buffer_pool_bytes_dirty', 'buffer_pool_pages_free', 'buffer_pages_created', 'buffer_pages_written', 'buffer_pages_read', 'buffer_data_reads', 'buffer_data_written', 'file_num_open_files', 'os_log_bytes_written', 'os_log_fsyncs', 'os_log_pending_fsyncs', 'os_log_pending_writes', 'log_waits', 'log_write_requests', 'log_writes', 'innodb_dblwr_writes', 'innodb_dblwr_pages_written', 'innodb_page_size') ) /*!50702 UNION ALL ( SELECT 'memory_current_allocated' AS Variable_name, SUM(CURRENT_NUMBER_OF_BYTES_USED) AS Variable_value, 'Performance Schema' AS Type, IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES') = 0, 'NO', IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES') = (SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%'), 'YES', 'PARTIAL')) AS Enabled FROM performance_schema.memory_summary_global_by_event_name ) UNION ALL ( SELECT 'memory_total_allocated' AS Variable_name, SUM(SUM_NUMBER_OF_BYTES_ALLOC) AS Variable_value, 'Performance Schema' AS Type, IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES') = 0, 'NO', IF((SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES') = (SELECT COUNT(*) FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%'), 'YES', 'PARTIAL')) AS Enabled FROM performance_schema.memory_summary_global_by_event_name ) */ UNION ALL ( SELECT 'NOW()' AS Variable_name, NOW(3) AS Variable_value, 'System Time' AS Type, 'YES' AS Enabled ) UNION ALL ( SELECT 'UNIX_TIMESTAMP()' AS Variable_name, ROUND(UNIX_TIMESTAMP(NOW(3)), 3) AS Variable_value, 'System Time' AS Type, 'YES' AS Enabled ) ORDER BY Type, Variable_name; END$$ CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW processlist ( thd_id, conn_id, user, db, command, state, time, current_statement, statement_latency, progress, lock_latency, rows_examined, rows_sent, rows_affected, tmp_tables, tmp_disk_tables, full_scan, last_statement, last_statement_latency, current_memory, last_wait, last_wait_latency, source, trx_latency, trx_state, trx_autocommit, pid, program_name ) AS SELECT pps.thread_id AS thd_id, pps.processlist_id AS conn_id, IF(pps.name = 'thread/sql/one_connection', CONCAT(pps.processlist_user, '@', pps.processlist_host), REPLACE(pps.name, 'thread/', '')) user, pps.processlist_db AS db, pps.processlist_command AS command, pps.processlist_state AS state, pps.processlist_time AS time, sys.format_statement(pps.processlist_info) AS current_statement, IF(esc.end_event_id IS NULL, format_pico_time(esc.timer_wait), NULL) AS statement_latency, IF(esc.end_event_id IS NULL, ROUND(100 * (estc.work_completed / estc.work_estimated), 2), NULL) AS progress, format_pico_time(esc.lock_time) AS lock_latency, esc.rows_examined AS rows_examined, esc.rows_sent AS rows_sent, esc.rows_affected AS rows_affected, esc.created_tmp_tables AS tmp_tables, esc.created_tmp_disk_tables AS tmp_disk_tables, IF(esc.no_good_index_used > 0 OR esc.no_index_used > 0, 'YES', 'NO') AS full_scan, IF(esc.end_event_id IS NOT NULL, sys.format_statement(esc.sql_text), NULL) AS last_statement, IF(esc.end_event_id IS NOT NULL, format_pico_time(esc.timer_wait), NULL) AS last_statement_latency, sys.format_bytes(mem.current_allocated) AS current_memory, ewc.event_name AS last_wait, IF(ewc.end_event_id IS NULL AND ewc.event_name IS NOT NULL, 'Still Waiting', format_pico_time(ewc.timer_wait)) last_wait_latency, ewc.source, format_pico_time(etc.timer_wait) AS trx_latency, etc.state AS trx_state, etc.autocommit AS trx_autocommit, conattr_pid.attr_value as pid, conattr_progname.attr_value as program_name FROM performance_schema.threads AS pps LEFT JOIN performance_schema.events_waits_current AS ewc USING (thread_id) LEFT JOIN performance_schema.events_stages_current AS estc USING (thread_id) LEFT JOIN performance_schema.events_statements_current AS esc USING (thread_id) LEFT JOIN performance_schema.events_transactions_current AS etc USING (thread_id) LEFT JOIN sys.x$memory_by_thread_by_current_bytes AS mem USING (thread_id) LEFT JOIN performance_schema.session_connect_attrs AS conattr_pid ON conattr_pid.processlist_id=pps.processlist_id and conattr_pid.attr_name='_pid' LEFT JOIN performance_schema.session_connect_attrs AS conattr_progname ON conattr_progname.processlist_id=pps.processlist_id and conattr_progname.attr_name='program_name' ORDER BY pps.processlist_time DESC, last_wait_latency DESC; CREATE OR REPLACE ALGORITHM = TEMPTABLE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$processlist ( thd_id, conn_id, user, db, command, state, time, current_statement, statement_latency, progress, lock_latency, rows_examined, rows_sent, rows_affected, tmp_tables, tmp_disk_tables, full_scan, last_statement, last_statement_latency, current_memory, last_wait, last_wait_latency, source, trx_latency, trx_state, trx_autocommit, pid, program_name ) AS SELECT pps.thread_id AS thd_id, pps.processlist_id AS conn_id, IF(pps.name = 'thread/sql/one_connection', CONCAT(pps.processlist_user, '@', pps.processlist_host), REPLACE(pps.name, 'thread/', '')) user, pps.processlist_db AS db, pps.processlist_command AS command, pps.processlist_state AS state, pps.processlist_time AS time, pps.processlist_info AS current_statement, IF(esc.end_event_id IS NULL, esc.timer_wait, NULL) AS statement_latency, IF(esc.end_event_id IS NULL, ROUND(100 * (estc.work_completed / estc.work_estimated), 2), NULL) AS progress, esc.lock_time AS lock_latency, esc.rows_examined AS rows_examined, esc.rows_sent AS rows_sent, esc.rows_affected AS rows_affected, esc.created_tmp_tables AS tmp_tables, esc.created_tmp_disk_tables AS tmp_disk_tables, IF(esc.no_good_index_used > 0 OR esc.no_index_used > 0, 'YES', 'NO') AS full_scan, IF(esc.end_event_id IS NOT NULL, esc.sql_text, NULL) AS last_statement, IF(esc.end_event_id IS NOT NULL, esc.timer_wait, NULL) AS last_statement_latency, mem.current_allocated AS current_memory, ewc.event_name AS last_wait, IF(ewc.end_event_id IS NULL AND ewc.event_name IS NOT NULL, 'Still Waiting', ewc.timer_wait) last_wait_latency, ewc.source, etc.timer_wait AS trx_latency, etc.state AS trx_state, etc.autocommit AS trx_autocommit, conattr_pid.attr_value as pid, conattr_progname.attr_value as program_name FROM performance_schema.threads AS pps LEFT JOIN performance_schema.events_waits_current AS ewc USING (thread_id) LEFT JOIN performance_schema.events_stages_current AS estc USING (thread_id) LEFT JOIN performance_schema.events_statements_current AS esc USING (thread_id) LEFT JOIN performance_schema.events_transactions_current AS etc USING (thread_id) LEFT JOIN sys.x$memory_by_thread_by_current_bytes AS mem USING (thread_id) LEFT JOIN performance_schema.session_connect_attrs AS conattr_pid ON conattr_pid.processlist_id=pps.processlist_id and conattr_pid.attr_name='_pid' LEFT JOIN performance_schema.session_connect_attrs AS conattr_progname ON conattr_progname.processlist_id=pps.processlist_id and conattr_progname.attr_name='program_name' ORDER BY pps.processlist_time DESC, last_wait_latency DESC; CREATE OR REPLACE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW session AS SELECT * FROM sys.processlist WHERE conn_id IS NOT NULL AND command != 'Daemon'; CREATE OR REPLACE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW x$session AS SELECT * FROM sys.x$processlist WHERE conn_id IS NOT NULL AND command != 'Daemon'; CREATE OR REPLACE ALGORITHM = MERGE DEFINER = 'mariadb.sys'@'localhost' SQL SECURITY INVOKER VIEW session_ssl_status ( thread_id, ssl_version, ssl_cipher, ssl_sessions_reused ) AS SELECT sslver.thread_id, sslver.variable_value ssl_version, sslcip.variable_value ssl_cipher, sslreuse.variable_value ssl_sessions_reused FROM performance_schema.status_by_thread sslver LEFT JOIN performance_schema.status_by_thread sslcip ON (sslcip.thread_id=sslver.thread_id and sslcip.variable_name='Ssl_cipher') LEFT JOIN performance_schema.status_by_thread sslreuse ON (sslreuse.thread_id=sslver.thread_id and sslreuse.variable_name='Ssl_sessions_reused') WHERE sslver.variable_name='Ssl_version'; DROP PROCEDURE IF EXISTS create_synonym_db; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE create_synonym_db ( IN in_db_name VARCHAR(64), IN in_synonym VARCHAR(64) ) COMMENT ' Description Takes a source database name and synonym name, and then creates the synonym database with views that point to all of the tables within the source database. Useful for creating a "ps" synonym for "performance_schema", or "is" instead of "information_schema", for example. Parameters in_db_name (VARCHAR(64)): The database name that you would like to create a synonym for. in_synonym (VARCHAR(64)): The database synonym name. Example mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | test | +--------------------+ 5 rows in set (0.00 sec) mysql> CALL sys.create_synonym_db(\'performance_schema\', \'ps\'); +---------------------------------------+ | summary | +---------------------------------------+ | Created 74 views in the `ps` database | +---------------------------------------+ 1 row in set (8.57 sec) Query OK, 0 rows affected (8.57 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | ps | | sys | | test | +--------------------+ 6 rows in set (0.00 sec) mysql> SHOW FULL TABLES FROM ps; +------------------------------------------------------+------------+ | Tables_in_ps | Table_type | +------------------------------------------------------+------------+ | accounts | VIEW | | cond_instances | VIEW | | events_stages_current | VIEW | | events_stages_history | VIEW | ... ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE v_done bool DEFAULT FALSE; DECLARE v_db_name_check VARCHAR(64); DECLARE v_db_err_msg TEXT; DECLARE v_table VARCHAR(64); DECLARE v_views_created INT DEFAULT 0; DECLARE v_table_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT ''; DECLARE db_doesnt_exist CONDITION FOR SQLSTATE '42000'; DECLARE db_name_exists CONDITION FOR SQLSTATE 'HY000'; DECLARE c_table_names CURSOR FOR SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = in_db_name; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SELECT SCHEMA_NAME INTO v_db_name_check FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = in_db_name; IF v_db_name_check IS NULL THEN SET v_db_err_msg = CONCAT('Unknown database ', in_db_name); SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = v_db_err_msg; END IF; SELECT SCHEMA_NAME INTO v_db_name_check FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = in_synonym; IF v_db_name_check = in_synonym THEN SET v_db_err_msg = CONCAT('Can\'t create database ', in_synonym, '; database exists'); SIGNAL SQLSTATE 'HY000' SET MESSAGE_TEXT = v_db_err_msg; END IF; SET @create_db_stmt := CONCAT('CREATE DATABASE ', sys.quote_identifier(in_synonym)); PREPARE create_db_stmt FROM @create_db_stmt; EXECUTE create_db_stmt; DEALLOCATE PREPARE create_db_stmt; SET v_done = FALSE; OPEN c_table_names; c_table_names: LOOP FETCH c_table_names INTO v_table; IF v_done THEN LEAVE c_table_names; END IF; CALL sys.table_exists(in_db_name, v_table, v_table_exists); IF (v_table_exists <> 'TEMPORARY') THEN SET @create_view_stmt = CONCAT( 'CREATE SQL SECURITY INVOKER VIEW ', sys.quote_identifier(in_synonym), '.', sys.quote_identifier(v_table), ' AS SELECT * FROM ', sys.quote_identifier(in_db_name), '.', sys.quote_identifier(v_table) ); PREPARE create_view_stmt FROM @create_view_stmt; EXECUTE create_view_stmt; DEALLOCATE PREPARE create_view_stmt; SET v_views_created = v_views_created + 1; END IF; END LOOP; CLOSE c_table_names; SELECT CONCAT( 'Created ', v_views_created, ' view', IF(v_views_created != 1, 's', ''), ' in the ', sys.quote_identifier(in_synonym), ' database' ) AS summary; END$$ DROP PROCEDURE IF EXISTS execute_prepared_stmt; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE execute_prepared_stmt ( IN in_query longtext CHARACTER SET UTF8 ) COMMENT ' Description Takes the query in the argument and executes it using a prepared statement. The prepared statement is deallocated, so the procedure is mainly useful for executing one off dynamically created queries. The sys_execute_prepared_stmt prepared statement name is used for the query and is required not to exist. Parameters in_query (longtext CHARACTER SET UTF8): The query to execute. Configuration Options sys.debug Whether to provide debugging output. Default is ''OFF''. Set to ''ON'' to include. Example mysql> CALL sys.execute_prepared_stmt(''SELECT * FROM sys.sys_config''); +------------------------+-------+---------------------+--------+ | variable | value | set_time | set_by | +------------------------+-------+---------------------+--------+ | statement_truncate_len | 64 | 2015-06-30 13:06:00 | NULL | +------------------------+-------+---------------------+--------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN IF (@sys.debug IS NULL) THEN SET @sys.debug = sys.sys_get_config('debug', 'OFF'); END IF; IF (in_query IS NULL OR LENGTH(in_query) < 4) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = "The @sys.execute_prepared_stmt.sql must contain a query"; END IF; SET @sys.execute_prepared_stmt.sql = in_query; IF (@sys.debug = 'ON') THEN SELECT @sys.execute_prepared_stmt.sql AS 'Debug'; END IF; PREPARE sys_execute_prepared_stmt FROM @sys.execute_prepared_stmt.sql; EXECUTE sys_execute_prepared_stmt; DEALLOCATE PREPARE sys_execute_prepared_stmt; SET @sys.execute_prepared_stmt.sql = NULL; END$$ DROP PROCEDURE IF EXISTS diagnostics; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE diagnostics ( IN in_max_runtime int unsigned, IN in_interval int unsigned, IN in_auto_config enum ('current', 'medium', 'full') ) COMMENT ' Description Create a report of the current status of the server for diagnostics purposes. Data collected includes (some items depends on versions and settings): * The GLOBAL VARIABLES * Several sys schema views including metrics or equivalent (depending on version and settings) * Queries in the 95th percentile * Several ndbinfo views for MySQL Cluster * Replication (both master and slave) information. Some of the sys schema views are calculated as initial (optional), overall, delta: * The initial view is the content of the view at the start of this procedure. This output will be the same as the the start values used for the delta view. The initial view is included if @sys.diagnostics.include_raw = ''ON''. * The overall view is the content of the view at the end of this procedure. This output is the same as the end values used for the delta view. The overall view is always included. * The delta view is the difference from the beginning to the end. Note that for min and max values they are simply the min or max value from the end view respectively, so does not necessarily reflect the minimum/maximum value in the monitored period. Note: except for the metrics views the delta is only calculation between the first and last outputs. Requires the SUPER privilege for "SET sql_log_bin = 0;". Versions supported: * MySQL 5.6: 5.6.10 and later * MySQL 5.7: 5.7.9 and later Parameters in_max_runtime (INT UNSIGNED): The maximum time to keep collecting data. Use NULL to get the default which is 60 seconds, otherwise enter a value greater than 0. in_interval (INT UNSIGNED): How long to sleep between data collections. Use NULL to get the default which is 30 seconds, otherwise enter a value greater than 0. in_auto_config (ENUM(''current'', ''medium'', ''full'')) Automatically enable Performance Schema instruments and consumers. NOTE: The more that are enabled, the more impact on the performance. Supported values are: * current - use the current settings. * medium - enable some settings. * full - enables all settings. This will have a big impact on the performance - be careful using this option. If another setting the ''current'' is chosen, the current settings are restored at the end of the procedure. Configuration Options sys.diagnostics.allow_i_s_tables Specifies whether it is allowed to do table scan queries on information_schema.TABLES. This can be expensive if there are many tables. Set to ''ON'' to allow, ''OFF'' to not allow. Default is ''OFF''. sys.diagnostics.include_raw Set to ''ON'' to include the raw data (e.g. the original output of "SELECT * FROM sys.metrics"). Use this to get the initial values of the various views. Default is ''OFF''. sys.statement_truncate_len How much of queries in the process list output to include. Default is 64. sys.debug Whether to provide debugging output. Default is ''OFF''. Set to ''ON'' to include. Example To create a report and append it to the file diag.out: mysql> TEE diag.out; mysql> CALL sys.diagnostics(120, 30, ''current''); ... mysql> NOTEE; ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN DECLARE v_start, v_runtime, v_iter_start, v_sleep DECIMAL(20,2) DEFAULT 0.0; DECLARE v_has_innodb, v_has_ndb, v_has_ps, v_has_replication, v_has_ps_replication VARCHAR(8) CHARSET utf8 DEFAULT 'NO'; DECLARE v_this_thread_enabled, v_has_ps_vars, v_has_metrics ENUM('YES', 'NO'); DECLARE v_table_name, v_banner VARCHAR(64) CHARSET utf8; DECLARE v_sql_status_summary_select, v_sql_status_summary_delta, v_sql_status_summary_from, v_no_delta_names TEXT; DECLARE v_output_time, v_output_time_prev DECIMAL(20,3) UNSIGNED; DECLARE v_output_count, v_count, v_old_group_concat_max_len INT UNSIGNED DEFAULT 0; DECLARE v_status_summary_width TINYINT UNSIGNED DEFAULT 50; DECLARE v_done BOOLEAN DEFAULT FALSE; DECLARE c_ndbinfo CURSOR FOR SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'ndbinfo' AND TABLE_NAME NOT IN ( 'blocks', 'config_params', 'dict_obj_types', 'disk_write_speed_base', 'memory_per_fragment', 'memoryusage', 'operations_per_fragment', 'threadblocks' ); DECLARE c_sysviews_w_delta CURSOR FOR SELECT table_name FROM tmp_sys_views_delta ORDER BY table_name; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SELECT INSTRUMENTED INTO v_this_thread_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID(); IF (v_this_thread_enabled = 'YES') THEN CALL sys.ps_setup_disable_thread(CONNECTION_ID()); END IF; IF (in_max_runtime < in_interval) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'in_max_runtime must be greater than or equal to in_interval'; END IF; IF (in_max_runtime = 0) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'in_max_runtime must be greater than 0'; END IF; IF (in_interval = 0) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'in_interval must be greater than 0'; END IF; IF (@sys.diagnostics.allow_i_s_tables IS NULL) THEN SET @sys.diagnostics.allow_i_s_tables = sys.sys_get_config('diagnostics.allow_i_s_tables', 'OFF'); END IF; IF (@sys.diagnostics.include_raw IS NULL) THEN SET @sys.diagnostics.include_raw = sys.sys_get_config('diagnostics.include_raw' , 'OFF'); END IF; IF (@sys.debug IS NULL) THEN SET @sys.debug = sys.sys_get_config('debug' , 'OFF'); END IF; IF (@sys.statement_truncate_len IS NULL) THEN SET @sys.statement_truncate_len = sys.sys_get_config('statement_truncate_len' , '64' ); END IF; SET @log_bin := @@sql_log_bin; IF (@log_bin = 1) THEN SET sql_log_bin = 0; END IF; SET v_no_delta_names = CONCAT('s%{COUNT}.Variable_name NOT IN (', '''innodb_buffer_pool_pages_total'', ', '''innodb_page_size'', ', '''last_query_cost'', ', '''last_query_partial_plans'', ', '''qcache_total_blocks'', ', '''slave_last_heartbeat'', ', '''ssl_ctx_verify_depth'', ', '''ssl_ctx_verify_mode'', ', '''ssl_session_cache_size'', ', '''ssl_verify_depth'', ', '''ssl_verify_mode'', ', '''ssl_version'', ', '''buffer_flush_lsn_avg_rate'', ', '''buffer_flush_pct_for_dirty'', ', '''buffer_flush_pct_for_lsn'', ', '''buffer_pool_pages_total'', ', '''lock_row_lock_time_avg'', ', '''lock_row_lock_time_max'', ', '''innodb_page_size''', ')'); IF (in_auto_config <> 'current') THEN IF (@sys.debug = 'ON') THEN SELECT CONCAT('Updating Performance Schema configuration to ', in_auto_config) AS 'Debug'; END IF; CALL sys.ps_setup_save(0); IF (in_auto_config = 'medium') THEN UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME NOT LIKE '%\_history%'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME NOT LIKE 'wait/synch/%'; ELSEIF (in_auto_config = 'full') THEN UPDATE performance_schema.setup_consumers SET ENABLED = 'YES'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'; END IF; UPDATE performance_schema.threads SET INSTRUMENTED = 'YES' WHERE PROCESSLIST_ID <> CONNECTION_ID(); END IF; SET v_start = UNIX_TIMESTAMP(NOW(2)), in_interval = IFNULL(in_interval, 30), in_max_runtime = IFNULL(in_max_runtime, 60); SET v_banner = REPEAT( '-', LEAST( GREATEST( 36, CHAR_LENGTH(VERSION()), CHAR_LENGTH(@@global.version_comment), CHAR_LENGTH(@@global.version_compile_os), CHAR_LENGTH(@@global.version_compile_machine), CHAR_LENGTH(@@global.socket), CHAR_LENGTH(@@global.datadir) ), 64 ) ); SELECT 'Hostname' AS 'Name', @@global.hostname AS 'Value' UNION ALL SELECT 'Port' AS 'Name', @@global.port AS 'Value' UNION ALL SELECT 'Socket' AS 'Name', @@global.socket AS 'Value' UNION ALL SELECT 'Datadir' AS 'Name', @@global.datadir AS 'Value' UNION ALL SELECT REPEAT('-', 23) AS 'Name', v_banner AS 'Value' UNION ALL SELECT 'MySQL Version' AS 'Name', VERSION() AS 'Value' UNION ALL SELECT 'Sys Schema Version' AS 'Name', (SELECT sys_version FROM sys.version) AS 'Value' UNION ALL SELECT 'Version Comment' AS 'Name', @@global.version_comment AS 'Value' UNION ALL SELECT 'Version Compile OS' AS 'Name', @@global.version_compile_os AS 'Value' UNION ALL SELECT 'Version Compile Machine' AS 'Name', @@global.version_compile_machine AS 'Value' UNION ALL SELECT REPEAT('-', 23) AS 'Name', v_banner AS 'Value' UNION ALL SELECT 'UTC Time' AS 'Name', UTC_TIMESTAMP() AS 'Value' UNION ALL SELECT 'Local Time' AS 'Name', NOW() AS 'Value' UNION ALL SELECT 'Time Zone' AS 'Name', @@global.time_zone AS 'Value' UNION ALL SELECT 'System Time Zone' AS 'Name', @@global.system_time_zone AS 'Value' UNION ALL SELECT 'Time Zone Offset' AS 'Name', TIMEDIFF(NOW(), UTC_TIMESTAMP()) AS 'Value'; SET v_has_innodb = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'InnoDB'), 'NO'), v_has_ndb = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'NDBCluster'), 'NO'), v_has_ps = IFNULL((SELECT SUPPORT FROM information_schema.ENGINES WHERE ENGINE = 'PERFORMANCE_SCHEMA'), 'NO'), v_has_ps_replication = IF(v_has_ps = 'YES' AND EXISTS(SELECT 1 FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'replication_applier_status'), 'YES', 'NO' ), v_has_replication = 'MAYBE', v_has_metrics = IF(v_has_ps = 'YES' OR (sys.version_major() = 5 AND sys.version_minor() = 6), 'YES', 'NO'), v_has_ps_vars = 'NO'; /*!50707 SET v_has_ps_vars = IF(@@global.show_compatibility_56, 'NO', 'YES');*/ /*!50709 SET v_has_ps_vars = 'YES';*/ IF (@sys.debug = 'ON') THEN SELECT v_has_innodb AS 'Has_InnoDB', v_has_ndb AS 'Has_NDBCluster', v_has_ps AS 'Has_Performance_Schema', v_has_ps_vars AS 'Has_P_S_SHOW_Variables', v_has_metrics AS 'Has_metrics', v_has_ps_replication 'AS Has_P_S_Replication', v_has_replication AS 'Has_Replication'; END IF; IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN SET @sys.diagnostics.sql = 'SHOW ENGINE InnoDB STATUS'; PREPARE stmt_innodb_status FROM @sys.diagnostics.sql; END IF; IF (v_has_ps = 'YES') THEN SET @sys.diagnostics.sql = 'SHOW ENGINE PERFORMANCE_SCHEMA STATUS'; PREPARE stmt_ps_status FROM @sys.diagnostics.sql; END IF; IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN SET @sys.diagnostics.sql = 'SHOW ENGINE NDBCLUSTER STATUS'; PREPARE stmt_ndbcluster_status FROM @sys.diagnostics.sql; END IF; SET @sys.diagnostics.sql_gen_query_template = 'SELECT CONCAT( ''SELECT '', GROUP_CONCAT( CASE WHEN (SUBSTRING(TABLE_NAME, 3), COLUMN_NAME) IN ( (''io_global_by_file_by_bytes'', ''total''), (''io_global_by_wait_by_bytes'', ''total_requested'') ) THEN CONCAT(''sys.format_bytes('', COLUMN_NAME, '') AS '', COLUMN_NAME) WHEN SUBSTRING(COLUMN_NAME, -8) = ''_latency'' THEN CONCAT(''format_pico_time('', COLUMN_NAME, '') AS '', COLUMN_NAME) WHEN SUBSTRING(COLUMN_NAME, -7) = ''_memory'' OR SUBSTRING(COLUMN_NAME, -17) = ''_memory_allocated'' OR ((SUBSTRING(COLUMN_NAME, -5) = ''_read'' OR SUBSTRING(COLUMN_NAME, -8) = ''_written'' OR SUBSTRING(COLUMN_NAME, -6) = ''_write'') AND SUBSTRING(COLUMN_NAME, 1, 6) <> ''COUNT_'') THEN CONCAT(''sys.format_bytes('', COLUMN_NAME, '') AS '', COLUMN_NAME) ELSE COLUMN_NAME END ORDER BY ORDINAL_POSITION SEPARATOR '',\n '' ), ''\n FROM tmp_'', SUBSTRING(TABLE_NAME FROM 3), ''_%{OUTPUT}'' ) AS Query INTO @sys.diagnostics.sql_select FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ''sys'' AND TABLE_NAME = ? GROUP BY TABLE_NAME'; SET @sys.diagnostics.sql_gen_query_delta = 'SELECT CONCAT( ''SELECT '', GROUP_CONCAT( CASE WHEN FIND_IN_SET(COLUMN_NAME, diag.pk) THEN COLUMN_NAME WHEN diag.TABLE_NAME = ''io_global_by_file_by_bytes'' AND COLUMN_NAME = ''write_pct'' THEN CONCAT(''IFNULL(ROUND(100-(((e.total_read-IFNULL(s.total_read, 0))'', ''/NULLIF(((e.total_read-IFNULL(s.total_read, 0))+(e.total_written-IFNULL(s.total_written, 0))), 0))*100), 2), 0.00) AS '', COLUMN_NAME) WHEN (diag.TABLE_NAME, COLUMN_NAME) IN ( (''io_global_by_file_by_bytes'', ''total''), (''io_global_by_wait_by_bytes'', ''total_requested'') ) THEN CONCAT(''sys.format_bytes(e.'', COLUMN_NAME, ''-IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME) WHEN SUBSTRING(COLUMN_NAME, 1, 4) IN (''max_'', ''min_'') AND SUBSTRING(COLUMN_NAME, -8) = ''_latency'' THEN CONCAT(''format_pico_time(e.'', COLUMN_NAME, '') AS '', COLUMN_NAME) WHEN COLUMN_NAME = ''avg_latency'' THEN CONCAT(''format_pico_time((e.total_latency - IFNULL(s.total_latency, 0))'', ''/NULLIF(e.total - IFNULL(s.total, 0), 0)) AS '', COLUMN_NAME) WHEN SUBSTRING(COLUMN_NAME, -12) = ''_avg_latency'' THEN CONCAT(''format_pico_time((e.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''_latency - IFNULL(s.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''_latency, 0))'', ''/NULLIF(e.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''s - IFNULL(s.'', SUBSTRING(COLUMN_NAME FROM 1 FOR CHAR_LENGTH(COLUMN_NAME)-12), ''s, 0), 0)) AS '', COLUMN_NAME) WHEN SUBSTRING(COLUMN_NAME, -8) = ''_latency'' THEN CONCAT(''format_pico_time(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME) WHEN COLUMN_NAME IN (''avg_read'', ''avg_write'', ''avg_written'') THEN CONCAT(''sys.format_bytes(IFNULL((e.total_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''written''), ''-IFNULL(s.total_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''written''), '', 0))'', ''/NULLIF(e.count_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''write''), ''-IFNULL(s.count_'', IF(COLUMN_NAME = ''avg_read'', ''read'', ''write''), '', 0), 0), 0)) AS '', COLUMN_NAME) WHEN SUBSTRING(COLUMN_NAME, -7) = ''_memory'' OR SUBSTRING(COLUMN_NAME, -17) = ''_memory_allocated'' OR ((SUBSTRING(COLUMN_NAME, -5) = ''_read'' OR SUBSTRING(COLUMN_NAME, -8) = ''_written'' OR SUBSTRING(COLUMN_NAME, -6) = ''_write'') AND SUBSTRING(COLUMN_NAME, 1, 6) <> ''COUNT_'') THEN CONCAT(''sys.format_bytes(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME) ELSE CONCAT(''(e.'', COLUMN_NAME, '' - IFNULL(s.'', COLUMN_NAME, '', 0)) AS '', COLUMN_NAME) END ORDER BY ORDINAL_POSITION SEPARATOR '',\n '' ), ''\n FROM tmp_'', diag.TABLE_NAME, ''_end e LEFT OUTER JOIN tmp_'', diag.TABLE_NAME, ''_start s USING ('', diag.pk, '')'' ) AS Query INTO @sys.diagnostics.sql_select FROM tmp_sys_views_delta diag INNER JOIN information_schema.COLUMNS c ON c.TABLE_NAME = CONCAT(''x$'', diag.TABLE_NAME) WHERE c.TABLE_SCHEMA = ''sys'' AND diag.TABLE_NAME = ? GROUP BY diag.TABLE_NAME'; IF (v_has_ps = 'YES') THEN DROP TEMPORARY TABLE IF EXISTS tmp_sys_views_delta; CREATE TEMPORARY TABLE tmp_sys_views_delta ( TABLE_NAME varchar(64) NOT NULL, order_by text COMMENT 'ORDER BY clause for the initial and overall views', order_by_delta text COMMENT 'ORDER BY clause for the delta views', where_delta text COMMENT 'WHERE clause to use for delta views to only include rows with a "count" > 0', limit_rows int unsigned COMMENT 'The maximum number of rows to include for the view', pk varchar(128) COMMENT 'Used with the FIND_IN_SET() function so use comma separated list without whitespace', PRIMARY KEY (TABLE_NAME) ); IF (@sys.debug = 'ON') THEN SELECT 'Populating tmp_sys_views_delta' AS 'Debug'; END IF; INSERT INTO tmp_sys_views_delta VALUES ('host_summary' , '%{TABLE}.statement_latency DESC', '(e.statement_latency-IFNULL(s.statement_latency, 0)) DESC', '(e.statements - IFNULL(s.statements, 0)) > 0', NULL, 'host'), ('host_summary_by_file_io' , '%{TABLE}.io_latency DESC', '(e.io_latency-IFNULL(s.io_latency, 0)) DESC', '(e.ios - IFNULL(s.ios, 0)) > 0', NULL, 'host'), ('host_summary_by_file_io_type' , '%{TABLE}.host, %{TABLE}.total_latency DESC', 'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event_name'), ('host_summary_by_stages' , '%{TABLE}.host, %{TABLE}.total_latency DESC', 'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event_name'), ('host_summary_by_statement_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host'), ('host_summary_by_statement_type' , '%{TABLE}.host, %{TABLE}.total_latency DESC', 'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,statement'), ('io_by_thread_by_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,thread_id,processlist_id'), ('io_global_by_file_by_bytes' , '%{TABLE}.total DESC', '(e.total-IFNULL(s.total, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', 100, 'file'), ('io_global_by_file_by_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', 100, 'file'), ('io_global_by_wait_by_bytes' , '%{TABLE}.total_requested DESC', '(e.total_requested-IFNULL(s.total_requested, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_name'), ('io_global_by_wait_by_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_name'), ('schema_index_statistics' , '(%{TABLE}.select_latency+%{TABLE}.insert_latency+%{TABLE}.update_latency+%{TABLE}.delete_latency) DESC', '((e.select_latency+e.insert_latency+e.update_latency+e.delete_latency)-IFNULL(s.select_latency+s.insert_latency+s.update_latency+s.delete_latency, 0)) DESC', '((e.rows_selected+e.insert_latency+e.rows_updated+e.rows_deleted)-IFNULL(s.rows_selected+s.rows_inserted+s.rows_updated+s.rows_deleted, 0)) > 0', 100, 'table_schema,table_name,index_name'), ('schema_table_statistics' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) > 0', 100, 'table_schema,table_name'), ('schema_tables_with_full_table_scans', '%{TABLE}.rows_full_scanned DESC', '(e.rows_full_scanned-IFNULL(s.rows_full_scanned, 0)) DESC', '(e.rows_full_scanned-IFNULL(s.rows_full_scanned, 0)) > 0', 100, 'object_schema,object_name'), ('user_summary' , '%{TABLE}.statement_latency DESC', '(e.statement_latency-IFNULL(s.statement_latency, 0)) DESC', '(e.statements - IFNULL(s.statements, 0)) > 0', NULL, 'user'), ('user_summary_by_file_io' , '%{TABLE}.io_latency DESC', '(e.io_latency-IFNULL(s.io_latency, 0)) DESC', '(e.ios - IFNULL(s.ios, 0)) > 0', NULL, 'user'), ('user_summary_by_file_io_type' , '%{TABLE}.user, %{TABLE}.latency DESC', 'e.user, (e.latency-IFNULL(s.latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event_name'), ('user_summary_by_stages' , '%{TABLE}.user, %{TABLE}.total_latency DESC', 'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event_name'), ('user_summary_by_statement_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user'), ('user_summary_by_statement_type' , '%{TABLE}.user, %{TABLE}.total_latency DESC', 'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,statement'), ('wait_classes_global_by_avg_latency' , 'IFNULL(%{TABLE}.total_latency / NULLIF(%{TABLE}.total, 0), 0) DESC', 'IFNULL((e.total_latency-IFNULL(s.total_latency, 0)) / NULLIF((e.total - IFNULL(s.total, 0)), 0), 0) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_class'), ('wait_classes_global_by_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'event_class'), ('waits_by_host_by_latency' , '%{TABLE}.host, %{TABLE}.total_latency DESC', 'e.host, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'host,event'), ('waits_by_user_by_latency' , '%{TABLE}.user, %{TABLE}.total_latency DESC', 'e.user, (e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'user,event'), ('waits_global_by_latency' , '%{TABLE}.total_latency DESC', '(e.total_latency-IFNULL(s.total_latency, 0)) DESC', '(e.total - IFNULL(s.total, 0)) > 0', NULL, 'events') ; END IF; SELECT ' ======================= Configuration ======================= ' AS ''; SELECT 'GLOBAL VARIABLES' AS 'The following output is:'; IF (v_has_ps_vars = 'YES') THEN SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value FROM performance_schema.global_variables ORDER BY VARIABLE_NAME; ELSE SELECT LOWER(VARIABLE_NAME) AS Variable_name, VARIABLE_VALUE AS Variable_value FROM information_schema.GLOBAL_VARIABLES ORDER BY VARIABLE_NAME; END IF; IF (v_has_ps = 'YES') THEN SELECT 'Performance Schema Setup - Actors' AS 'The following output is:'; SELECT * FROM performance_schema.setup_actors; SELECT 'Performance Schema Setup - Consumers' AS 'The following output is:'; SELECT NAME AS Consumer, ENABLED, sys.ps_is_consumer_enabled(NAME) AS COLLECTS FROM performance_schema.setup_consumers; SELECT 'Performance Schema Setup - Instruments' AS 'The following output is:'; SELECT SUBSTRING_INDEX(NAME, '/', 2) AS 'InstrumentClass', ROUND(100*SUM(IF(ENABLED = 'YES', 1, 0))/COUNT(*), 2) AS 'EnabledPct', ROUND(100*SUM(IF(TIMED = 'YES', 1, 0))/COUNT(*), 2) AS 'TimedPct' FROM performance_schema.setup_instruments GROUP BY SUBSTRING_INDEX(NAME, '/', 2) ORDER BY SUBSTRING_INDEX(NAME, '/', 2); SELECT 'Performance Schema Setup - Objects' AS 'The following output is:'; SELECT * FROM performance_schema.setup_objects; SELECT 'Performance Schema Setup - Threads' AS 'The following output is:'; SELECT `TYPE` AS ThreadType, COUNT(*) AS 'Total', ROUND(100*SUM(IF(INSTRUMENTED = 'YES', 1, 0))/COUNT(*), 2) AS 'InstrumentedPct' FROM performance_schema.threads GROUP BY TYPE; END IF; IF (v_has_replication = 'NO') THEN SELECT 'No Replication Configured' AS 'Replication Status'; ELSE SELECT CONCAT('Replication Configured: ', v_has_replication, ' - Performance Schema Replication Tables: ', v_has_ps_replication) AS 'Replication Status'; IF (v_has_ps_replication = 'YES') THEN SELECT 'Replication - Connection Configuration' AS 'The following output is:'; SELECT * FROM performance_schema.replication_connection_configuration/*!50706 ORDER BY CHANNEL_NAME*/; END IF; IF (v_has_ps_replication = 'YES') THEN SELECT 'Replication - Applier Configuration' AS 'The following output is:'; SELECT * FROM performance_schema.replication_applier_configuration ORDER BY CHANNEL_NAME; END IF; END IF; IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN SELECT 'Cluster Thread Blocks' AS 'The following output is:'; SELECT * FROM ndbinfo.threadblocks; END IF; IF (v_has_ps = 'YES') THEN IF (@sys.diagnostics.include_raw = 'ON') THEN SELECT ' ======================== Initial Status ======================== ' AS ''; END IF; DROP TEMPORARY TABLE IF EXISTS tmp_digests_start; CALL sys.statement_performance_analyzer('create_tmp', 'tmp_digests_start', NULL); CALL sys.statement_performance_analyzer('snapshot', NULL, NULL); CALL sys.statement_performance_analyzer('save', 'tmp_digests_start', NULL); IF (@sys.diagnostics.include_raw = 'ON') THEN SET @sys.diagnostics.sql = REPLACE(@sys.diagnostics.sql_gen_query_template, '%{OUTPUT}', 'start'); IF (@sys.debug = 'ON') THEN SELECT 'The following query will be used to generate the query for each sys view' AS 'Debug'; SELECT @sys.diagnostics.sql AS 'Debug'; END IF; PREPARE stmt_gen_query FROM @sys.diagnostics.sql; END IF; SET v_done = FALSE; OPEN c_sysviews_w_delta; c_sysviews_w_delta_loop: LOOP FETCH c_sysviews_w_delta INTO v_table_name; IF v_done THEN LEAVE c_sysviews_w_delta_loop; END IF; IF (@sys.debug = 'ON') THEN SELECT CONCAT('The following queries are for storing the initial content of ', v_table_name) AS 'Debug'; END IF; CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS `tmp_', v_table_name, '_start`')); CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE `tmp_', v_table_name, '_start` SELECT * FROM `sys`.`x$', v_table_name, '`')); IF (@sys.diagnostics.include_raw = 'ON') THEN SET @sys.diagnostics.table_name = CONCAT('x$', v_table_name); EXECUTE stmt_gen_query USING @sys.diagnostics.table_name; SELECT CONCAT(@sys.diagnostics.sql_select, IF(order_by IS NOT NULL, CONCAT('\n ORDER BY ', REPLACE(order_by, '%{TABLE}', CONCAT('tmp_', v_table_name, '_start'))), ''), IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '') ) INTO @sys.diagnostics.sql_select FROM tmp_sys_views_delta WHERE TABLE_NAME = v_table_name; SELECT CONCAT('Initial ', v_table_name) AS 'The following output is:'; CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select); END IF; END LOOP; CLOSE c_sysviews_w_delta; IF (@sys.diagnostics.include_raw = 'ON') THEN DEALLOCATE PREPARE stmt_gen_query; END IF; END IF; SET v_sql_status_summary_select = 'SELECT Variable_name', v_sql_status_summary_delta = '', v_sql_status_summary_from = ''; REPEAT SET v_output_count = v_output_count + 1; IF (v_output_count > 1) THEN SET v_sleep = in_interval-(UNIX_TIMESTAMP(NOW(2))-v_iter_start); SELECT NOW() AS 'Time', CONCAT('Going to sleep for ', v_sleep, ' seconds. Please do not interrupt') AS 'The following output is:'; DO SLEEP(in_interval); END IF; SET v_iter_start = UNIX_TIMESTAMP(NOW(2)); SELECT NOW(), CONCAT('Iteration Number ', IFNULL(v_output_count, 'NULL')) AS 'The following output is:'; IF (@@log_bin = 1) THEN SELECT 'SHOW MASTER STATUS' AS 'The following output is:'; SHOW MASTER STATUS; END IF; IF (v_has_replication <> 'NO') THEN SELECT 'SHOW SLAVE STATUS' AS 'The following output is:'; SHOW SLAVE STATUS; END IF; SET v_table_name = CONCAT('tmp_metrics_', v_output_count); CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS ', v_table_name)); CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE ', v_table_name, ' ( Variable_name VARCHAR(193) NOT NULL, Variable_value VARCHAR(1024), Type VARCHAR(100) NOT NULL, Enabled ENUM(''YES'', ''NO'', ''PARTIAL'') NOT NULL, PRIMARY KEY (Type, Variable_name) ) ENGINE = InnoDB DEFAULT CHARSET=utf8')); IF (v_has_metrics) THEN SET @sys.diagnostics.sql = CONCAT( 'INSERT INTO ', v_table_name, ' SELECT Variable_name, REPLACE(Variable_value, ''\n'', ''\\\\n'') AS Variable_value, Type, Enabled FROM sys.metrics' ); ELSE SET @sys.diagnostics.sql = CONCAT( 'INSERT INTO ', v_table_name, '(SELECT LOWER(VARIABLE_NAME) AS Variable_name, REPLACE(VARIABLE_VALUE, ''\n'', ''\\\\n'') AS Variable_value, ''Global Status'' AS Type, ''YES'' AS Enabled FROM performance_schema.global_status ) UNION ALL ( SELECT NAME AS Variable_name, COUNT AS Variable_value, CONCAT(''InnoDB Metrics - '', SUBSYSTEM) AS Type, IF(STATUS = ''enabled'', ''YES'', ''NO'') AS Enabled FROM information_schema.INNODB_METRICS WHERE NAME NOT IN ( ''lock_row_lock_time'', ''lock_row_lock_time_avg'', ''lock_row_lock_time_max'', ''lock_row_lock_waits'', ''buffer_pool_reads'', ''buffer_pool_read_requests'', ''buffer_pool_write_requests'', ''buffer_pool_wait_free'', ''buffer_pool_read_ahead'', ''buffer_pool_read_ahead_evicted'', ''buffer_pool_pages_total'', ''buffer_pool_pages_misc'', ''buffer_pool_pages_data'', ''buffer_pool_bytes_data'', ''buffer_pool_pages_dirty'', ''buffer_pool_bytes_dirty'', ''buffer_pool_pages_free'', ''buffer_pages_created'', ''buffer_pages_written'', ''buffer_pages_read'', ''buffer_data_reads'', ''buffer_data_written'', ''file_num_open_files'', ''os_log_bytes_written'', ''os_log_fsyncs'', ''os_log_pending_fsyncs'', ''os_log_pending_writes'', ''log_waits'', ''log_write_requests'', ''log_writes'', ''innodb_dblwr_writes'', ''innodb_dblwr_pages_written'', ''innodb_page_size'') ) UNION ALL ( SELECT ''NOW()'' AS Variable_name, NOW(3) AS Variable_value, ''System Time'' AS Type, ''YES'' AS Enabled ) UNION ALL ( SELECT ''UNIX_TIMESTAMP()'' AS Variable_name, ROUND(UNIX_TIMESTAMP(NOW(3)), 3) AS Variable_value, ''System Time'' AS Type, ''YES'' AS Enabled ) ORDER BY Type, Variable_name;' ); END IF; CALL sys.execute_prepared_stmt(@sys.diagnostics.sql); CALL sys.execute_prepared_stmt( CONCAT('SELECT Variable_value INTO @sys.diagnostics.output_time FROM ', v_table_name, ' WHERE Type = ''System Time'' AND Variable_name = ''UNIX_TIMESTAMP()''') ); SET v_output_time = @sys.diagnostics.output_time; SET v_sql_status_summary_select = CONCAT(v_sql_status_summary_select, ', CONCAT( LEFT(s', v_output_count, '.Variable_value, ', v_status_summary_width, '), IF(', REPLACE(v_no_delta_names, '%{COUNT}', v_output_count), ' AND s', v_output_count, '.Variable_value REGEXP ''^[0-9]+(\\\\.[0-9]+)?$'', CONCAT('' ('', ROUND(s', v_output_count, '.Variable_value/', v_output_time, ', 2), ''/sec)''), '''') ) AS ''Output ', v_output_count, ''''), v_sql_status_summary_from = CONCAT(v_sql_status_summary_from, ' ', IF(v_output_count = 1, ' FROM ', ' INNER JOIN '), v_table_name, ' s', v_output_count, IF (v_output_count = 1, '', ' USING (Type, Variable_name)')); IF (v_output_count > 1) THEN SET v_sql_status_summary_delta = CONCAT(v_sql_status_summary_delta, ', IF(', REPLACE(v_no_delta_names, '%{COUNT}', v_output_count), ' AND s', (v_output_count-1), '.Variable_value REGEXP ''^[0-9]+(\\\\.[0-9]+)?$'' AND s', v_output_count, '.Variable_value REGEXP ''^[0-9]+(\\\\.[0-9]+)?$'', CONCAT(IF(s', (v_output_count-1), '.Variable_value REGEXP ''^[0-9]+\\\\.[0-9]+$'' OR s', v_output_count, '.Variable_value REGEXP ''^[0-9]+\\\\.[0-9]+$'', ROUND((s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value), 2), (s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value) ), '' ('', ROUND((s', v_output_count, '.Variable_value-s', (v_output_count-1), '.Variable_value)/(', v_output_time, '-', v_output_time_prev, '), 2), ''/sec)'' ), '''' ) AS ''Delta (', (v_output_count-1), ' -> ', v_output_count, ')'''); END IF; SET v_output_time_prev = v_output_time; IF (@sys.diagnostics.include_raw = 'ON') THEN IF (v_has_metrics) THEN SELECT 'SELECT * FROM sys.metrics' AS 'The following output is:'; ELSE SELECT 'sys.metrics equivalent' AS 'The following output is:'; END IF; CALL sys.execute_prepared_stmt(CONCAT('SELECT Type, Variable_name, Enabled, Variable_value FROM ', v_table_name, ' ORDER BY Type, Variable_name')); END IF; IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN SELECT 'SHOW ENGINE INNODB STATUS' AS 'The following output is:'; EXECUTE stmt_innodb_status; SELECT 'InnoDB - Transactions' AS 'The following output is:'; SELECT * FROM information_schema.INNODB_TRX; END IF; IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN SELECT 'SHOW ENGINE NDBCLUSTER STATUS' AS 'The following output is:'; EXECUTE stmt_ndbcluster_status; SELECT 'ndbinfo.memoryusage' AS 'The following output is:'; SELECT node_id, memory_type, sys.format_bytes(used) AS used, used_pages, sys.format_bytes(total) AS total, total_pages, ROUND(100*(used/total), 2) AS 'Used %' FROM ndbinfo.memoryusage; SET v_done = FALSE; OPEN c_ndbinfo; c_ndbinfo_loop: LOOP FETCH c_ndbinfo INTO v_table_name; IF v_done THEN LEAVE c_ndbinfo_loop; END IF; SELECT CONCAT('SELECT * FROM ndbinfo.', v_table_name) AS 'The following output is:'; CALL sys.execute_prepared_stmt(CONCAT('SELECT * FROM `ndbinfo`.`', v_table_name, '`')); END LOOP; CLOSE c_ndbinfo; SELECT * FROM information_schema.FILES; END IF; SELECT 'SELECT * FROM sys.processlist' AS 'The following output is:'; SELECT processlist.* FROM sys.processlist; IF (v_has_ps = 'YES') THEN IF (sys.ps_is_consumer_enabled('events_waits_history_long') = 'YES') THEN SELECT 'SELECT * FROM sys.latest_file_io' AS 'The following output is:'; SELECT * FROM sys.latest_file_io; END IF; IF (EXISTS(SELECT 1 FROM performance_schema.setup_instruments WHERE NAME LIKE 'memory/%' AND ENABLED = 'YES')) THEN SELECT 'SELECT * FROM sys.memory_by_host_by_current_bytes' AS 'The following output is:'; SELECT * FROM sys.memory_by_host_by_current_bytes; SELECT 'SELECT * FROM sys.memory_by_thread_by_current_bytes' AS 'The following output is:'; SELECT * FROM sys.memory_by_thread_by_current_bytes; SELECT 'SELECT * FROM sys.memory_by_user_by_current_bytes' AS 'The following output is:'; SELECT * FROM sys.memory_by_user_by_current_bytes; SELECT 'SELECT * FROM sys.memory_global_by_current_bytes' AS 'The following output is:'; SELECT * FROM sys.memory_global_by_current_bytes; END IF; END IF; SET v_runtime = (UNIX_TIMESTAMP(NOW(2)) - v_start); UNTIL (v_runtime + in_interval >= in_max_runtime) END REPEAT; IF (v_has_ps = 'YES') THEN SELECT 'SHOW ENGINE PERFORMANCE_SCHEMA STATUS' AS 'The following output is:'; EXECUTE stmt_ps_status; END IF; IF (v_has_innodb IN ('DEFAULT', 'YES')) THEN DEALLOCATE PREPARE stmt_innodb_status; END IF; IF (v_has_ps = 'YES') THEN DEALLOCATE PREPARE stmt_ps_status; END IF; IF (v_has_ndb IN ('DEFAULT', 'YES')) THEN DEALLOCATE PREPARE stmt_ndbcluster_status; END IF; SELECT ' ============================ Schema Information ============================ ' AS ''; SELECT COUNT(*) AS 'Total Number of Tables' FROM information_schema.TABLES; IF (@sys.diagnostics.allow_i_s_tables = 'ON') THEN SELECT 'Storage Engine Usage' AS 'The following output is:'; SELECT ENGINE, COUNT(*) AS NUM_TABLES, sys.format_bytes(SUM(DATA_LENGTH)) AS DATA_LENGTH, sys.format_bytes(SUM(INDEX_LENGTH)) AS INDEX_LENGTH, sys.format_bytes(SUM(DATA_LENGTH+INDEX_LENGTH)) AS TOTAL FROM information_schema.TABLES GROUP BY ENGINE; SELECT 'Schema Object Overview' AS 'The following output is:'; SELECT * FROM sys.schema_object_overview; SELECT 'Tables without a PRIMARY KEY' AS 'The following output is:'; SELECT TABLES.TABLE_SCHEMA, ENGINE, COUNT(*) AS NumTables FROM information_schema.TABLES LEFT OUTER JOIN information_schema.STATISTICS ON STATISTICS.TABLE_SCHEMA = TABLES.TABLE_SCHEMA AND STATISTICS.TABLE_NAME = TABLES.TABLE_NAME AND STATISTICS.INDEX_NAME = 'PRIMARY' WHERE STATISTICS.TABLE_NAME IS NULL AND TABLES.TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys') AND TABLES.TABLE_TYPE = 'BASE TABLE' GROUP BY TABLES.TABLE_SCHEMA, ENGINE; END IF; IF (v_has_ps = 'YES') THEN SELECT 'Unused Indexes' AS 'The following output is:'; SELECT object_schema, COUNT(*) AS NumUnusedIndexes FROM performance_schema.table_io_waits_summary_by_index_usage WHERE index_name IS NOT NULL AND count_star = 0 AND object_schema NOT IN ('mysql', 'sys') AND index_name != 'PRIMARY' GROUP BY object_schema; END IF; IF (v_has_ps = 'YES') THEN SELECT ' ========================= Overall Status ========================= ' AS ''; SELECT 'CALL sys.ps_statement_avg_latency_histogram()' AS 'The following output is:'; CALL sys.ps_statement_avg_latency_histogram(); CALL sys.statement_performance_analyzer('snapshot', NULL, NULL); CALL sys.statement_performance_analyzer('overall', NULL, 'with_runtimes_in_95th_percentile'); SET @sys.diagnostics.sql = REPLACE(@sys.diagnostics.sql_gen_query_template, '%{OUTPUT}', 'end'); IF (@sys.debug = 'ON') THEN SELECT 'The following query will be used to generate the query for each sys view' AS 'Debug'; SELECT @sys.diagnostics.sql AS 'Debug'; END IF; PREPARE stmt_gen_query FROM @sys.diagnostics.sql; SET v_done = FALSE; OPEN c_sysviews_w_delta; c_sysviews_w_delta_loop: LOOP FETCH c_sysviews_w_delta INTO v_table_name; IF v_done THEN LEAVE c_sysviews_w_delta_loop; END IF; IF (@sys.debug = 'ON') THEN SELECT CONCAT('The following queries are for storing the final content of ', v_table_name) AS 'Debug'; END IF; CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS `tmp_', v_table_name, '_end`')); CALL sys.execute_prepared_stmt(CONCAT('CREATE TEMPORARY TABLE `tmp_', v_table_name, '_end` SELECT * FROM `sys`.`x$', v_table_name, '`')); IF (@sys.diagnostics.include_raw = 'ON') THEN SET @sys.diagnostics.table_name = CONCAT('x$', v_table_name); EXECUTE stmt_gen_query USING @sys.diagnostics.table_name; SELECT CONCAT(@sys.diagnostics.sql_select, IF(order_by IS NOT NULL, CONCAT('\n ORDER BY ', REPLACE(order_by, '%{TABLE}', CONCAT('tmp_', v_table_name, '_end'))), ''), IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '') ) INTO @sys.diagnostics.sql_select FROM tmp_sys_views_delta WHERE TABLE_NAME = v_table_name; SELECT CONCAT('Overall ', v_table_name) AS 'The following output is:'; CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select); END IF; END LOOP; CLOSE c_sysviews_w_delta; DEALLOCATE PREPARE stmt_gen_query; SELECT ' ====================== Delta Status ====================== ' AS ''; CALL sys.statement_performance_analyzer('delta', 'tmp_digests_start', 'with_runtimes_in_95th_percentile'); CALL sys.statement_performance_analyzer('cleanup', NULL, NULL); DROP TEMPORARY TABLE tmp_digests_start; IF (@sys.debug = 'ON') THEN SELECT 'The following query will be used to generate the query for each sys view delta' AS 'Debug'; SELECT @sys.diagnostics.sql_gen_query_delta AS 'Debug'; END IF; PREPARE stmt_gen_query_delta FROM @sys.diagnostics.sql_gen_query_delta; SET v_old_group_concat_max_len = @@session.group_concat_max_len; SET @@session.group_concat_max_len = 2048; SET v_done = FALSE; OPEN c_sysviews_w_delta; c_sysviews_w_delta_loop: LOOP FETCH c_sysviews_w_delta INTO v_table_name; IF v_done THEN LEAVE c_sysviews_w_delta_loop; END IF; SET @sys.diagnostics.table_name = v_table_name; EXECUTE stmt_gen_query_delta USING @sys.diagnostics.table_name; SELECT CONCAT(@sys.diagnostics.sql_select, IF(where_delta IS NOT NULL, CONCAT('\n WHERE ', where_delta), ''), IF(order_by_delta IS NOT NULL, CONCAT('\n ORDER BY ', order_by_delta), ''), IF(limit_rows IS NOT NULL, CONCAT('\n LIMIT ', limit_rows), '') ) INTO @sys.diagnostics.sql_select FROM tmp_sys_views_delta WHERE TABLE_NAME = v_table_name; SELECT CONCAT('Delta ', v_table_name) AS 'The following output is:'; CALL sys.execute_prepared_stmt(@sys.diagnostics.sql_select); CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE `tmp_', v_table_name, '_end`')); CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE `tmp_', v_table_name, '_start`')); END LOOP; CLOSE c_sysviews_w_delta; SET @@session.group_concat_max_len = v_old_group_concat_max_len; DEALLOCATE PREPARE stmt_gen_query_delta; DROP TEMPORARY TABLE tmp_sys_views_delta; END IF; IF (v_has_metrics) THEN SELECT 'SELECT * FROM sys.metrics' AS 'The following output is:'; ELSE SELECT 'sys.metrics equivalent' AS 'The following output is:'; END IF; CALL sys.execute_prepared_stmt( CONCAT(v_sql_status_summary_select, v_sql_status_summary_delta, ', Type, s1.Enabled', v_sql_status_summary_from, ' ORDER BY Type, Variable_name' ) ); SET v_count = 0; WHILE (v_count < v_output_count) DO SET v_count = v_count + 1; SET v_table_name = CONCAT('tmp_metrics_', v_count); CALL sys.execute_prepared_stmt(CONCAT('DROP TEMPORARY TABLE IF EXISTS ', v_table_name)); END WHILE; IF (in_auto_config <> 'current') THEN CALL sys.ps_setup_reload_saved(); SET sql_log_bin = @log_bin; END IF; SET @sys.diagnostics.output_time = NULL, @sys.diagnostics.sql = NULL, @sys.diagnostics.sql_gen_query_delta = NULL, @sys.diagnostics.sql_gen_query_template = NULL, @sys.diagnostics.sql_select = NULL, @sys.diagnostics.table_name = NULL; IF (v_this_thread_enabled = 'YES') THEN CALL sys.ps_setup_enable_thread(CONNECTION_ID()); END IF; IF (@log_bin = 1) THEN SET sql_log_bin = @log_bin; END IF; END$$ DROP PROCEDURE IF EXISTS optimizer_switch_choice; DROP PROCEDURE IF EXISTS optimizer_switch_on; DROP PROCEDURE IF EXISTS optimizer_switch_off; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE optimizer_switch_choice(IN on_off VARCHAR(3)) COMMENT 'return @@optimizer_switch options as a result set for easier readability' SQL SECURITY INVOKER NOT DETERMINISTIC CONTAINS SQL BEGIN DECLARE tmp VARCHAR(1024); DECLARE opt VARCHAR(1024); DECLARE start INT; DECLARE end INT; DECLARE pos INT; set tmp=concat(@@optimizer_switch,","); CREATE OR REPLACE TEMPORARY TABLE tmp_opt_switch (a varchar(64), opt CHAR(3)) character set latin1 engine=heap; set start=1; FIND_OPTIONS: LOOP set pos= INSTR(SUBSTR(tmp, start), ","); if (pos = 0) THEN LEAVE FIND_OPTIONS; END IF; set opt= MID(tmp, start, pos-1); set end= INSTR(opt, "="); insert into tmp_opt_switch values(LEFT(opt,end-1),SUBSTR(opt,end+1)); set start=start + pos; END LOOP; SELECT t.a as "option",t.opt from tmp_opt_switch as t where t.opt = on_off order by a; DROP TEMPORARY TABLE tmp_opt_switch; END$$ CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE optimizer_switch_on() COMMENT 'return @@optimizer_switch options that are on' SQL SECURITY INVOKER NOT DETERMINISTIC CONTAINS SQL BEGIN call optimizer_switch_choice("on"); END$$ CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE optimizer_switch_off() COMMENT 'return @@optimizer_switch options that are off' SQL SECURITY INVOKER NOT DETERMINISTIC CONTAINS SQL BEGIN call optimizer_switch_choice("off"); END$$ DROP PROCEDURE IF EXISTS ps_statement_avg_latency_histogram; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_statement_avg_latency_histogram () COMMENT ' Description Outputs a textual histogram graph of the average latency values across all normalized queries tracked within the Performance Schema events_statements_summary_by_digest table. Can be used to show a very high level picture of what kind of latency distribution statements running within this instance have. Parameters None. Example mysql> CALL sys.ps_statement_avg_latency_histogram()\\G *************************** 1. row *************************** Performance Schema Statement Digest Average Latency Histogram: . = 1 unit * = 2 units # = 3 units (0 - 38ms) 240 | ################################################################################ (38 - 77ms) 38 | ...................................... (77 - 115ms) 3 | ... (115 - 154ms) 62 | ******************************* (154 - 192ms) 3 | ... (192 - 231ms) 0 | (231 - 269ms) 0 | (269 - 307ms) 0 | (307 - 346ms) 0 | (346 - 384ms) 1 | . (384 - 423ms) 1 | . (423 - 461ms) 0 | (461 - 499ms) 0 | (499 - 538ms) 0 | (538 - 576ms) 0 | (576 - 615ms) 1 | . Total Statements: 350; Buckets: 16; Bucket Size: 38 ms; ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN SELECT CONCAT('\n', '\n . = 1 unit', '\n * = 2 units', '\n # = 3 units\n', @label := CONCAT(@label_inner := CONCAT('\n(0 - ', ROUND((@bucket_size := (SELECT ROUND((MAX(avg_us) - MIN(avg_us)) / (@buckets := 16)) AS size FROM sys.x$ps_digest_avg_latency_distribution)) / (@unit_div := 1000)), (@unit := 'ms'), ')'), REPEAT(' ', (@max_label_size := ((1 + LENGTH(ROUND((@bucket_size * 15) / @unit_div)) + 3 + LENGTH(ROUND(@bucket_size * 16) / @unit_div)) + 1)) - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us <= @bucket_size), 0)), REPEAT(' ', (@max_label_len := (@max_label_size + LENGTH((@total_queries := (SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution)))) + 1) - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < (@one_unit := 40), '.', IF(@count_in_bucket < (@two_unit := 80), '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND(@bucket_size / @unit_div), ' - ', ROUND((@bucket_size * 2) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size AND b1.avg_us <= @bucket_size * 2), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 2) / @unit_div), ' - ', ROUND((@bucket_size * 3) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 2 AND b1.avg_us <= @bucket_size * 3), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 3) / @unit_div), ' - ', ROUND((@bucket_size * 4) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 3 AND b1.avg_us <= @bucket_size * 4), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 4) / @unit_div), ' - ', ROUND((@bucket_size * 5) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 4 AND b1.avg_us <= @bucket_size * 5), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 5) / @unit_div), ' - ', ROUND((@bucket_size * 6) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 5 AND b1.avg_us <= @bucket_size * 6), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 6) / @unit_div), ' - ', ROUND((@bucket_size * 7) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 6 AND b1.avg_us <= @bucket_size * 7), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 7) / @unit_div), ' - ', ROUND((@bucket_size * 8) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 7 AND b1.avg_us <= @bucket_size * 8), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 8) / @unit_div), ' - ', ROUND((@bucket_size * 9) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 8 AND b1.avg_us <= @bucket_size * 9), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 9) / @unit_div), ' - ', ROUND((@bucket_size * 10) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 9 AND b1.avg_us <= @bucket_size * 10), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 10) / @unit_div), ' - ', ROUND((@bucket_size * 11) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 10 AND b1.avg_us <= @bucket_size * 11), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 11) / @unit_div), ' - ', ROUND((@bucket_size * 12) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 11 AND b1.avg_us <= @bucket_size * 12), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 12) / @unit_div), ' - ', ROUND((@bucket_size * 13) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 12 AND b1.avg_us <= @bucket_size * 13), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 13) / @unit_div), ' - ', ROUND((@bucket_size * 14) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 13 AND b1.avg_us <= @bucket_size * 14), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 14) / @unit_div), ' - ', ROUND((@bucket_size * 15) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 14 AND b1.avg_us <= @bucket_size * 15), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), @label := CONCAT(@label_inner := CONCAT('\n(', ROUND((@bucket_size * 15) / @unit_div), ' - ', ROUND((@bucket_size * 16) / @unit_div), @unit, ')'), REPEAT(' ', @max_label_size - LENGTH(@label_inner)), @count_in_bucket := IFNULL((SELECT SUM(cnt) FROM sys.x$ps_digest_avg_latency_distribution AS b1 WHERE b1.avg_us > @bucket_size * 15 AND b1.avg_us <= @bucket_size * 16), 0)), REPEAT(' ', @max_label_len - LENGTH(@label)), '| ', IFNULL(REPEAT(IF(@count_in_bucket < @one_unit, '.', IF(@count_in_bucket < @two_unit, '*', '#')), IF(@count_in_bucket < @one_unit, @count_in_bucket, IF(@count_in_bucket < @two_unit, @count_in_bucket / 2, @count_in_bucket / 3))), ''), '\n\n Total Statements: ', @total_queries, '; Buckets: ', @buckets , '; Bucket Size: ', ROUND(@bucket_size / @unit_div) , ' ', @unit, ';\n' ) AS `Performance Schema Statement Digest Average Latency Histogram`; END $$ DROP PROCEDURE IF EXISTS ps_trace_statement_digest; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_trace_statement_digest ( IN in_digest VARCHAR(32), IN in_runtime INT, IN in_interval DECIMAL(2,2), IN in_start_fresh BOOLEAN, IN in_auto_enable BOOLEAN ) COMMENT ' Description Traces all instrumentation within Performance Schema for a specific Statement Digest. When finding a statement of interest within the performance_schema.events_statements_summary_by_digest table, feed the DIGEST MD5 value in to this procedure, set how long to poll for, and at what interval to poll, and it will generate a report of all statistics tracked within Performance Schema for that digest for the interval. It will also attempt to generate an EXPLAIN for the longest running example of the digest during the interval. Note this may fail, as: * Performance Schema truncates long SQL_TEXT values (and hence the EXPLAIN will fail due to parse errors) * the default schema is sys (so tables that are not fully qualified in the query may not be found) * some queries such as SHOW are not supported in EXPLAIN. When the EXPLAIN fails, the error will be ignored and no EXPLAIN output generated. Requires the SUPER privilege for "SET sql_log_bin = 0;". Parameters in_digest (VARCHAR(32)): The statement digest identifier you would like to analyze in_runtime (INT): The number of seconds to run analysis for in_interval (DECIMAL(2,2)): The interval (in seconds, may be fractional) at which to try and take snapshots in_start_fresh (BOOLEAN): Whether to TRUNCATE the events_statements_history_long and events_stages_history_long tables before starting in_auto_enable (BOOLEAN): Whether to automatically turn on required consumers Example mysql> call ps_trace_statement_digest(\'891ec6860f98ba46d89dd20b0c03652c\', 10, 0.1, true, true); +--------------------+ | SUMMARY STATISTICS | +--------------------+ | SUMMARY STATISTICS | +--------------------+ 1 row in set (9.11 sec) +------------+-----------+-----------+-----------+---------------+------------+------------+ | executions | exec_time | lock_time | rows_sent | rows_examined | tmp_tables | full_scans | +------------+-----------+-----------+-----------+---------------+------------+------------+ | 21 | 4.11 ms | 2.00 ms | 0 | 21 | 0 | 0 | +------------+-----------+-----------+-----------+---------------+------------+------------+ 1 row in set (9.11 sec) +------------------------------------------+-------+-----------+ | event_name | count | latency | +------------------------------------------+-------+-----------+ | stage/sql/checking query cache for query | 16 | 724.37 us | | stage/sql/statistics | 16 | 546.92 us | | stage/sql/freeing items | 18 | 520.11 us | | stage/sql/init | 51 | 466.80 us | ... | stage/sql/cleaning up | 18 | 11.92 us | | stage/sql/executing | 16 | 6.95 us | +------------------------------------------+-------+-----------+ 17 rows in set (9.12 sec) +---------------------------+ | LONGEST RUNNING STATEMENT | +---------------------------+ | LONGEST RUNNING STATEMENT | +---------------------------+ 1 row in set (9.16 sec) +-----------+-----------+-----------+-----------+---------------+------------+-----------+ | thread_id | exec_time | lock_time | rows_sent | rows_examined | tmp_tables | full_scan | +-----------+-----------+-----------+-----------+---------------+------------+-----------+ | 166646 | 618.43 us | 1.00 ms | 0 | 1 | 0 | 0 | +-----------+-----------+-----------+-----------+---------------+------------+-----------+ 1 row in set (9.16 sec) // Truncated for clarity... +-----------------------------------------------------------------+ | sql_text | +-----------------------------------------------------------------+ | select hibeventhe0_.id as id1382_, hibeventhe0_.createdTime ... | +-----------------------------------------------------------------+ 1 row in set (9.17 sec) +------------------------------------------+-----------+ | event_name | latency | +------------------------------------------+-----------+ | stage/sql/init | 8.61 us | | stage/sql/Waiting for query cache lock | 453.23 us | | stage/sql/init | 331.07 ns | | stage/sql/checking query cache for query | 43.04 us | ... | stage/sql/freeing items | 30.46 us | | stage/sql/cleaning up | 662.13 ns | +------------------------------------------+-----------+ 18 rows in set (9.23 sec) +----+-------------+--------------+-------+---------------+-----------+---------+-------------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------------+-------+---------------+-----------+---------+-------------+------+-------+ | 1 | SIMPLE | hibeventhe0_ | const | fixedTime | fixedTime | 775 | const,const | 1 | NULL | +----+-------------+--------------+-------+---------------+-----------+---------+-------------+------+-------+ 1 row in set (9.27 sec) Query OK, 0 rows affected (9.28 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE v_start_fresh BOOLEAN DEFAULT false; DECLARE v_auto_enable BOOLEAN DEFAULT false; DECLARE v_explain BOOLEAN DEFAULT true; DECLARE v_this_thread_enabed ENUM('YES', 'NO'); DECLARE v_runtime INT DEFAULT 0; DECLARE v_start INT DEFAULT 0; DECLARE v_found_stmts INT; SET @log_bin := @@sql_log_bin; SET sql_log_bin = 0; SELECT INSTRUMENTED INTO v_this_thread_enabed FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID(); CALL sys.ps_setup_disable_thread(CONNECTION_ID()); DROP TEMPORARY TABLE IF EXISTS stmt_trace; CREATE TEMPORARY TABLE stmt_trace ( thread_id BIGINT UNSIGNED, timer_start BIGINT UNSIGNED, event_id BIGINT UNSIGNED, sql_text longtext, timer_wait BIGINT UNSIGNED, lock_time BIGINT UNSIGNED, errors BIGINT UNSIGNED, mysql_errno INT, rows_sent BIGINT UNSIGNED, rows_affected BIGINT UNSIGNED, rows_examined BIGINT UNSIGNED, created_tmp_tables BIGINT UNSIGNED, created_tmp_disk_tables BIGINT UNSIGNED, no_index_used BIGINT UNSIGNED, PRIMARY KEY (thread_id, timer_start) ); DROP TEMPORARY TABLE IF EXISTS stmt_stages; CREATE TEMPORARY TABLE stmt_stages ( event_id BIGINT UNSIGNED, stmt_id BIGINT UNSIGNED, event_name VARCHAR(128), timer_wait BIGINT UNSIGNED, PRIMARY KEY (event_id) ); SET v_start_fresh = in_start_fresh; IF v_start_fresh THEN TRUNCATE TABLE performance_schema.events_statements_history_long; TRUNCATE TABLE performance_schema.events_stages_history_long; END IF; SET v_auto_enable = in_auto_enable; IF v_auto_enable THEN CALL sys.ps_setup_save(0); UPDATE performance_schema.threads SET INSTRUMENTED = IF(PROCESSLIST_ID IS NOT NULL, 'YES', 'NO'); UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME NOT LIKE '%\_history' AND NAME NOT LIKE 'events_wait%' AND NAME NOT LIKE 'events_transactions%' AND NAME <> 'statements_digest'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES' WHERE NAME LIKE 'statement/%' OR NAME LIKE 'stage/%'; END IF; WHILE v_runtime < in_runtime DO SELECT UNIX_TIMESTAMP() INTO v_start; INSERT IGNORE INTO stmt_trace SELECT thread_id, timer_start, event_id, sql_text, timer_wait, lock_time, errors, mysql_errno, rows_sent, rows_affected, rows_examined, created_tmp_tables, created_tmp_disk_tables, no_index_used FROM performance_schema.events_statements_history_long WHERE digest = in_digest; INSERT IGNORE INTO stmt_stages SELECT stages.event_id, stmt_trace.event_id, stages.event_name, stages.timer_wait FROM performance_schema.events_stages_history_long AS stages JOIN stmt_trace ON stages.nesting_event_id = stmt_trace.event_id; SELECT SLEEP(in_interval) INTO @sleep; SET v_runtime = v_runtime + (UNIX_TIMESTAMP() - v_start); END WHILE; SELECT "SUMMARY STATISTICS"; SELECT COUNT(*) executions, format_pico_time(SUM(timer_wait)) AS exec_time, format_pico_time(SUM(lock_time)) AS lock_time, SUM(rows_sent) AS rows_sent, SUM(rows_affected) AS rows_affected, SUM(rows_examined) AS rows_examined, SUM(created_tmp_tables) AS tmp_tables, SUM(no_index_used) AS full_scans FROM stmt_trace; SELECT event_name, COUNT(*) as count, format_pico_time(SUM(timer_wait)) as latency FROM stmt_stages GROUP BY event_name ORDER BY SUM(timer_wait) DESC; SELECT "LONGEST RUNNING STATEMENT"; SELECT thread_id, format_pico_time(timer_wait) AS exec_time, format_pico_time(lock_time) AS lock_time, rows_sent, rows_affected, rows_examined, created_tmp_tables AS tmp_tables, no_index_used AS full_scan FROM stmt_trace ORDER BY timer_wait DESC LIMIT 1; SELECT sql_text FROM stmt_trace ORDER BY timer_wait DESC LIMIT 1; SELECT sql_text, event_id INTO @sql, @sql_id FROM stmt_trace ORDER BY timer_wait DESC LIMIT 1; IF (@sql_id IS NOT NULL) THEN SELECT event_name, format_pico_time(timer_wait) as latency FROM stmt_stages WHERE stmt_id = @sql_id ORDER BY event_id; END IF; DROP TEMPORARY TABLE stmt_trace; DROP TEMPORARY TABLE stmt_stages; IF (@sql IS NOT NULL) THEN SET @stmt := CONCAT("EXPLAIN FORMAT=JSON ", @sql); BEGIN DECLARE CONTINUE HANDLER FOR 1064, 1146 SET v_explain = false; PREPARE explain_stmt FROM @stmt; END; IF (v_explain) THEN EXECUTE explain_stmt; DEALLOCATE PREPARE explain_stmt; END IF; END IF; IF v_auto_enable THEN CALL sys.ps_setup_reload_saved(); END IF; IF (v_this_thread_enabed = 'YES') THEN CALL sys.ps_setup_enable_thread(CONNECTION_ID()); END IF; SET sql_log_bin = @log_bin; END$$ DROP PROCEDURE IF EXISTS ps_trace_thread; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_trace_thread ( IN in_thread_id BIGINT UNSIGNED, IN in_outfile VARCHAR(255), IN in_max_runtime DECIMAL(20,2), IN in_interval DECIMAL(20,2), IN in_start_fresh BOOLEAN, IN in_auto_setup BOOLEAN, IN in_debug BOOLEAN ) COMMENT ' Description Dumps all data within Performance Schema for an instrumented thread, to create a DOT formatted graph file. Each resultset returned from the procedure should be used for a complete graph Requires the SUPER privilege for "SET sql_log_bin = 0;". Parameters in_thread_id (BIGINT UNSIGNED): The thread that you would like a stack trace for in_outfile (VARCHAR(255)): The filename the dot file will be written to in_max_runtime (DECIMAL(20,2)): The maximum time to keep collecting data. Use NULL to get the default which is 60 seconds. in_interval (DECIMAL(20,2)): How long to sleep between data collections. Use NULL to get the default which is 1 second. in_start_fresh (BOOLEAN): Whether to reset all Performance Schema data before tracing. in_auto_setup (BOOLEAN): Whether to disable all other threads and enable all consumers/instruments. This will also reset the settings at the end of the run. in_debug (BOOLEAN): Whether you would like to include file:lineno in the graph Example mysql> CALL sys.ps_trace_thread(25, CONCAT(\'/tmp/stack-\', REPLACE(NOW(), \' \', \'-\'), \'.dot\'), NULL, NULL, TRUE, TRUE, TRUE); +-------------------+ | summary | +-------------------+ | Disabled 1 thread | +-------------------+ 1 row in set (0.00 sec) +---------------------------------------------+ | Info | +---------------------------------------------+ | Data collection starting for THREAD_ID = 25 | +---------------------------------------------+ 1 row in set (0.03 sec) +-----------------------------------------------------------+ | Info | +-----------------------------------------------------------+ | Stack trace written to /tmp/stack-2014-02-16-21:18:41.dot | +-----------------------------------------------------------+ 1 row in set (60.07 sec) +-------------------------------------------------------------------+ | Convert to PDF | +-------------------------------------------------------------------+ | dot -Tpdf -o /tmp/stack_25.pdf /tmp/stack-2014-02-16-21:18:41.dot | +-------------------------------------------------------------------+ 1 row in set (60.07 sec) +-------------------------------------------------------------------+ | Convert to PNG | +-------------------------------------------------------------------+ | dot -Tpng -o /tmp/stack_25.png /tmp/stack-2014-02-16-21:18:41.dot | +-------------------------------------------------------------------+ 1 row in set (60.07 sec) +------------------+ | summary | +------------------+ | Enabled 1 thread | +------------------+ 1 row in set (60.32 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE v_done bool DEFAULT FALSE; DECLARE v_start, v_runtime DECIMAL(20,2) DEFAULT 0.0; DECLARE v_min_event_id bigint unsigned DEFAULT 0; DECLARE v_this_thread_enabed ENUM('YES', 'NO'); DECLARE v_event longtext; DECLARE c_stack CURSOR FOR SELECT CONCAT(IF(nesting_event_id IS NOT NULL, CONCAT(nesting_event_id, ' -> '), ''), event_id, '; ', event_id, ' [label="', '(', format_pico_time(timer_wait), ') ', IF (event_name NOT LIKE 'wait/io%', SUBSTRING_INDEX(event_name, '/', -2), IF (event_name NOT LIKE 'wait/io/file%' OR event_name NOT LIKE 'wait/io/socket%', SUBSTRING_INDEX(event_name, '/', -4), event_name) ), IF (event_name LIKE 'statement/%', IFNULL(CONCAT('\\n', wait_info), ''), ''), IF (in_debug AND event_name LIKE 'wait%', wait_info, ''), '", ', CASE WHEN event_name LIKE 'wait/io/file%' THEN 'shape=box, style=filled, color=red' WHEN event_name LIKE 'wait/io/table%' THEN 'shape=box, style=filled, color=green' WHEN event_name LIKE 'wait/io/socket%' THEN 'shape=box, style=filled, color=yellow' WHEN event_name LIKE 'wait/synch/mutex%' THEN 'style=filled, color=lightskyblue' WHEN event_name LIKE 'wait/synch/cond%' THEN 'style=filled, color=darkseagreen3' WHEN event_name LIKE 'wait/synch/rwlock%' THEN 'style=filled, color=orchid' WHEN event_name LIKE 'wait/lock%' THEN 'shape=box, style=filled, color=tan' WHEN event_name LIKE 'statement/%' THEN CONCAT('shape=box, style=bold', CASE WHEN event_name LIKE 'statement/com/%' THEN ' style=filled, color=darkseagreen' ELSE IF((timer_wait/1000000000000) > @@log_slow_query_time, ' style=filled, color=red', ' style=filled, color=lightblue') END ) WHEN event_name LIKE 'stage/%' THEN 'style=filled, color=slategray3' WHEN event_name LIKE '%idle%' THEN 'shape=box, style=filled, color=firebrick3' ELSE '' END, '];\n' ) event, event_id FROM ( (SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, CONCAT(sql_text, '\\n', 'errors: ', errors, '\\n', 'warnings: ', warnings, '\\n', 'lock time: ', format_pico_time(lock_time),'\\n', 'rows affected: ', rows_affected, '\\n', 'rows sent: ', rows_sent, '\\n', 'rows examined: ', rows_examined, '\\n', 'tmp tables: ', created_tmp_tables, '\\n', 'tmp disk tables: ', created_tmp_disk_tables, '\\n' 'select scan: ', select_scan, '\\n', 'select full join: ', select_full_join, '\\n', 'select full range join: ', select_full_range_join, '\\n', 'select range: ', select_range, '\\n', 'select range check: ', select_range_check, '\\n', 'sort merge passes: ', sort_merge_passes, '\\n', 'sort rows: ', sort_rows, '\\n', 'sort range: ', sort_range, '\\n', 'sort scan: ', sort_scan, '\\n', 'no index used: ', IF(no_index_used, 'TRUE', 'FALSE'), '\\n', 'no good index used: ', IF(no_good_index_used, 'TRUE', 'FALSE'), '\\n' ) AS wait_info FROM performance_schema.events_statements_history_long WHERE thread_id = in_thread_id AND event_id > v_min_event_id) UNION (SELECT thread_id, event_id, event_name, timer_wait, timer_start, nesting_event_id, null AS wait_info FROM performance_schema.events_stages_history_long WHERE thread_id = in_thread_id AND event_id > v_min_event_id) UNION (SELECT thread_id, event_id, CONCAT(event_name, IF(event_name NOT LIKE 'wait/synch/mutex%', IFNULL(CONCAT(' - ', operation), ''), ''), IF(number_of_bytes IS NOT NULL, CONCAT(' ', number_of_bytes, ' bytes'), ''), IF(event_name LIKE 'wait/io/file%', '\\n', ''), IF(object_schema IS NOT NULL, CONCAT('\\nObject: ', object_schema, '.'), ''), IF(object_name IS NOT NULL, IF (event_name LIKE 'wait/io/socket%', CONCAT('\\n', IF (object_name LIKE ':0%', @@socket, object_name)), object_name), '' ), IF(index_name IS NOT NULL, CONCAT(' Index: ', index_name), ''), '\\n' ) AS event_name, timer_wait, timer_start, nesting_event_id, source AS wait_info FROM performance_schema.events_waits_history_long WHERE thread_id = in_thread_id AND event_id > v_min_event_id) ) events ORDER BY event_id; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SET @log_bin := @@sql_log_bin; SET sql_log_bin = 0; SELECT INSTRUMENTED INTO v_this_thread_enabed FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID(); CALL sys.ps_setup_disable_thread(CONNECTION_ID()); IF (in_auto_setup) THEN CALL sys.ps_setup_save(0); DELETE FROM performance_schema.setup_actors; UPDATE performance_schema.threads SET INSTRUMENTED = IF(THREAD_ID = in_thread_id, 'YES', 'NO'); UPDATE performance_schema.setup_consumers SET ENABLED = 'YES' WHERE NAME NOT LIKE '%\_history'; UPDATE performance_schema.setup_instruments SET ENABLED = 'YES', TIMED = 'YES'; END IF; IF (in_start_fresh) THEN TRUNCATE performance_schema.events_statements_history_long; TRUNCATE performance_schema.events_stages_history_long; TRUNCATE performance_schema.events_waits_history_long; END IF; DROP TEMPORARY TABLE IF EXISTS tmp_events; CREATE TEMPORARY TABLE tmp_events ( event_id bigint unsigned NOT NULL, event longblob, PRIMARY KEY (event_id) ); INSERT INTO tmp_events VALUES (0, CONCAT('digraph events { rankdir=LR; nodesep=0.10;\n', '// Stack created .....: ', NOW(), '\n', '// MySQL version .....: ', VERSION(), '\n', '// MySQL hostname ....: ', @@hostname, '\n', '// MySQL port ........: ', @@port, '\n', '// MySQL socket ......: ', @@socket, '\n', '// MySQL user ........: ', CURRENT_USER(), '\n')); SELECT CONCAT('Data collection starting for THREAD_ID = ', in_thread_id) AS 'Info'; SET v_min_event_id = 0, v_start = UNIX_TIMESTAMP(), in_interval = IFNULL(in_interval, 1.00), in_max_runtime = IFNULL(in_max_runtime, 60.00); WHILE (v_runtime < in_max_runtime AND (SELECT INSTRUMENTED FROM performance_schema.threads WHERE THREAD_ID = in_thread_id) = 'YES') DO SET v_done = FALSE; OPEN c_stack; c_stack_loop: LOOP FETCH c_stack INTO v_event, v_min_event_id; IF v_done THEN LEAVE c_stack_loop; END IF; IF (LENGTH(v_event) > 0) THEN INSERT INTO tmp_events VALUES (v_min_event_id, v_event); END IF; END LOOP; CLOSE c_stack; SELECT SLEEP(in_interval) INTO @sleep; SET v_runtime = (UNIX_TIMESTAMP() - v_start); END WHILE; INSERT INTO tmp_events VALUES (v_min_event_id+1, '}'); SET @query = CONCAT('SELECT event FROM tmp_events ORDER BY event_id INTO OUTFILE ''', in_outfile, ''' FIELDS ESCAPED BY '''' LINES TERMINATED BY '''''); PREPARE stmt_output FROM @query; EXECUTE stmt_output; DEALLOCATE PREPARE stmt_output; SELECT CONCAT('Stack trace written to ', in_outfile) AS 'Info'; SELECT CONCAT('dot -Tpdf -o /tmp/stack_', in_thread_id, '.pdf ', in_outfile) AS 'Convert to PDF'; SELECT CONCAT('dot -Tpng -o /tmp/stack_', in_thread_id, '.png ', in_outfile) AS 'Convert to PNG'; DROP TEMPORARY TABLE tmp_events; IF (in_auto_setup) THEN CALL sys.ps_setup_reload_saved(); END IF; IF (v_this_thread_enabed = 'YES') THEN CALL sys.ps_setup_enable_thread(CONNECTION_ID()); END IF; SET sql_log_bin = @log_bin; END$$ DROP PROCEDURE IF EXISTS ps_setup_disable_background_threads; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_disable_background_threads () COMMENT ' Description Disable all background thread instrumentation within Performance Schema. Parameters None. Example mysql> CALL sys.ps_setup_disable_background_threads(); +--------------------------------+ | summary | +--------------------------------+ | Disabled 18 background threads | +--------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.threads SET instrumented = 'NO' WHERE type = 'BACKGROUND'; SELECT CONCAT('Disabled ', @rows := ROW_COUNT(), ' background thread', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_disable_consumer; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_disable_consumer ( IN consumer VARCHAR(128) ) COMMENT ' Description Disables consumers within Performance Schema matching the input pattern. Parameters consumer (VARCHAR(128)): A LIKE pattern match (using "%consumer%") of consumers to disable Example To disable all consumers: mysql> CALL sys.ps_setup_disable_consumer(\'\'); +--------------------------+ | summary | +--------------------------+ | Disabled 15 consumers | +--------------------------+ 1 row in set (0.02 sec) To disable just the event_stage consumers: mysql> CALL sys.ps_setup_disable_comsumers(\'stage\'); +------------------------+ | summary | +------------------------+ | Disabled 3 consumers | +------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.setup_consumers SET enabled = 'NO' WHERE name LIKE CONCAT('%', consumer, '%'); SELECT CONCAT('Disabled ', @rows := ROW_COUNT(), ' consumer', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_disable_instrument; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_disable_instrument ( IN in_pattern VARCHAR(128) ) COMMENT ' Description Disables instruments within Performance Schema matching the input pattern. Parameters in_pattern (VARCHAR(128)): A LIKE pattern match (using "%in_pattern%") of events to disable Example To disable all mutex instruments: mysql> CALL sys.ps_setup_disable_instrument(\'wait/synch/mutex\'); +--------------------------+ | summary | +--------------------------+ | Disabled 155 instruments | +--------------------------+ 1 row in set (0.02 sec) To disable just a specific TCP/IP based network IO instrument: mysql> CALL sys.ps_setup_disable_instrument(\'wait/io/socket/sql/server_tcpip_socket\'); +------------------------+ | summary | +------------------------+ | Disabled 1 instruments | +------------------------+ 1 row in set (0.00 sec) To disable all instruments: mysql> CALL sys.ps_setup_disable_instrument(\'\'); +--------------------------+ | summary | +--------------------------+ | Disabled 547 instruments | +--------------------------+ 1 row in set (0.01 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.setup_instruments SET enabled = 'NO', timed = 'NO' WHERE name LIKE CONCAT('%', in_pattern, '%'); SELECT CONCAT('Disabled ', @rows := ROW_COUNT(), ' instrument', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_disable_thread; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_disable_thread ( IN in_connection_id BIGINT ) COMMENT ' Description Disable the given connection/thread in Performance Schema. Parameters in_connection_id (BIGINT): The connection ID (PROCESSLIST_ID from performance_schema.threads or the ID shown within SHOW PROCESSLIST) Example mysql> CALL sys.ps_setup_disable_thread(3); +-------------------+ | summary | +-------------------+ | Disabled 1 thread | +-------------------+ 1 row in set (0.01 sec) To disable the current connection: mysql> CALL sys.ps_setup_disable_thread(CONNECTION_ID()); +-------------------+ | summary | +-------------------+ | Disabled 1 thread | +-------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.threads SET instrumented = 'NO' WHERE processlist_id = in_connection_id; SELECT CONCAT('Disabled ', @rows := ROW_COUNT(), ' thread', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_enable_background_threads; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_enable_background_threads () COMMENT ' Description Enable all background thread instrumentation within Performance Schema. Parameters None. Example mysql> CALL sys.ps_setup_enable_background_threads(); +-------------------------------+ | summary | +-------------------------------+ | Enabled 18 background threads | +-------------------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.threads SET instrumented = 'YES' WHERE type = 'BACKGROUND'; SELECT CONCAT('Enabled ', @rows := ROW_COUNT(), ' background thread', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_enable_consumer; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_enable_consumer ( IN consumer VARCHAR(128) ) COMMENT ' Description Enables consumers within Performance Schema matching the input pattern. Parameters consumer (VARCHAR(128)): A LIKE pattern match (using "%consumer%") of consumers to enable Example To enable all consumers: mysql> CALL sys.ps_setup_enable_consumer(\'\'); +-------------------------+ | summary | +-------------------------+ | Enabled 10 consumers | +-------------------------+ 1 row in set (0.02 sec) Query OK, 0 rows affected (0.02 sec) To enable just "waits" consumers: mysql> CALL sys.ps_setup_enable_consumer(\'waits\'); +-----------------------+ | summary | +-----------------------+ | Enabled 3 consumers | +-----------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.setup_consumers SET enabled = 'YES' WHERE name LIKE CONCAT('%', consumer, '%'); SELECT CONCAT('Enabled ', @rows := ROW_COUNT(), ' consumer', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_enable_instrument; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_enable_instrument ( IN in_pattern VARCHAR(128) ) COMMENT ' Description Enables instruments within Performance Schema matching the input pattern. Parameters in_pattern (VARCHAR(128)): A LIKE pattern match (using "%in_pattern%") of events to enable Example To enable all mutex instruments: mysql> CALL sys.ps_setup_enable_instrument(\'wait/synch/mutex\'); +-------------------------+ | summary | +-------------------------+ | Enabled 155 instruments | +-------------------------+ 1 row in set (0.02 sec) Query OK, 0 rows affected (0.02 sec) To enable just a specific TCP/IP based network IO instrument: mysql> CALL sys.ps_setup_enable_instrument(\'wait/io/socket/sql/server_tcpip_socket\'); +-----------------------+ | summary | +-----------------------+ | Enabled 1 instruments | +-----------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) To enable all instruments: mysql> CALL sys.ps_setup_enable_instrument(\'\'); +-------------------------+ | summary | +-------------------------+ | Enabled 547 instruments | +-------------------------+ 1 row in set (0.01 sec) Query OK, 0 rows affected (0.01 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.setup_instruments SET enabled = 'YES', timed = 'YES' WHERE name LIKE CONCAT('%', in_pattern, '%'); SELECT CONCAT('Enabled ', @rows := ROW_COUNT(), ' instrument', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_enable_thread; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_enable_thread ( IN in_connection_id BIGINT ) COMMENT ' Description Enable the given connection/thread in Performance Schema. Parameters in_connection_id (BIGINT): The connection ID (PROCESSLIST_ID from performance_schema.threads or the ID shown within SHOW PROCESSLIST) Example mysql> CALL sys.ps_setup_enable_thread(3); +------------------+ | summary | +------------------+ | Enabled 1 thread | +------------------+ 1 row in set (0.01 sec) To enable the current connection: mysql> CALL sys.ps_setup_enable_thread(CONNECTION_ID()); +------------------+ | summary | +------------------+ | Enabled 1 thread | +------------------+ 1 row in set (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN UPDATE performance_schema.threads SET instrumented = 'YES' WHERE processlist_id = in_connection_id; SELECT CONCAT('Enabled ', @rows := ROW_COUNT(), ' thread', IF(@rows != 1, 's', '')) AS summary; END$$ DROP PROCEDURE IF EXISTS ps_setup_reload_saved; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_reload_saved () COMMENT ' Description Reloads a saved Performance Schema configuration, so that you can alter the setup for debugging purposes, but restore it to a previous state. Use the companion procedure - ps_setup_save(), to save a configuration. Requires the SUPER privilege for "SET sql_log_bin = 0;". Parameters None. Example mysql> CALL sys.ps_setup_save(); Query OK, 0 rows affected (0.08 sec) mysql> UPDATE performance_schema.setup_instruments SET enabled = \'YES\', timed = \'YES\'; Query OK, 547 rows affected (0.40 sec) Rows matched: 784 Changed: 547 Warnings: 0 /* Run some tests that need more detailed instrumentation here */ mysql> CALL sys.ps_setup_reload_saved(); Query OK, 0 rows affected (0.32 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE v_done bool DEFAULT FALSE; DECLARE v_lock_result INT; DECLARE v_lock_used_by BIGINT; DECLARE v_signal_message TEXT; DECLARE EXIT HANDLER FOR SQLEXCEPTION BEGIN SIGNAL SQLSTATE VALUE '90001' SET MESSAGE_TEXT = 'An error occurred, was sys.ps_setup_save() run before this procedure?'; END; SET @log_bin := @@sql_log_bin; SET sql_log_bin = 0; SELECT IS_USED_LOCK('sys.ps_setup_save') INTO v_lock_used_by; IF (v_lock_used_by != CONNECTION_ID()) THEN SET v_signal_message = CONCAT('The sys.ps_setup_save lock is currently owned by ', v_lock_used_by); SIGNAL SQLSTATE VALUE '90002' SET MESSAGE_TEXT = v_signal_message; END IF; DELETE FROM performance_schema.setup_actors; INSERT INTO performance_schema.setup_actors SELECT * FROM tmp_setup_actors; BEGIN DECLARE v_name varchar(64); DECLARE v_enabled enum('YES', 'NO'); DECLARE c_consumers CURSOR FOR SELECT NAME, ENABLED FROM tmp_setup_consumers; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SET v_done = FALSE; OPEN c_consumers; c_consumers_loop: LOOP FETCH c_consumers INTO v_name, v_enabled; IF v_done THEN LEAVE c_consumers_loop; END IF; UPDATE performance_schema.setup_consumers SET ENABLED = v_enabled WHERE NAME = v_name; END LOOP; CLOSE c_consumers; END; UPDATE performance_schema.setup_instruments INNER JOIN tmp_setup_instruments USING (NAME) SET performance_schema.setup_instruments.ENABLED = tmp_setup_instruments.ENABLED, performance_schema.setup_instruments.TIMED = tmp_setup_instruments.TIMED; BEGIN DECLARE v_thread_id bigint unsigned; DECLARE v_instrumented enum('YES', 'NO'); DECLARE c_threads CURSOR FOR SELECT THREAD_ID, INSTRUMENTED FROM tmp_threads; DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; SET v_done = FALSE; OPEN c_threads; c_threads_loop: LOOP FETCH c_threads INTO v_thread_id, v_instrumented; IF v_done THEN LEAVE c_threads_loop; END IF; UPDATE performance_schema.threads SET INSTRUMENTED = v_instrumented WHERE THREAD_ID = v_thread_id; END LOOP; CLOSE c_threads; END; UPDATE performance_schema.threads SET INSTRUMENTED = IF(PROCESSLIST_USER IS NOT NULL, sys.ps_is_account_enabled(PROCESSLIST_HOST, PROCESSLIST_USER), 'YES') WHERE THREAD_ID NOT IN (SELECT THREAD_ID FROM tmp_threads); DROP TEMPORARY TABLE tmp_setup_actors; DROP TEMPORARY TABLE tmp_setup_consumers; DROP TEMPORARY TABLE tmp_setup_instruments; DROP TEMPORARY TABLE tmp_threads; SELECT RELEASE_LOCK('sys.ps_setup_save') INTO v_lock_result; SET sql_log_bin = @log_bin; END$$ SET @old_sql_mode = @@session.sql_mode, @@session.sql_mode = ''; DROP PROCEDURE IF EXISTS ps_setup_reset_to_default; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_reset_to_default ( IN in_verbose BOOLEAN ) COMMENT ' Description Resets the Performance Schema setup to the default settings. Parameters in_verbose (BOOLEAN): Whether to print each setup stage (including the SQL) whilst running. Example mysql> CALL sys.ps_setup_reset_to_default(true)\\G *************************** 1. row *************************** status: Resetting: setup_actors DELETE FROM performance_schema.setup_actors WHERE NOT (HOST = \'%\' AND USER = \'%\' AND ROLE = \'%\') 1 row in set (0.00 sec) *************************** 1. row *************************** status: Resetting: setup_actors INSERT IGNORE INTO performance_schema.setup_actors VALUES (\'%\', \'%\', \'%\') 1 row in set (0.00 sec) ... mysql> CALL sys.ps_setup_reset_to_default(false)\\G Query OK, 0 rows affected (0.00 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN SET @query = 'DELETE FROM performance_schema.setup_actors WHERE NOT (HOST = ''%'' AND USER = ''%'' AND ROLE = ''%'')'; IF (in_verbose) THEN SELECT CONCAT('Resetting: setup_actors\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; SET @query = 'INSERT IGNORE INTO performance_schema.setup_actors VALUES (''%'', ''%'', ''%'', ''YES'', ''YES'')'; IF (in_verbose) THEN SELECT CONCAT('Resetting: setup_actors\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; SET @query = 'UPDATE performance_schema.setup_instruments SET ENABLED = sys.ps_is_instrument_default_enabled(NAME), TIMED = sys.ps_is_instrument_default_timed(NAME)'; IF (in_verbose) THEN SELECT CONCAT('Resetting: setup_instruments\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; SET @query = 'UPDATE performance_schema.setup_consumers SET ENABLED = IF(NAME IN (''events_statements_current'', ''events_transactions_current'', ''global_instrumentation'', ''thread_instrumentation'', ''statements_digest''), ''YES'', ''NO'')'; IF (in_verbose) THEN SELECT CONCAT('Resetting: setup_consumers\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; SET @query = 'DELETE FROM performance_schema.setup_objects WHERE NOT (OBJECT_TYPE IN (''EVENT'', ''FUNCTION'', ''PROCEDURE'', ''TABLE'', ''TRIGGER'') AND OBJECT_NAME = ''%'' AND (OBJECT_SCHEMA = ''mysql'' AND ENABLED = ''NO'' AND TIMED = ''NO'' ) OR (OBJECT_SCHEMA = ''performance_schema'' AND ENABLED = ''NO'' AND TIMED = ''NO'' ) OR (OBJECT_SCHEMA = ''information_schema'' AND ENABLED = ''NO'' AND TIMED = ''NO'' ) OR (OBJECT_SCHEMA = ''%'' AND ENABLED = ''YES'' AND TIMED = ''YES''))'; IF (in_verbose) THEN SELECT CONCAT('Resetting: setup_objects\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; SET @query = 'INSERT IGNORE INTO performance_schema.setup_objects VALUES (''EVENT'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ), (''EVENT'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ), (''EVENT'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ), (''EVENT'' , ''%'' , ''%'', ''YES'', ''YES''), (''FUNCTION'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ), (''FUNCTION'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ), (''FUNCTION'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ), (''FUNCTION'' , ''%'' , ''%'', ''YES'', ''YES''), (''PROCEDURE'', ''mysql'' , ''%'', ''NO'' , ''NO'' ), (''PROCEDURE'', ''performance_schema'', ''%'', ''NO'' , ''NO'' ), (''PROCEDURE'', ''information_schema'', ''%'', ''NO'' , ''NO'' ), (''PROCEDURE'', ''%'' , ''%'', ''YES'', ''YES''), (''TABLE'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ), (''TABLE'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ), (''TABLE'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ), (''TABLE'' , ''%'' , ''%'', ''YES'', ''YES''), (''TRIGGER'' , ''mysql'' , ''%'', ''NO'' , ''NO'' ), (''TRIGGER'' , ''performance_schema'', ''%'', ''NO'' , ''NO'' ), (''TRIGGER'' , ''information_schema'', ''%'', ''NO'' , ''NO'' ), (''TRIGGER'' , ''%'' , ''%'', ''YES'', ''YES'')'; IF (in_verbose) THEN SELECT CONCAT('Resetting: setup_objects\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; SET @query = 'UPDATE performance_schema.threads SET INSTRUMENTED = ''YES'''; IF (in_verbose) THEN SELECT CONCAT('Resetting: threads\n', REPLACE(@query, ' ', '')) AS status; END IF; PREPARE reset_stmt FROM @query; EXECUTE reset_stmt; DEALLOCATE PREPARE reset_stmt; END$$ SET @@session.sql_mode = @old_sql_mode; DROP PROCEDURE IF EXISTS ps_setup_save; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_save ( IN in_timeout INT ) COMMENT ' Description Saves the current configuration of Performance Schema, so that you can alter the setup for debugging purposes, but restore it to a previous state. Use the companion procedure - ps_setup_reload_saved(), to restore the saved config. The named lock "sys.ps_setup_save" is taken before the current configuration is saved. If the attempt to get the named lock times out, an error occurs. The lock is released after the settings have been restored by calling ps_setup_reload_saved(). Requires the SUPER privilege for "SET sql_log_bin = 0;". Parameters in_timeout INT The timeout in seconds used when trying to obtain the lock. A negative timeout means infinite timeout. Example mysql> CALL sys.ps_setup_save(-1); Query OK, 0 rows affected (0.08 sec) mysql> UPDATE performance_schema.setup_instruments -> SET enabled = \'YES\', timed = \'YES\'; Query OK, 547 rows affected (0.40 sec) Rows matched: 784 Changed: 547 Warnings: 0 /* Run some tests that need more detailed instrumentation here */ mysql> CALL sys.ps_setup_reload_saved(); Query OK, 0 rows affected (0.32 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE v_lock_result INT; SET @log_bin := @@sql_log_bin; SET sql_log_bin = 0; SELECT GET_LOCK('sys.ps_setup_save', in_timeout) INTO v_lock_result; IF v_lock_result THEN DROP TEMPORARY TABLE IF EXISTS tmp_setup_actors; DROP TEMPORARY TABLE IF EXISTS tmp_setup_consumers; DROP TEMPORARY TABLE IF EXISTS tmp_setup_instruments; DROP TEMPORARY TABLE IF EXISTS tmp_threads; CREATE TEMPORARY TABLE tmp_setup_actors AS SELECT * FROM performance_schema.setup_actors; CREATE TEMPORARY TABLE tmp_setup_consumers AS SELECT * FROM performance_schema.setup_consumers; CREATE TEMPORARY TABLE tmp_setup_instruments AS SELECT * FROM performance_schema.setup_instruments; CREATE TEMPORARY TABLE tmp_threads (THREAD_ID bigint unsigned NOT NULL PRIMARY KEY, INSTRUMENTED enum('YES','NO') NOT NULL); INSERT INTO tmp_threads SELECT THREAD_ID, INSTRUMENTED FROM performance_schema.threads; ELSE SIGNAL SQLSTATE VALUE '90000' SET MESSAGE_TEXT = 'Could not lock the sys.ps_setup_save user lock, another thread has a saved configuration'; END IF; SET sql_log_bin = @log_bin; END$$ DROP PROCEDURE IF EXISTS ps_setup_show_disabled; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_show_disabled ( IN in_show_instruments BOOLEAN, IN in_show_threads BOOLEAN ) COMMENT ' Description Shows all currently disable Performance Schema configuration. Disabled users is only available for MySQL 5.7.6 and later. In earlier versions it was only possible to enable users. Parameters in_show_instruments (BOOLEAN): Whether to print disabled instruments (can print many items) in_show_threads (BOOLEAN): Whether to print disabled threads Example mysql> CALL sys.ps_setup_show_disabled(TRUE, TRUE); +----------------------------+ | performance_schema_enabled | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) +--------------------+ | disabled_users | +--------------------+ | \'mark\'@\'localhost\' | +--------------------+ 1 row in set (0.00 sec) +-------------+----------------------+---------+-------+ | object_type | objects | enabled | timed | +-------------+----------------------+---------+-------+ | EVENT | mysql.% | NO | NO | | EVENT | performance_schema.% | NO | NO | | EVENT | information_schema.% | NO | NO | | FUNCTION | mysql.% | NO | NO | | FUNCTION | performance_schema.% | NO | NO | | FUNCTION | information_schema.% | NO | NO | | PROCEDURE | mysql.% | NO | NO | | PROCEDURE | performance_schema.% | NO | NO | | PROCEDURE | information_schema.% | NO | NO | | TABLE | mysql.% | NO | NO | | TABLE | performance_schema.% | NO | NO | | TABLE | information_schema.% | NO | NO | | TRIGGER | mysql.% | NO | NO | | TRIGGER | performance_schema.% | NO | NO | | TRIGGER | information_schema.% | NO | NO | +-------------+----------------------+---------+-------+ 15 rows in set (0.00 sec) +----------------------------------+ | disabled_consumers | +----------------------------------+ | events_stages_current | | events_stages_history | | events_stages_history_long | | events_statements_history | | events_statements_history_long | | events_transactions_history | | events_transactions_history_long | | events_waits_current | | events_waits_history | | events_waits_history_long | +----------------------------------+ 10 rows in set (0.00 sec) Empty set (0.00 sec) +---------------------------------------------------------------------------------------+-------+ | disabled_instruments | timed | +---------------------------------------------------------------------------------------+-------+ | wait/synch/mutex/sql/TC_LOG_MMAP::LOCK_tc | NO | | wait/synch/mutex/sql/LOCK_des_key_file | NO | | wait/synch/mutex/sql/MYSQL_BIN_LOG::LOCK_commit | NO | ... | memory/sql/servers_cache | NO | | memory/sql/udf_mem | NO | | wait/lock/metadata/sql/mdl | NO | +---------------------------------------------------------------------------------------+-------+ 547 rows in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC READS SQL DATA BEGIN SELECT @@performance_schema AS performance_schema_enabled; /*!50706 SELECT CONCAT('\'', user, '\'@\'', host, '\'') AS disabled_users FROM performance_schema.setup_actors WHERE enabled = 'NO' ORDER BY disabled_users; */ SELECT object_type, CONCAT(object_schema, '.', object_name) AS objects, enabled, timed FROM performance_schema.setup_objects WHERE enabled = 'NO' ORDER BY object_type, objects; SELECT name AS disabled_consumers FROM performance_schema.setup_consumers WHERE enabled = 'NO' ORDER BY disabled_consumers; IF (in_show_threads) THEN SELECT IF(name = 'thread/sql/one_connection', CONCAT(processlist_user, '@', processlist_host), REPLACE(name, 'thread/', '')) AS disabled_threads, TYPE AS thread_type FROM performance_schema.threads WHERE INSTRUMENTED = 'NO' ORDER BY disabled_threads; END IF; IF (in_show_instruments) THEN SELECT name AS disabled_instruments, timed FROM performance_schema.setup_instruments WHERE enabled = 'NO' ORDER BY disabled_instruments; END IF; END$$ DROP PROCEDURE IF EXISTS ps_setup_show_disabled_consumers; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_show_disabled_consumers () COMMENT ' Description Shows all currently disabled consumers. Parameters None Example mysql> CALL sys.ps_setup_show_disabled_consumers(); +---------------------------+ | disabled_consumers | +---------------------------+ | events_statements_current | | global_instrumentation | | thread_instrumentation | | statements_digest | +---------------------------+ 4 rows in set (0.05 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN SELECT name AS disabled_consumers FROM performance_schema.setup_consumers WHERE enabled = 'NO' ORDER BY disabled_consumers; END$$ DROP PROCEDURE IF EXISTS ps_setup_show_disabled_instruments; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_show_disabled_instruments () COMMENT ' Description Shows all currently disabled instruments. Parameters None Example mysql> CALL sys.ps_setup_show_disabled_instruments(); ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN SELECT name AS disabled_instruments, timed FROM performance_schema.setup_instruments WHERE enabled = 'NO' ORDER BY disabled_instruments; END$$ DROP PROCEDURE IF EXISTS ps_setup_show_enabled; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_show_enabled ( IN in_show_instruments BOOLEAN, IN in_show_threads BOOLEAN ) COMMENT ' Description Shows all currently enabled Performance Schema configuration. Parameters in_show_instruments (BOOLEAN): Whether to print enabled instruments (can print many items) in_show_threads (BOOLEAN): Whether to print enabled threads Example mysql> CALL sys.ps_setup_show_enabled(TRUE, TRUE); +----------------------------+ | performance_schema_enabled | +----------------------------+ | 1 | +----------------------------+ 1 row in set (0.00 sec) +---------------+ | enabled_users | +---------------+ | \'%\'@\'%\' | +---------------+ 1 row in set (0.01 sec) +-------------+---------+---------+-------+ | object_type | objects | enabled | timed | +-------------+---------+---------+-------+ | EVENT | %.% | YES | YES | | FUNCTION | %.% | YES | YES | | PROCEDURE | %.% | YES | YES | | TABLE | %.% | YES | YES | | TRIGGER | %.% | YES | YES | +-------------+---------+---------+-------+ 5 rows in set (0.01 sec) +---------------------------+ | enabled_consumers | +---------------------------+ | events_statements_current | | global_instrumentation | | thread_instrumentation | | statements_digest | +---------------------------+ 4 rows in set (0.05 sec) +---------------------------------+-------------+ | enabled_threads | thread_type | +---------------------------------+-------------+ | sql/main | BACKGROUND | | sql/thread_timer_notifier | BACKGROUND | | innodb/io_ibuf_thread | BACKGROUND | | innodb/io_log_thread | BACKGROUND | | innodb/io_read_thread | BACKGROUND | | innodb/io_read_thread | BACKGROUND | | innodb/io_write_thread | BACKGROUND | | innodb/io_write_thread | BACKGROUND | | innodb/page_cleaner_thread | BACKGROUND | | innodb/srv_lock_timeout_thread | BACKGROUND | | innodb/srv_error_monitor_thread | BACKGROUND | | innodb/srv_monitor_thread | BACKGROUND | | innodb/srv_master_thread | BACKGROUND | | innodb/srv_purge_thread | BACKGROUND | | innodb/srv_worker_thread | BACKGROUND | | innodb/srv_worker_thread | BACKGROUND | | innodb/srv_worker_thread | BACKGROUND | | innodb/buf_dump_thread | BACKGROUND | | innodb/dict_stats_thread | BACKGROUND | | sql/signal_handler | BACKGROUND | | sql/compress_gtid_table | FOREGROUND | | root@localhost | FOREGROUND | +---------------------------------+-------------+ 22 rows in set (0.01 sec) +-------------------------------------+-------+ | enabled_instruments | timed | +-------------------------------------+-------+ | wait/io/file/sql/map | YES | | wait/io/file/sql/binlog | YES | ... | statement/com/Error | YES | | statement/com/ | YES | | idle | YES | +-------------------------------------+-------+ 210 rows in set (0.08 sec) Query OK, 0 rows affected (0.89 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN SELECT @@performance_schema AS performance_schema_enabled; SELECT CONCAT('\'', user, '\'@\'', host, '\'') AS enabled_users FROM performance_schema.setup_actors WHERE enabled = 'YES' ORDER BY enabled_users; SELECT object_type, CONCAT(object_schema, '.', object_name) AS objects, enabled, timed FROM performance_schema.setup_objects WHERE enabled = 'YES' ORDER BY object_type, objects; SELECT name AS enabled_consumers FROM performance_schema.setup_consumers WHERE enabled = 'YES' ORDER BY enabled_consumers; IF (in_show_threads) THEN SELECT IF(name = 'thread/sql/one_connection', CONCAT(processlist_user, '@', processlist_host), REPLACE(name, 'thread/', '')) AS enabled_threads, TYPE AS thread_type FROM performance_schema.threads WHERE INSTRUMENTED = 'YES' AND name <> 'thread/innodb/thread_pool_thread' ORDER BY enabled_threads; END IF; IF (in_show_instruments) THEN SELECT name AS enabled_instruments, timed FROM performance_schema.setup_instruments WHERE enabled = 'YES' ORDER BY enabled_instruments; END IF; END$$ DROP PROCEDURE IF EXISTS ps_setup_show_enabled_consumers; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_show_enabled_consumers () COMMENT ' Description Shows all currently enabled consumers. Parameters None Example mysql> CALL sys.ps_setup_show_enabled_consumers(); +---------------------------+ | enabled_consumers | +---------------------------+ | events_statements_current | | global_instrumentation | | thread_instrumentation | | statements_digest | +---------------------------+ 4 rows in set (0.05 sec) ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN SELECT name AS enabled_consumers FROM performance_schema.setup_consumers WHERE enabled = 'YES' ORDER BY enabled_consumers; END$$ DROP PROCEDURE IF EXISTS ps_setup_show_enabled_instruments; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_setup_show_enabled_instruments () COMMENT ' Description Shows all currently enabled instruments. Parameters None Example mysql> CALL sys.ps_setup_show_enabled_instruments(); ' SQL SECURITY INVOKER DETERMINISTIC READS SQL DATA BEGIN SELECT name AS enabled_instruments, timed FROM performance_schema.setup_instruments WHERE enabled = 'YES' ORDER BY enabled_instruments; END$$ DROP PROCEDURE IF EXISTS ps_truncate_all_tables; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE ps_truncate_all_tables ( IN in_verbose BOOLEAN ) COMMENT ' Description Truncates all summary tables within Performance Schema, resetting all aggregated instrumentation as a snapshot. Parameters in_verbose (BOOLEAN): Whether to print each TRUNCATE statement before running Example mysql> CALL sys.ps_truncate_all_tables(false); +---------------------+ | summary | +---------------------+ | Truncated 44 tables | +---------------------+ 1 row in set (0.10 sec) Query OK, 0 rows affected (0.10 sec) ' SQL SECURITY INVOKER DETERMINISTIC MODIFIES SQL DATA BEGIN DECLARE v_done INT DEFAULT FALSE; DECLARE v_total_tables INT DEFAULT 0; DECLARE v_ps_table VARCHAR(64); DECLARE ps_tables CURSOR FOR SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE table_schema = 'performance_schema' AND (table_name LIKE '%summary%' OR table_name LIKE '%history%'); DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = TRUE; OPEN ps_tables; ps_tables_loop: LOOP FETCH ps_tables INTO v_ps_table; IF v_done THEN LEAVE ps_tables_loop; END IF; SET @truncate_stmt := CONCAT('TRUNCATE TABLE performance_schema.', v_ps_table); IF in_verbose THEN SELECT CONCAT('Running: ', @truncate_stmt) AS status; END IF; PREPARE truncate_stmt FROM @truncate_stmt; EXECUTE truncate_stmt; DEALLOCATE PREPARE truncate_stmt; SET v_total_tables = v_total_tables + 1; END LOOP; CLOSE ps_tables; SELECT CONCAT('Truncated ', v_total_tables, ' tables') AS summary; END$$ DROP PROCEDURE IF EXISTS statement_performance_analyzer; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE statement_performance_analyzer ( IN in_action ENUM('snapshot', 'overall', 'delta', 'create_table', 'create_tmp', 'save', 'cleanup'), IN in_table VARCHAR(129), IN in_views SET ('with_runtimes_in_95th_percentile', 'analysis', 'with_errors_or_warnings', 'with_full_table_scans', 'with_sorting', 'with_temp_tables', 'custom') ) COMMENT ' Description Create a report of the statements running on the server. The views are calculated based on the overall and/or delta activity. Requires the SUPER privilege for "SET sql_log_bin = 0;". Parameters in_action (ENUM(''snapshot'', ''overall'', ''delta'', ''create_tmp'', ''create_table'', ''save'', ''cleanup'')): The action to take. Supported actions are: * snapshot Store a snapshot. The default is to make a snapshot of the current content of performance_schema.events_statements_summary_by_digest, but by setting in_table this can be overwritten to copy the content of the specified table. The snapshot is stored in the sys.tmp_digests temporary table. * overall Generate analyzis based on the content specified by in_table. For the overall analyzis, in_table can be NOW() to use a fresh snapshot. This will overwrite an existing snapshot. Use NULL for in_table to use the existing snapshot. If in_table IS NULL and no snapshot exists, a new will be created. See also in_views and @sys.statement_performance_analyzer.limit. * delta Generate a delta analysis. The delta will be calculated between the reference table in in_table and the snapshot. An existing snapshot must exist. The action uses the sys.tmp_digests_delta temporary table. See also in_views and @sys.statement_performance_analyzer.limit. * create_table Create a regular table suitable for storing the snapshot for later use, e.g. for calculating deltas. * create_tmp Create a temporary table suitable for storing the snapshot for later use, e.g. for calculating deltas. * save Save the snapshot in the table specified by in_table. The table must exists and have the correct structure. If no snapshot exists, a new is created. * cleanup Remove the temporary tables used for the snapshot and delta. in_table (VARCHAR(129)): The table argument used for some actions. Use the format ''db1.t1'' or ''t1'' without using any backticks (`) for quoting. Periods (.) are not supported in the database and table names. The meaning of the table for each action supporting the argument is: * snapshot The snapshot is created based on the specified table. Set to NULL or NOW() to use the current content of performance_schema.events_statements_summary_by_digest. * overall The table with the content to create the overall analyzis for. The following values can be used: - A table name - use the content of that table. - NOW() - create a fresh snapshot and overwrite the existing snapshot. - NULL - use the last stored snapshot. * delta The table name is mandatory and specified the reference view to compare the currently stored snapshot against. If no snapshot exists, a new will be created. * create_table The name of the regular table to create. * create_tmp The name of the temporary table to create. * save The name of the table to save the currently stored snapshot into. in_views (SET (''with_runtimes_in_95th_percentile'', ''analysis'', ''with_errors_or_warnings'', ''with_full_table_scans'', ''with_sorting'', ''with_temp_tables'', ''custom'')) Which views to include: * with_runtimes_in_95th_percentile Based on the sys.statements_with_runtimes_in_95th_percentile view * analysis Based on the sys.statement_analysis view * with_errors_or_warnings Based on the sys.statements_with_errors_or_warnings view * with_full_table_scans Based on the sys.statements_with_full_table_scans view * with_sorting Based on the sys.statements_with_sorting view * with_temp_tables Based on the sys.statements_with_temp_tables view * custom Use a custom view. This view must be specified in @sys.statement_performance_analyzer.view to an existing view or a query Default is to include all except ''custom''. Configuration Options sys.statement_performance_analyzer.limit The maximum number of rows to include for the views that does not have a built-in limit (e.g. the 95th percentile view). If not set the limit is 100. sys.statement_performance_analyzer.view Used together with the ''custom'' view. If the value contains a space, it is considered a query, otherwise it must be an existing view querying the performance_schema.events_statements_summary_by_digest table. There cannot be any limit clause including in the query or view definition if @sys.statement_performance_analyzer.limit > 0. If specifying a view, use the same format as for in_table. sys.debug Whether to provide debugging output. Default is ''OFF''. Set to ''ON'' to include. Example To create a report with the queries in the 95th percentile since last truncate of performance_schema.events_statements_summary_by_digest and the delta for a 1 minute period: 1. Create a temporary table to store the initial snapshot. 2. Create the initial snapshot. 3. Save the initial snapshot in the temporary table. 4. Wait one minute. 5. Create a new snapshot. 6. Perform analyzis based on the new snapshot. 7. Perform analyzis based on the delta between the initial and new snapshots. mysql> CALL sys.statement_performance_analyzer(''create_tmp'', ''mydb.tmp_digests_ini'', NULL); Query OK, 0 rows affected (0.08 sec) mysql> CALL sys.statement_performance_analyzer(''snapshot'', NULL, NULL); Query OK, 0 rows affected (0.02 sec) mysql> CALL sys.statement_performance_analyzer(''save'', ''mydb.tmp_digests_ini'', NULL); Query OK, 0 rows affected (0.00 sec) mysql> DO SLEEP(60); Query OK, 0 rows affected (1 min 0.00 sec) mysql> CALL sys.statement_performance_analyzer(''snapshot'', NULL, NULL); Query OK, 0 rows affected (0.02 sec) mysql> CALL sys.statement_performance_analyzer(''overall'', NULL, ''with_runtimes_in_95th_percentile''); +-----------------------------------------+ | Next Output | +-----------------------------------------+ | Queries with Runtime in 95th Percentile | +-----------------------------------------+ 1 row in set (0.05 sec) ... mysql> CALL sys.statement_performance_analyzer(''delta'', ''mydb.tmp_digests_ini'', ''with_runtimes_in_95th_percentile''); +-----------------------------------------+ | Next Output | +-----------------------------------------+ | Queries with Runtime in 95th Percentile | +-----------------------------------------+ 1 row in set (0.03 sec) ... To create an overall report of the 95th percentile queries and the top 10 queries with full table scans: mysql> CALL sys.statement_performance_analyzer(''snapshot'', NULL, NULL); Query OK, 0 rows affected (0.01 sec) mysql> SET @sys.statement_performance_analyzer.limit = 10; Query OK, 0 rows affected (0.00 sec) mysql> CALL sys.statement_performance_analyzer(''overall'', NULL, ''with_runtimes_in_95th_percentile,with_full_table_scans''); +-----------------------------------------+ | Next Output | +-----------------------------------------+ | Queries with Runtime in 95th Percentile | +-----------------------------------------+ 1 row in set (0.01 sec) ... +-------------------------------------+ | Next Output | +-------------------------------------+ | Top 10 Queries with Full Table Scan | +-------------------------------------+ 1 row in set (0.09 sec) ... Use a custom view showing the top 10 query sorted by total execution time refreshing the view every minute using the watch command in Linux. mysql> CREATE OR REPLACE VIEW mydb.my_statements AS -> SELECT sys.format_statement(DIGEST_TEXT) AS query, -> SCHEMA_NAME AS db, -> COUNT_STAR AS exec_count, -> format_pico_time(SUM_TIMER_WAIT) AS total_latency, -> format_pico_time(AVG_TIMER_WAIT) AS avg_latency, -> ROUND(IFNULL(SUM_ROWS_SENT / NULLIF(COUNT_STAR, 0), 0)) AS rows_sent_avg, -> ROUND(IFNULL(SUM_ROWS_EXAMINED / NULLIF(COUNT_STAR, 0), 0)) AS rows_examined_avg, -> ROUND(IFNULL(SUM_ROWS_AFFECTED / NULLIF(COUNT_STAR, 0), 0)) AS rows_affected_avg, -> DIGEST AS digest -> FROM performance_schema.events_statements_summary_by_digest -> ORDER BY SUM_TIMER_WAIT DESC; Query OK, 0 rows affected (0.01 sec) mysql> CALL sys.statement_performance_analyzer(''create_table'', ''mydb.digests_prev'', NULL); Query OK, 0 rows affected (0.10 sec) shell$ watch -n 60 "mysql sys --table -e \" > SET @sys.statement_performance_analyzer.view = ''mydb.my_statements''; > SET @sys.statement_performance_analyzer.limit = 10; > CALL statement_performance_analyzer(''snapshot'', NULL, NULL); > CALL statement_performance_analyzer(''delta'', ''mydb.digests_prev'', ''custom''); > CALL statement_performance_analyzer(''save'', ''mydb.digests_prev'', NULL); > \"" Every 60.0s: mysql sys --table -e " ... Mon Dec 22 10:58:51 2014 +----------------------------------+ | Next Output | +----------------------------------+ | Top 10 Queries Using Custom View | +----------------------------------+ +-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+ | query | db | exec_count | total_latency | avg_latency | rows_sent_avg | rows_examined_avg | rows_affected_avg | digest | +-------------------+-------+------------+---------------+-------------+---------------+-------------------+-------------------+----------------------------------+ ... ' SQL SECURITY INVOKER NOT DETERMINISTIC CONTAINS SQL BEGIN DECLARE v_table_exists, v_tmp_digests_table_exists, v_custom_view_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY') DEFAULT ''; DECLARE v_this_thread_enabled ENUM('YES', 'NO'); DECLARE v_force_new_snapshot BOOLEAN DEFAULT FALSE; DECLARE v_digests_table VARCHAR(133); DECLARE v_quoted_table, v_quoted_custom_view VARCHAR(133) DEFAULT ''; DECLARE v_table_db, v_table_name, v_custom_db, v_custom_name VARCHAR(64); DECLARE v_digest_table_template, v_checksum_ref, v_checksum_table text; DECLARE v_sql longtext; DECLARE v_error_msg VARCHAR(128); SELECT INSTRUMENTED INTO v_this_thread_enabled FROM performance_schema.threads WHERE PROCESSLIST_ID = CONNECTION_ID(); IF (v_this_thread_enabled = 'YES') THEN CALL sys.ps_setup_disable_thread(CONNECTION_ID()); END IF; SET @log_bin := @@sql_log_bin; IF (@log_bin = 1) THEN SET sql_log_bin = 0; END IF; IF (@sys.statement_performance_analyzer.limit IS NULL) THEN SET @sys.statement_performance_analyzer.limit = sys.sys_get_config('statement_performance_analyzer.limit', '100'); END IF; IF (@sys.debug IS NULL) THEN SET @sys.debug = sys.sys_get_config('debug' , 'OFF'); END IF; IF (in_table = 'NOW()') THEN SET v_force_new_snapshot = TRUE, in_table = NULL; ELSEIF (in_table IS NOT NULL) THEN IF (NOT INSTR(in_table, '.')) THEN SET v_table_db = DATABASE(), v_table_name = in_table; ELSE SET v_table_db = SUBSTRING_INDEX(in_table, '.', 1); SET v_table_name = SUBSTRING(in_table, CHAR_LENGTH(v_table_db)+2); END IF; SET v_quoted_table = CONCAT('`', v_table_db, '`.`', v_table_name, '`'); IF (@sys.debug = 'ON') THEN SELECT CONCAT('in_table is: db = ''', v_table_db, ''', table = ''', v_table_name, '''') AS 'Debug'; END IF; IF (v_table_db = DATABASE() AND (v_table_name = 'tmp_digests' OR v_table_name = 'tmp_digests_delta')) THEN SET v_error_msg = CONCAT('Invalid value for in_table: ', v_quoted_table, ' is reserved table name.'); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = v_error_msg; END IF; CALL sys.table_exists(v_table_db, v_table_name, v_table_exists); IF (@sys.debug = 'ON') THEN SELECT CONCAT('v_table_exists = ', v_table_exists) AS 'Debug'; END IF; IF (v_table_exists = 'BASE TABLE') THEN SET v_checksum_ref = ( SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME, COLUMN_TYPE) ORDER BY ORDINAL_POSITION) AS Checksum FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'performance_schema' AND TABLE_NAME = 'events_statements_summary_by_digest' ), v_checksum_table = ( SELECT GROUP_CONCAT(CONCAT(COLUMN_NAME, COLUMN_TYPE) ORDER BY ORDINAL_POSITION) AS Checksum FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = v_table_db AND TABLE_NAME = v_table_name ); IF (v_checksum_ref <> v_checksum_table) THEN SET v_error_msg = CONCAT('The table ', IF(CHAR_LENGTH(v_quoted_table) > 93, CONCAT('...', SUBSTRING(v_quoted_table, -90)), v_quoted_table), ' has the wrong definition.'); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = v_error_msg; END IF; END IF; END IF; IF (in_views IS NULL OR in_views = '') THEN SET in_views = 'with_runtimes_in_95th_percentile,analysis,with_errors_or_warnings,with_full_table_scans,with_sorting,with_temp_tables'; END IF; CALL sys.table_exists(DATABASE(), 'tmp_digests', v_tmp_digests_table_exists); IF (@sys.debug = 'ON') THEN SELECT CONCAT('v_tmp_digests_table_exists = ', v_tmp_digests_table_exists) AS 'Debug'; END IF; CASE WHEN in_action IN ('snapshot', 'overall') THEN IF (in_table IS NOT NULL) THEN IF (NOT v_table_exists IN ('TEMPORARY', 'BASE TABLE')) THEN SET v_error_msg = CONCAT('The ', in_action, ' action requires in_table to be NULL, NOW() or specify an existing table.', ' The table ', IF(CHAR_LENGTH(v_quoted_table) > 16, CONCAT('...', SUBSTRING(v_quoted_table, -13)), v_quoted_table), ' does not exist.'); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = v_error_msg; END IF; END IF; WHEN in_action IN ('delta', 'save') THEN IF (v_table_exists NOT IN ('TEMPORARY', 'BASE TABLE')) THEN SET v_error_msg = CONCAT('The ', in_action, ' action requires in_table to be an existing table.', IF(in_table IS NOT NULL, CONCAT(' The table ', IF(CHAR_LENGTH(v_quoted_table) > 39, CONCAT('...', SUBSTRING(v_quoted_table, -36)), v_quoted_table), ' does not exist.'), '')); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = v_error_msg; END IF; IF (in_action = 'delta' AND v_tmp_digests_table_exists <> 'TEMPORARY') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'An existing snapshot generated with the statement_performance_analyzer() must exist.'; END IF; WHEN in_action = 'create_tmp' THEN IF (v_table_exists = 'TEMPORARY') THEN SET v_error_msg = CONCAT('Cannot create the table ', IF(CHAR_LENGTH(v_quoted_table) > 72, CONCAT('...', SUBSTRING(v_quoted_table, -69)), v_quoted_table), ' as it already exists.'); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = v_error_msg; END IF; WHEN in_action = 'create_table' THEN IF (v_table_exists <> '') THEN SET v_error_msg = CONCAT('Cannot create the table ', IF(CHAR_LENGTH(v_quoted_table) > 52, CONCAT('...', SUBSTRING(v_quoted_table, -49)), v_quoted_table), ' as it already exists', IF(v_table_exists = 'TEMPORARY', ' as a temporary table.', '.')); SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = v_error_msg; END IF; WHEN in_action = 'cleanup' THEN DO (SELECT 1); ELSE SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Unknown action. Supported actions are: cleanup, create_table, create_tmp, delta, overall, save, snapshot'; END CASE; SET v_digest_table_template = 'CREATE %{TEMPORARY}TABLE %{TABLE_NAME} ( `SCHEMA_NAME` varchar(64) DEFAULT NULL, `DIGEST` varchar(32) DEFAULT NULL, `DIGEST_TEXT` longtext, `COUNT_STAR` bigint(20) unsigned NOT NULL, `SUM_TIMER_WAIT` bigint(20) unsigned NOT NULL, `MIN_TIMER_WAIT` bigint(20) unsigned NOT NULL, `AVG_TIMER_WAIT` bigint(20) unsigned NOT NULL, `MAX_TIMER_WAIT` bigint(20) unsigned NOT NULL, `SUM_LOCK_TIME` bigint(20) unsigned NOT NULL, `SUM_ERRORS` bigint(20) unsigned NOT NULL, `SUM_WARNINGS` bigint(20) unsigned NOT NULL, `SUM_ROWS_AFFECTED` bigint(20) unsigned NOT NULL, `SUM_ROWS_SENT` bigint(20) unsigned NOT NULL, `SUM_ROWS_EXAMINED` bigint(20) unsigned NOT NULL, `SUM_CREATED_TMP_DISK_TABLES` bigint(20) unsigned NOT NULL, `SUM_CREATED_TMP_TABLES` bigint(20) unsigned NOT NULL, `SUM_SELECT_FULL_JOIN` bigint(20) unsigned NOT NULL, `SUM_SELECT_FULL_RANGE_JOIN` bigint(20) unsigned NOT NULL, `SUM_SELECT_RANGE` bigint(20) unsigned NOT NULL, `SUM_SELECT_RANGE_CHECK` bigint(20) unsigned NOT NULL, `SUM_SELECT_SCAN` bigint(20) unsigned NOT NULL, `SUM_SORT_MERGE_PASSES` bigint(20) unsigned NOT NULL, `SUM_SORT_RANGE` bigint(20) unsigned NOT NULL, `SUM_SORT_ROWS` bigint(20) unsigned NOT NULL, `SUM_SORT_SCAN` bigint(20) unsigned NOT NULL, `SUM_NO_INDEX_USED` bigint(20) unsigned NOT NULL, `SUM_NO_GOOD_INDEX_USED` bigint(20) unsigned NOT NULL, `FIRST_SEEN` timestamp NULL DEFAULT NULL, `LAST_SEEN` timestamp NULL DEFAULT NULL, INDEX (SCHEMA_NAME, DIGEST) ) DEFAULT CHARSET=utf8'; IF (v_force_new_snapshot OR in_action = 'snapshot' OR (in_action = 'overall' AND in_table IS NULL) OR (in_action = 'save' AND v_tmp_digests_table_exists <> 'TEMPORARY') ) THEN IF (v_tmp_digests_table_exists = 'TEMPORARY') THEN IF (@sys.debug = 'ON') THEN SELECT 'DROP TEMPORARY TABLE IF EXISTS tmp_digests' AS 'Debug'; END IF; DROP TEMPORARY TABLE IF EXISTS tmp_digests; END IF; CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', 'TEMPORARY '), '%{TABLE_NAME}', 'tmp_digests')); SET v_sql = CONCAT('INSERT INTO tmp_digests SELECT * FROM ', IF(in_table IS NULL OR in_action = 'save', 'performance_schema.events_statements_summary_by_digest', v_quoted_table)); CALL sys.execute_prepared_stmt(v_sql); END IF; IF (in_action IN ('create_table', 'create_tmp')) THEN IF (in_action = 'create_table') THEN CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', ''), '%{TABLE_NAME}', v_quoted_table)); ELSE CALL sys.execute_prepared_stmt(REPLACE(REPLACE(v_digest_table_template, '%{TEMPORARY}', 'TEMPORARY '), '%{TABLE_NAME}', v_quoted_table)); END IF; ELSEIF (in_action = 'save') THEN CALL sys.execute_prepared_stmt(CONCAT('DELETE FROM ', v_quoted_table)); CALL sys.execute_prepared_stmt(CONCAT('INSERT INTO ', v_quoted_table, ' SELECT * FROM tmp_digests')); ELSEIF (in_action = 'cleanup') THEN DROP TEMPORARY TABLE IF EXISTS sys.tmp_digests; DROP TEMPORARY TABLE IF EXISTS sys.tmp_digests_delta; ELSEIF (in_action IN ('overall', 'delta')) THEN IF (in_action = 'overall') THEN IF (in_table IS NULL) THEN SET v_digests_table = 'tmp_digests'; ELSE SET v_digests_table = v_quoted_table; END IF; ELSE SET v_digests_table = 'tmp_digests_delta'; DROP TEMPORARY TABLE IF EXISTS tmp_digests_delta; CREATE TEMPORARY TABLE tmp_digests_delta LIKE tmp_digests; SET v_sql = CONCAT('INSERT INTO tmp_digests_delta SELECT `d_end`.`SCHEMA_NAME`, `d_end`.`DIGEST`, `d_end`.`DIGEST_TEXT`, `d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0) AS ''COUNT_STAR'', `d_end`.`SUM_TIMER_WAIT`-IFNULL(`d_start`.`SUM_TIMER_WAIT`, 0) AS ''SUM_TIMER_WAIT'', `d_end`.`MIN_TIMER_WAIT` AS ''MIN_TIMER_WAIT'', IFNULL((`d_end`.`SUM_TIMER_WAIT`-IFNULL(`d_start`.`SUM_TIMER_WAIT`, 0))/NULLIF(`d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0), 0), 0) AS ''AVG_TIMER_WAIT'', `d_end`.`MAX_TIMER_WAIT` AS ''MAX_TIMER_WAIT'', `d_end`.`SUM_LOCK_TIME`-IFNULL(`d_start`.`SUM_LOCK_TIME`, 0) AS ''SUM_LOCK_TIME'', `d_end`.`SUM_ERRORS`-IFNULL(`d_start`.`SUM_ERRORS`, 0) AS ''SUM_ERRORS'', `d_end`.`SUM_WARNINGS`-IFNULL(`d_start`.`SUM_WARNINGS`, 0) AS ''SUM_WARNINGS'', `d_end`.`SUM_ROWS_AFFECTED`-IFNULL(`d_start`.`SUM_ROWS_AFFECTED`, 0) AS ''SUM_ROWS_AFFECTED'', `d_end`.`SUM_ROWS_SENT`-IFNULL(`d_start`.`SUM_ROWS_SENT`, 0) AS ''SUM_ROWS_SENT'', `d_end`.`SUM_ROWS_EXAMINED`-IFNULL(`d_start`.`SUM_ROWS_EXAMINED`, 0) AS ''SUM_ROWS_EXAMINED'', `d_end`.`SUM_CREATED_TMP_DISK_TABLES`-IFNULL(`d_start`.`SUM_CREATED_TMP_DISK_TABLES`, 0) AS ''SUM_CREATED_TMP_DISK_TABLES'', `d_end`.`SUM_CREATED_TMP_TABLES`-IFNULL(`d_start`.`SUM_CREATED_TMP_TABLES`, 0) AS ''SUM_CREATED_TMP_TABLES'', `d_end`.`SUM_SELECT_FULL_JOIN`-IFNULL(`d_start`.`SUM_SELECT_FULL_JOIN`, 0) AS ''SUM_SELECT_FULL_JOIN'', `d_end`.`SUM_SELECT_FULL_RANGE_JOIN`-IFNULL(`d_start`.`SUM_SELECT_FULL_RANGE_JOIN`, 0) AS ''SUM_SELECT_FULL_RANGE_JOIN'', `d_end`.`SUM_SELECT_RANGE`-IFNULL(`d_start`.`SUM_SELECT_RANGE`, 0) AS ''SUM_SELECT_RANGE'', `d_end`.`SUM_SELECT_RANGE_CHECK`-IFNULL(`d_start`.`SUM_SELECT_RANGE_CHECK`, 0) AS ''SUM_SELECT_RANGE_CHECK'', `d_end`.`SUM_SELECT_SCAN`-IFNULL(`d_start`.`SUM_SELECT_SCAN`, 0) AS ''SUM_SELECT_SCAN'', `d_end`.`SUM_SORT_MERGE_PASSES`-IFNULL(`d_start`.`SUM_SORT_MERGE_PASSES`, 0) AS ''SUM_SORT_MERGE_PASSES'', `d_end`.`SUM_SORT_RANGE`-IFNULL(`d_start`.`SUM_SORT_RANGE`, 0) AS ''SUM_SORT_RANGE'', `d_end`.`SUM_SORT_ROWS`-IFNULL(`d_start`.`SUM_SORT_ROWS`, 0) AS ''SUM_SORT_ROWS'', `d_end`.`SUM_SORT_SCAN`-IFNULL(`d_start`.`SUM_SORT_SCAN`, 0) AS ''SUM_SORT_SCAN'', `d_end`.`SUM_NO_INDEX_USED`-IFNULL(`d_start`.`SUM_NO_INDEX_USED`, 0) AS ''SUM_NO_INDEX_USED'', `d_end`.`SUM_NO_GOOD_INDEX_USED`-IFNULL(`d_start`.`SUM_NO_GOOD_INDEX_USED`, 0) AS ''SUM_NO_GOOD_INDEX_USED'', `d_end`.`FIRST_SEEN`, `d_end`.`LAST_SEEN` FROM tmp_digests d_end LEFT OUTER JOIN ', v_quoted_table, ' d_start ON `d_start`.`DIGEST` = `d_end`.`DIGEST` AND (`d_start`.`SCHEMA_NAME` = `d_end`.`SCHEMA_NAME` OR (`d_start`.`SCHEMA_NAME` IS NULL AND `d_end`.`SCHEMA_NAME` IS NULL) ) WHERE `d_end`.`COUNT_STAR`-IFNULL(`d_start`.`COUNT_STAR`, 0) > 0'); CALL sys.execute_prepared_stmt(v_sql); END IF; IF (FIND_IN_SET('with_runtimes_in_95th_percentile', in_views)) THEN SELECT 'Queries with Runtime in 95th Percentile' AS 'Next Output'; DROP TEMPORARY TABLE IF EXISTS tmp_digest_avg_latency_distribution1; DROP TEMPORARY TABLE IF EXISTS tmp_digest_avg_latency_distribution2; DROP TEMPORARY TABLE IF EXISTS tmp_digest_95th_percentile_by_avg_us; CREATE TEMPORARY TABLE tmp_digest_avg_latency_distribution1 ( cnt bigint unsigned NOT NULL, avg_us decimal(21,0) NOT NULL, PRIMARY KEY (avg_us) ) ENGINE=InnoDB; SET v_sql = CONCAT('INSERT INTO tmp_digest_avg_latency_distribution1 SELECT COUNT(*) cnt, ROUND(avg_timer_wait/1000000) AS avg_us FROM ', v_digests_table, ' GROUP BY avg_us'); CALL sys.execute_prepared_stmt(v_sql); CREATE TEMPORARY TABLE tmp_digest_avg_latency_distribution2 LIKE tmp_digest_avg_latency_distribution1; INSERT INTO tmp_digest_avg_latency_distribution2 SELECT * FROM tmp_digest_avg_latency_distribution1; CREATE TEMPORARY TABLE tmp_digest_95th_percentile_by_avg_us ( avg_us decimal(21,0) NOT NULL, percentile decimal(46,4) NOT NULL, PRIMARY KEY (avg_us) ) ENGINE=InnoDB; SET v_sql = CONCAT('INSERT INTO tmp_digest_95th_percentile_by_avg_us SELECT s2.avg_us avg_us, IFNULL(SUM(s1.cnt)/NULLIF((SELECT COUNT(*) FROM ', v_digests_table, '), 0), 0) percentile FROM tmp_digest_avg_latency_distribution1 AS s1 JOIN tmp_digest_avg_latency_distribution2 AS s2 ON s1.avg_us <= s2.avg_us GROUP BY s2.avg_us HAVING percentile > 0.95 ORDER BY percentile LIMIT 1'); CALL sys.execute_prepared_stmt(v_sql); SET v_sql = REPLACE( REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_runtimes_in_95th_percentile' ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ), 'sys.x$ps_digest_95th_percentile_by_avg_us', '`sys`.`x$ps_digest_95th_percentile_by_avg_us`' ); CALL sys.execute_prepared_stmt(v_sql); DROP TEMPORARY TABLE tmp_digest_avg_latency_distribution1; DROP TEMPORARY TABLE tmp_digest_avg_latency_distribution2; DROP TEMPORARY TABLE tmp_digest_95th_percentile_by_avg_us; END IF; IF (FIND_IN_SET('analysis', in_views)) THEN SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries Ordered by Total Latency') AS 'Next Output'; SET v_sql = REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statement_analysis' ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ); IF (@sys.statement_performance_analyzer.limit > 0) THEN SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit); END IF; CALL sys.execute_prepared_stmt(v_sql); END IF; IF (FIND_IN_SET('with_errors_or_warnings', in_views)) THEN SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Errors') AS 'Next Output'; SET v_sql = REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_errors_or_warnings' ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ); IF (@sys.statement_performance_analyzer.limit > 0) THEN SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit); END IF; CALL sys.execute_prepared_stmt(v_sql); END IF; IF (FIND_IN_SET('with_full_table_scans', in_views)) THEN SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Full Table Scan') AS 'Next Output'; SET v_sql = REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_full_table_scans' ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ); IF (@sys.statement_performance_analyzer.limit > 0) THEN SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit); END IF; CALL sys.execute_prepared_stmt(v_sql); END IF; IF (FIND_IN_SET('with_sorting', in_views)) THEN SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Sorting') AS 'Next Output'; SET v_sql = REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_sorting' ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ); IF (@sys.statement_performance_analyzer.limit > 0) THEN SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit); END IF; CALL sys.execute_prepared_stmt(v_sql); END IF; IF (FIND_IN_SET('with_temp_tables', in_views)) THEN SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries with Internal Temporary Tables') AS 'Next Output'; SET v_sql = REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'statements_with_temp_tables' ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ); IF (@sys.statement_performance_analyzer.limit > 0) THEN SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit); END IF; CALL sys.execute_prepared_stmt(v_sql); END IF; IF (FIND_IN_SET('custom', in_views)) THEN SELECT CONCAT('Top ', @sys.statement_performance_analyzer.limit, ' Queries Using Custom View') AS 'Next Output'; IF (@sys.statement_performance_analyzer.view IS NULL) THEN SET @sys.statement_performance_analyzer.view = sys.sys_get_config('statement_performance_analyzer.view', NULL); END IF; IF (@sys.statement_performance_analyzer.view IS NULL) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The @sys.statement_performance_analyzer.view user variable must be set with the view or query to use.'; END IF; IF (NOT INSTR(@sys.statement_performance_analyzer.view, ' ')) THEN IF (NOT INSTR(@sys.statement_performance_analyzer.view, '.')) THEN SET v_custom_db = DATABASE(), v_custom_name = @sys.statement_performance_analyzer.view; ELSE SET v_custom_db = SUBSTRING_INDEX(@sys.statement_performance_analyzer.view, '.', 1); SET v_custom_name = SUBSTRING(@sys.statement_performance_analyzer.view, CHAR_LENGTH(v_custom_db)+2); END IF; CALL sys.table_exists(v_custom_db, v_custom_name, v_custom_view_exists); IF (v_custom_view_exists <> 'VIEW') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'The @sys.statement_performance_analyzer.view user variable is set but specified neither an existing view nor a query.'; END IF; SET v_sql = REPLACE( (SELECT VIEW_DEFINITION FROM information_schema.VIEWS WHERE TABLE_SCHEMA = v_custom_db AND TABLE_NAME = v_custom_name ), '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table ); ELSE SET v_sql = REPLACE(@sys.statement_performance_analyzer.view, '`performance_schema`.`events_statements_summary_by_digest`', v_digests_table); END IF; IF (@sys.statement_performance_analyzer.limit > 0) THEN SET v_sql = CONCAT(v_sql, ' LIMIT ', @sys.statement_performance_analyzer.limit); END IF; CALL sys.execute_prepared_stmt(v_sql); END IF; END IF; IF (v_this_thread_enabled = 'YES') THEN CALL sys.ps_setup_enable_thread(CONNECTION_ID()); END IF; IF (@log_bin = 1) THEN SET sql_log_bin = @log_bin; END IF; END$$ DROP PROCEDURE IF EXISTS table_exists; CREATE DEFINER='mariadb.sys'@'localhost' PROCEDURE table_exists ( IN in_db VARCHAR(64), IN in_table VARCHAR(64), OUT out_exists ENUM('', 'BASE TABLE', 'VIEW', 'TEMPORARY', 'SEQUENCE', 'SYSTEM VIEW', 'TEMPORARY SEQUENCE') ) COMMENT ' Description Tests whether the table specified in in_db and in_table exists either as a regular table, or as a temporary table. The returned value corresponds to the table that will be used, so if there''s both a temporary and a permanent table with the given name, then ''TEMPORARY'' will be returned. Parameters in_db (VARCHAR(64)): The database name to check for the existence of the table in. in_table (VARCHAR(64)): The name of the table to check the existence of. out_exists ENUM('''', ''BASE TABLE'', ''VIEW'', ''TEMPORARY'', ''SEQUENCE'', ''SYSTEM VIEW'', ''TEMPORARY SEQUENCE''): The return value: whether the table exists. The value is one of: * '''' - the table does not exist neither as a base table, view, sequence nor temporary table/sequence. * ''BASE TABLE'' - the table name exists as a permanent base table table. * ''VIEW'' - the table name exists as a view. * ''TEMPORARY'' - the table name exists as a temporary table. * ''SEQUENCE'' - the table name exists as a sequence. * ''SYSTEM VIEW'' - the table name exists as a system view. * ''TEMPORARY SEQUENCE'' - the table name exists as a temporary sequence. Example MariaDB [sys]> CREATE DATABASE db1; Query OK, 1 row affected (0.07 sec) MariaDB [sys]> use db1; Database changed MariaDB [sys]> CREATE TABLE t1 (id INT PRIMARY KEY); Query OK, 0 rows affected (0.08 sec) MariaDB [sys]> CREATE TABLE t2 (id INT PRIMARY KEY); Query OK, 0 rows affected (0.08 sec) MariaDB [sys]> CREATE view v_t1 AS SELECT * FROM t1; Query OK, 0 rows affected (0.00 sec) MariaDB [sys]> CREATE TEMPORARY TABLE t1 (id INT PRIMARY KEY); Query OK, 0 rows affected (0.00 sec) MariaDB [sys]> CREATE SEQUENCE s; Query OK, 0 rows affected (0.00 sec) MariaDB [sys]> CREATE TEMPORARY SEQUENCE s_temp; Query OK, 0 rows affected (0.00 sec) MariaDB [sys]> CALL sys.table_exists(''db1'', ''t1'', @exists); SELECT @exists; Query OK, 0 rows affected (0.00 sec) +------------+ | @exists | +------------+ | TEMPORARY | +------------+ 1 row in set (0.00 sec) MariaDB [sys]> CALL sys.table_exists(''db1'', ''t2'', @exists); SELECT @exists; Query OK, 0 rows affected (0.00 sec) +------------+ | @exists | +------------+ | BASE TABLE | +------------+ 1 row in set (0.01 sec) MariaDB [sys]> CALL sys.table_exists(''db1'', ''v_t1'', @exists); SELECT @exists; Query OK, 0 rows affected (0.00 sec) +---------+ | @exists | +---------+ | VIEW | +---------+ 1 row in set (0.00 sec) MariaDB [sys]> CALL sys.table_exists(''db1'', ''s'', @exists); SELECT @exists; Query OK, 0 rows affected (0.006 sec) +----------+ | @exists | +----------+ | SEQUENCE | +----------+ 1 row in set (0.000 sec) MariaDB [sys]> CALL table_exists(''information_schema'', ''user_variables'', @exists); SELECT @exists; Query OK, 0 rows affected (0.003 sec) +-------------+ | @exists | +-------------+ | SYSTEM VIEW | +-------------+ 1 row in set (0.001 sec) MariaDB [sys]> CALL sys.table_exists(''db1'', ''t3'', @exists); SELECT @exists; Query OK, 0 rows affected (0.01 sec) +---------+ | @exists | +---------+ | | +---------+ 1 row in set (0.00 sec) MariaDB [sys]> CALL table_exists(''db1'', ''s_temp'', @exists); SELECT @exists; Query OK, 0 rows affected (0.003 sec) +--------------------+ | @exists | +--------------------+ | TEMPORARY SEQUENCE | +--------------------+ 1 row in set (0.001 sec) ' SQL SECURITY INVOKER NOT DETERMINISTIC CONTAINS SQL BEGIN DECLARE v_error BOOLEAN DEFAULT FALSE; DECLARE db_quoted VARCHAR(64); DECLARE table_quoted VARCHAR(64); DECLARE v_table_type VARCHAR(30) DEFAULT ''; DECLARE CONTINUE HANDLER FOR 1050 SET v_error = TRUE; DECLARE CONTINUE HANDLER FOR 1146 SET v_error = TRUE; SET v_table_type = (SELECT GROUP_CONCAT(TABLE_TYPE) FROM information_schema.TABLES WHERE TABLE_SCHEMA = in_db AND TABLE_NAME = in_table); IF v_table_type LIKE '%,%' THEN SET out_exists = 'TEMPORARY'; ELSE IF v_table_type is NULL THEN SET v_table_type=''; END IF; IF v_table_type = 'SYSTEM VERSIONED' THEN SET out_exists = 'BASE TABLE'; ELSE SET out_exists = v_table_type; END IF; END IF; END$$ SET @@sql_log_bin = @sql_log_bin; use mysql; roothelpDisplay this help message and exit.basedirNot used by mysql_upgrade. Only for backward compatibility.character-sets-dircompressdatadirdebugThis is a non-debug version. Catch this and exit.debug-checkCheck memory and open file usage at exit.debug-infoPrint some debug info at exit.default-character-setdefault_authDefault authentication client-side plugin to use.check-if-upgrade-is-neededExits with status 0 if an upgrades is required, 1 otherwise.forceForce execution of mysqlcheck even if mysql_upgrade has already been executed for the current version of MariaDB.hostConnect to host.passwordPassword to use when connecting to server. If password is not given, it's solicited on the tty.pipeUse named pipes to connect to server.plugin_dirDirectory for client-side plugins.portPort number to use for connection or 0 for default to, in order of preference, my.cnf, $MYSQL_TCP_PORT, /etc/services, built-in default (3306).protocolThe protocol to use for connection (tcp, socket, pipe).silentPrint less informationsocketThe socket file to use for connection.sslEnable SSL for connection (automatically enabled with other flags).ssl-caCA file in PEM format (check OpenSSL docs, implies --ssl).ssl-capathCA directory (check OpenSSL docs, implies --ssl).ssl-certX509 cert in PEM format (implies --ssl).ssl-cipherSSL cipher to use (implies --ssl).ssl-keyX509 key in PEM format (implies --ssl).ssl-crlCertificate revocation list (implies --ssl).ssl-crlpathCertificate revocation list path (implies --ssl).tls-versionTLS protocol version for secure connection.ssl-verify-server-certVerify server's "Common Name" in its cert against hostname used when connecting. This option is disabled by default.tmpdirDirectory for temporary files.upgrade-system-tablesOnly upgrade the system tables in the mysql database. Tables in other databases are not checked or touched.userUser for login.verboseDisplay more output about the process; Using it twice will print connection argument;Using it 3 times will print out all CHECK, RENAME and ALTER TABLE during the check phase;Using it 4 times (added in MariaDB 10.0.14) will also write out all mariadb-check commands used;Using it 5 times will print all the mariadb commands used and their results while running mysql_fix_privilege_tables script.versionOutput version information and exit.version-checkRun this program only if its 'server version' matches the version of the server to which it's connecting. Note: the 'server version' of the program is the version of the MariaDB server with which it was built/distributed.write-binlogAll commands including those issued by mysqlcheck are written to the binary log.clientmysql_upgrademariadb-upgradeclient-serverclient-mariadb%sCould not open or create the upgrade info file '%s' in the MariaDB Servers data directory, errno: %d (%s) ERROR 1051ERROR 1060ERROR 1061ERROR 1054ERROR 1146ERROR 1290ERROR 1347ERROR 1348ERROR 1356ERROR 1449AMD64Win642.111.4.0-MariaDB%s from %s, client %s for %s (%s) mariadb-checkFATAL ERROR: %s %s--= Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. MariaDB utility for upgrading databases to new MariaDB versions.my%s: the '--%s' option is always ignored %s Ver %s Distrib %s, for %s (%s) rpopen("%s", "r") failed"Out of memory.libs%.*b%c%sLooking for '%s' as: %s> NUL2>&1--help--no-defaultsCan't execute '%s'SET SQL_LOG_BIN=0;sqlFailed to create temporary file for defaultsFailed to write to '%s'<--silent--verbose--force--skip-force--batch--database=mysqlshow variables like 'datadir'Reading datadir from the MariaDB server failed. Got the following error when executing the 'mysql' command line clientmariadb_upgrade_infoUpgrade failedmysql_upgrade_info--force --force used, continuing without using the %s file. Note that this means that there is no protection against concurrent mysql_upgrade executions and next mysql_upgrade run will do a full upgrade again! Note that mysql_upgrade should be run as the same user as the MariaDB server binary, normally 'mysql' or 'root'. Alternatively you can use mysql_upgrade --force --force. Please check the documentation if you decide to use the force option! Could not exclusively lock on file '%s'. Error %d: %s Empty or non existent %s. Assuming mysql_upgrade has to be run!Major version upgrade detected from %s to %s. Check required!Version mismatch (%s -> %s): Trying to downgrade from a higher to lower version is not supported!This installation of MariaDB is already upgraded to %s. There is no need to run mariadb-upgrade again for %s.You can use --force if you still want to run mariadb-upgradeCould not write to the upgrade info file '%s' in the MariaDB Servers datadir, errno: %d Running '%s' with connection arguments: %sRunning '%s with default connection argumentsmysql databasetables--databases--all-databasesmysql--skip-database=mysqlPhase %d/%d: Checking and upgrading %s... SkippedPhase %d/%d: Checking and upgrading %s--write-binlog--skip-write-binlog--auto-repair--check-upgradeshow create table mysql.eventIGNORE_BAD_TABLE_OPTIONSMariaDB upgrade detected--process-views=UPGRADE--process-views=UPGRADE_FROM_MYSQLPhase %d/%d: Fixing views from mysqlPhase %d/%d: Fixing views... SkippedPhase %d/%d: Fixing viewsmysqlcheck--skip-process-tables--repairPhase %d/%d: Fixing table and database names ... SkippedPhase %d/%d: Fixing table and database names--fix-table-names--fix-db-namesERROR10.1.show create table mysql.userdefault_roleUpgrading from a version before MariaDB-10.1Phase %d/%d: uninstalling pluginsuninstalling plugin for %s data typeUNINSTALL SONAME SELECT table_comment FROM information_schema.tables WHERE table_comment LIKE 'Unknown data type: %''MYSQL_JSON'installing plugin for MYSQL_JSON data typeINSTALL SONAME 'type_mysql_json''type_mysql_json'... can't %s SELECT DISTINCT LOWER(engine) AS c1 FROM information_schema.tables WHERE table_comment LIKE 'Unknown storage engine%' ORDER BY c1Phase %d/%d: Installing used storage engines... SkippedPhase %d/%d: Installing used storage enginesChecking for tables with unknown storage engineinstalling plugin for '%s' storage engine'install soname 'ha_SELECT COUNT(*) AS c1 FROM mysql.slave_master_infoSlave info repository compatibility check: Found data in `mysql`.`slave_master_info` table. Warning: Content of `mysql`.`slave_master_info` table will be ignored as MariaDB supports file based info repository. SELECT COUNT(*) AS c1 FROM mysql.slave_relay_log_infoSlave info repository compatibility check: Found data in `mysql`.`slave_relay_log_info` table. Warning: Content of `mysql`.`slave_relay_log_info` table will be ignored as MariaDB supports file based repository. Slave server may not possess the correct replication metadata. Execution of CHANGE MASTER as per `mysql`.`slave_master_info` and `mysql`.`slave_relay_log_info` table content is recommended. Phase %d/%d: Running 'mysql_fix_privilege_tables'WARNINGPhase %d/%d: Running 'FLUSH PRIVILEGES'FLUSH PRIVILEGESshow variables like 'version'Version check failed. Got the following error when calling the 'mysql' command line clientError: Server version (%s) does not match the version of the server (%s) with which this program was built/distributed. You can use --skip-version-check to skip this check. --defaults-file=mysql_upgrade-[client] mariadb.exemariadb-check.exeThe --upgrade-system-tables option was used, user tables won't be touched. OKCan't initialize threads: error %d D:\winx64-packages\build\src\mysys\my_thr_init.c%s.%llx.deleteden_US.UTF8UMASKUMASK_DIRunknownmariadbHOMEWSAStartup() failed with error: %d \"@h@m@Unknown exceptionx@h@m@@h@m@bad array new lengthstring too long@h@m@P@ph@m@ذ@ph@m@h@@h@m@m@m@ m@@m@genericcmd.exe /c unordered_map/set too longinvalid hash bucket count_Enter password:  *----file-marker----.ini.cnfincludedirincludeCould not open required defaults file: %s Fatal error in defaults handling. Program aborted --defaults-extra-file=--defaults-group-suffix=--print-defaultsMYSQL_GROUP_SUFFIXdefaults%s would have been started with the following arguments: %s error: Wrong '!%s' directive in config file: %s at line %d D:\winx64-packages\build\src\mysys\my_default.cWarning: skipping '%s' directive as maximum includerecursion level was reached in file %s at line %d error: Wrong group definition in config file: %s at line %d error: Found option without preceding group in config file: %s at line: %d Default options are read from the following files in the given order:Internal error initializing default directories listThe following groups are read: The following options may be given as the first argument: --print-defaults Print the program argument list and exit. --no-defaults Don't read default options from any option file. The following specify which files/extra groups are read (specified before remaining options): --defaults-file=# Only read default options from the given file #. --defaults-extra-file=# Read this file after the global files are read. --defaults-group-suffix=# Additionally read default groups with # appended as a suffix.C://dataMARIADB_HOMEMYSQL_HOME01autoWarning: Info: skipdisableenablemaximumlooseautoset%s: invalid (non-UTF8) characters found for option '%s' in file '%s'%s: invalid (non-UTF8) characters for option %s%s: ambiguous option '--%s-%s' (--%s-%s)%s: unknown variable '%s'%s: unknown option '--%s'%s: variable prefix '%s' is not unique%s: ambiguous option '--%s' (%s, %s)%s: %s: Option '%s' used, but is disabled %s: option '--%s' cannot take an argumenttrueonfalseoff%s: ignoring option '--%s' due to invalid value '%s'%s: automatically set option '--%s' cannot take an argument%s: automatic setup request is unsupported by option '--%s'%s: option '--%s' requires an argument%s: ERROR: Option '-%c' used, but is disabled %s: option '-%c' requires an argument%s: unknown option '-%c'option '%s': boolean value '%s' wasn't recognized. Set to OFF.%s: Maximum value of '%s' cannot be setall%s: Error while setting value '%s' to '%s'Using unique option prefix '%.*s' is error-prone and can break in the future. Please use the full name '%s' instead.Incorrect integer value: '%s'Unknown suffix '%c' used for variable '%s' (value '%s') Incorrect unsigned value: '%s' for %sIncorrect integer value: '%s' for %sUnknown suffix '%c' used for variable '%s' (value '%s')option '%s': signed value %s adjusted to %soption '%s': unsigned value %s adjusted to %soption '%s': value %g adjusted to %gInvalid decimal value for option '%s' , -%c%s][%s=name%s %s=#%s (Automatically configured unless set explicitly). One of: . Any combination of: . Takes a comma-separated list of option=value pairs, where value is on, off, or default, and options are: %*s(Defaults to on; use --skip- to disable.) Use 'ALL' to set all combinations. Variables (--variable-name=value) Value (after reading options) and boolean options {FALSE|TRUE}%-*s%s%s,,%s%s=(No default value)TRUEFALSE%d %u %ld %lu %g (No default value) (Disabled) Unknown error %dD:\winx64-packages\build\src\mysys\my_winfile.cUNKNOWNUNOPENEDCan't create/write to file '%s' (Errcode: %M)Error reading file '%s' (Errcode: %M)Error writing file '%s' (Errcode: %M)Error on close of '%s' (Errcode: %M)Out of memory (Needed %u bytes)Error on delete of '%s' (Errcode: %M)Error on rename of '%s' to '%s' (Errcode: %M)Unexpected end-of-file found when reading file '%s' (Errcode: %M)Can't lock file (Errcode: %M)Can't unlock file (Errcode: %M)Can't read dir of '%s' (Errcode: %M)Can't get stat of '%s' (Errcode: %M)Can't change size of file (Errcode: %M)Can't open stream from handle (Errcode: %M)Can't get working directory (Errcode: %M)Can't change dir to '%s' (Errcode: %M)Warning: '%s' had %d linksWarning: %d files and %d streams is left open Disk is full writing '%s' (Errcode: %M). Waiting for someone to free space... (Expect up to %d secs delay for server to continue after freeing disk space)Can't create directory '%s' (Errcode: %M)Character set '%s' is not a compiled character set and is not specified in the '%s' fileOut of resources when opening file '%s' (Errcode: %M)Can't read value for symlink '%s' (Errcode: %M)Can't create symlink '%s' pointing at '%s' (Errcode: %M)Error on realpath() on '%s' (Errcode: %M)Can't sync file '%s' to disk (Errcode: %M)Collation '%s' is not a compiled collation and is not specified in the '%s' fileFile '%s' not found (Errcode: %M)File '%s' (fileno: %d) was not closedCan't change ownership of the file '%s' (Errcode: %M)Can't change permissions of the file '%s' (Errcode: %M)Can't seek in file '%s' (Errcode: %M)Can't change mode for file '%s' to 0x%lx (Errcode: %M)Warning: Can't copy ownership for file '%s' (Errcode: %M)Failed to release memory pointer %p, %zu bytes (Errcode: %M)Lock Pages in memory access rights requiredMemcntl %s cmd %s errorWarning: Charset id '%d' csname '%s' trying to replace existing csname '%s'Deprecated program name. It will be removed in a future release, use '%s' insteadRetry in %d secs. Message reprinted in %d secs: ...sym/?defaultCLOCK$CONPRNAUXNULCOM1COM2COM3COM4COM5COM6COM7COM8COM9LPT1LPT2LPT3LPT4LPT5LPT6LPT7LPT8LPT9<>:"/\|?*Didn't find the key on read or updateDuplicate key on write or updateInternal (unspecified) error in handlerSomeone has changed the row since it was read (even though the table was locked to prevent it)Wrong index given to a functionUndefined handler error 125Index is corruptedTable file is corruptedOut of memory in engineUndefined handler error 129Incorrect file formatCommand not supported by the engineOld database fileNo record read before updateRecord was already deleted (or record file crashed)No more room in record fileNo more room in index fileNo more records (read after end of file)Unsupported extension used for tableToo big rowWrong create optionsDuplicate unique key on write or updateUnknown character set used in tableConflicting table definitions in sub-tables of MERGE tableTable is crashed and last repair failedTable was marked as crashed and should be repairedLock timed out; Retry transactionLock table is full; Restart program with a larger lock tableUpdates are not allowed under a read only transactionsLock deadlock; Retry transactionForeign key constraint is incorrectly formedCannot add a child rowCannot delete a parent rowNo savepoint with that nameNon unique key block sizeThe table does not exist in the storage engineThe table already existed in the storage engineCould not connect to the storage engineUnexpected null pointer found when using spatial indexThe table changed in the storage engineThere's no partition in the table for the given valueRow-based binary logging of row failedIndex needed in foreign key constraintUpholding foreign key constraints would lead to a duplicate key error in some other tableTable needs to be upgraded before it can be usedTable is read onlyFailed to get next auto increment valueFailed to set row auto increment valueUnknown (generic) error from engineRecord was not updated. New values were the same as original valuesIt is not possible to log this statementThe event was corrupt, leading to illegal data being readThe table is of a new format not supported by this versionThe event could not be processed. No other handler error happenedFatal error during initialization of handlerFile too short; Expected more data in fileRead page with wrong checksumToo many active concurrent transactionsRecord not matching the given partition setIndex column length exceeds limitIndex corruptedUndo record too bigInvalid InnoDB FTS Doc IDTable is being used in foreign key checkTablespace already existsToo many columnsRow in wrong partitionRow is not visible by the current transactionOperation was interrupted by end user (probably kill command?)Disk fullIncompatible key or row definition between the MariaDB .frm file and the information in the storage engine. You may have retry or dump and restore the table to fix thisToo many words in a FTS phrase or proximity searchTable encrypted but decryption failed. This could be because correct encryption management plugin is not loaded, used encryption key is not available or encryption method does not match.Foreign key cascade delete/update exceeds max depthTablespace is missing for a tableSequence has been run outSequence values are conflictingError during commitCannot select partitionsCannot initialize encryption. Check that all encryption parameters have been set(null)Internal error/check (Not system error)Internal error < 0 (Not system error)unknown errorlatin1 ((((( H H  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAA\[\CEEEEIIIIDNOOOO]UUUYYAAAA\[\CEEEEIIIIDNOOOO]UUUYY  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   & ! 0 `9 R}    "   "!a: S~x  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@@@@@`@p@@`@@@p@ @`@@Њ@ @@@0@P@Ѝ@0@А@P@Д@@@@@@0~@}@{@{@latin1_swedish_ci?$@Y@@@@j@.AcAחAeA _BvH7BmB@0BļB4&k C7yAC؅W4vCNgmC=`XC@xDPKDMD7yACnF?O8M20HwZ@p?@p@@pA@pB@pC@pD@pE@pF@pG@pH@pI@pJ@pK@pL@pM@pN@pO@pP@pQ@pR@pS@pT@pU@pV@pW@pX@pY@pZ@p[@p\@p]@p^@p_@p`@pa@pb@pc@pd@pe@pf@pg@ph@pi@pj@pk@pl@pm@pn@po@pp@pq@pr@ @0@@@@0[@P[@@@^@`@[@_@ @@@p@P@Ѝ@0@А@P@Д@@@c@d@@P[@}@Z@Z@ ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~d@h@m@0o@Y@@c@@b@P@ ]@@@ @@{@{@utf8mb3_general_ci0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzutf8mb3utf8mb4binarybinary ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~~@@@@@0@@@P~@@@}@Л@P@@{@{@`@p@~@`@@0~@p@P@P@@@ @@@0@P@Ѝ@0@А@P@Д@@@@@@0~@}@{@{@@P@@@@@0@@@@@@@Л@@@{@{@cp932 ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~ÁÁāāŁŁƁƁǁǁȁȁɁɁʁʁˁˁ́́́́΁΁ρρЁЁссҁҁӁӁԁԁՁՁցցׁׁ؁؁ففځځہہ܁܁݁݁ށށ߁߁@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__`abcdefghijklmnopqrstuvwxyzz{{||}}~~`abcdefghijklmnopqrstuvwxy‚‚ÂÂĂĂłłƂƂǂǂȂȂɂɂʂʂ˂˂̂̂͂͂΂΂ςςЂЂтт҂҂ӂӂԂԂՂՂււׂׂ؂؂ققڂڂۂۂ܂܂݂݂ނނ߂߂@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~ƒÃăŃƃǃȃɃʃ˃̃̓΃σЃу҃ӃԃՃփƒÃăŃƃǃȃɃʃ˃̃̓΃σЃу҃ӃԃՃփ׃׃؃؃ككڃڃۃۃ܃܃݃݃ރރ߃߃@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUVWXYZ[\]^_`aabbccddeeffgghhiijjkkllmmnnoo@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUVWXYZ[\]^_`„„ÄÄĄĄńńƄƄDŽDŽȄȄɄɄʄʄ˄˄̄̄̈́̈́΄΄ττЄЄфф҄҄ӄӄԄԄՄՄքքׄׄ؄؄للڄڄۄۄ܄܄݄݄ބބ߄߄@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTUVWXYZ[\]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~‡‡ÇÇććŇŇƇƇLJLJȇȇɇɇʇʇˇˇ͇͇̇̇··χχЇЇчч҇҇ӇӇԇԇՇՇևևׇׇ؇؇ههڇڇۇۇ܇܇݇݇އއ߇߇@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~TUVWXYZ[\]J@KALBMCNDOEPFQGRHSIJ@KALBMCNDOEPFQGRHSITTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~u@  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~abcdefghijklmnopqrstuvwxyz{|}~000 000@>?00000N0000  <^%"\& %      00;=[]0 0 0 0 0 00000 `"f"g""4"B&@&2 3 ! &&%%%%%%%%%%%; 0!!!!0" """""*")"'"("!!"" ""#""a"R"j"k""=""5"+","+!0 o&m&j& ! %!"#$%&'()*+,-./0123456789:ABCDEFGHIJKLMNOPQRSTUVWXYZA0B0C0D0E0F0G0H0I0J0K0L0M0N0O0P0Q0R0S0T0U0V0W0X0Y0Z0[0\0]0^0_0`0a0b0c0d0e0f0g0h0i0j0k0l0m0n0o0p0q0r0s0t0u0v0w0x0y0z0{0|0}0~000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 !"#$%&'()*+,-./012345Q6789:;<=>?@ABCDEFGHIJKLMNO%% %%%%%,%$%4%<%%%%%%%#%3%+%;%K% %/%(%7%?%%0%%%8%B%`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$`!a!b!c!d!e!f!g!h!i!I33"3M33'3363Q3W3 3&3#3+3J3;33333333{300!3!!22222122292~3}3|3R"a"+"."""" """5")"*"NUZ?Ta(cY"uPz`c%nefh'Weqb[Y{b}}b|[^ cfHhǕOgN OMOOIPV7YYZ \`apafipOupuy}}ÀcUz;SNNWxNXn82z(/AQpSTTVY_m-bp TS[poS\zNx&nVUk;YSfmtBVNKO SU0[q_ ffh8ll)m[tvNz4[`풲muvř`iSQW0XDY[^(`cclopqYqq?s~vт`[iXeZl%uQ.YeY__be*j'kksV,Ğ\l{QK\aƁvharYNOxSi`)nOz NSNUO=OOsORS VYZ[[yfggLklkpsyykSkWl"ooEotuv wz{!|}6f̊Qeӗ(8N+T\]sLvT/Z__`hjZtxw^NɛN|OOPPIQlQRRRSSTTUQWW}YT[][[]]]x^^^^_R`Labbc;efCffmg!hhi_l*mim/nn2uvlx?z|}}^}}T*RLaʐuq?xMؚ;[RRSTXboj_KQ;RJTV@zw`ҞDs opu_`rdkNVdWXZZh`aff9hhmu:}nBNPOSUo]]]glstxP߈PW^+cPPQgT^XY[i_Mbc=hskn}pǑrx&xmye0}܃ dR(WPgjQBW*:XiT]Wx\OJRT>d(fggzV{"}/\h9{SQ7R[bdd-gkіv֛LcvRf NPSq\`dce_hqs#u{~یxefkNN:OO:RSSUVXYYYP[M\^+^_`c/e\[eeegbk{klEsIyy|}+}󁖉^ifnj܌̖okNrtux:y 3ꁔPl_X+z[NSW1YZ[`nouꌟ[{rPga\J~Q\hcfenq>y}ʎndžPR:\Sg|p5rLȑ+[1_`;NS[Kb1gkrs.zkRQSjT[c9j}VShT[1\]Oab2myyB}M~Frt/1KlƖNOOEQAS_bgAl ncs&~͑SY[m]y.~|~XqQSO\%fwzQ_eoikmndov}]uQR@bffn^}rfRSsY^_U`dPQR SGSSTFU1UVhYY~ d_xRbcBdb-z{v} INHQCS`S[\\]&bGbdh4hlEmmg\oNq}qez{}J~z9nΌxwMRU8o6qhQyU~|LVQX\cffZiruuyVyy| }D}4;a PuRSS PUXOY=r[d\S``\cc?ccdef]iioqNuvz|}}aIXlňpmPXaӁ5 OtPGRsSo`Ic_g,nO^\ʌe}RSvQcX[k[ \ dQg\NY*YplQ>UXY`Sbg5Ui@ę(SOX[\/^_ `Ka4bfln΀Ԃ.۞ۛNS'Y,{Ln'pSSDU[Xbbblo"t8o8QSSFOTjY1]zh7rH=j9NXSVfWbceNkm[npwz{}=ƀˆ[VX>_efjk7uNJ$Pw0W_e`zf`luznE{\uzQ{Ąyz6Z@w-NN[_bm6t4xFZuO^bcWeogvLr̀)M PWZhsidqrXjyw)/OeRZSbgl}v{|6f or~Q{rx{H{ja^Qu`ukQbnzvOpbO{zVYX䆼4O$RJSSS^,deg>lNlHrrsTuA~,酩{Ƒiq=cifjuvxC*SQS&TY^|_`Ibybbekluvxy}w^ۘ j8|P>\_gk5t w;gz9Suf_񃘀<__buF{ee gllp2x+~ހ *JҒlONNPVRJWY=^__?bfgghQ!}~2 T,SP\SXd4ggrfwFzRlkXL^TY,gQvidxTWY'fgkTiU^ggR]hNOSb+glďOm~Nban+osT*gE]{\[JnфzY|l wR"Y!q_rw'a iZZQ T}TfvY]rnMQh}}bxd!jY_[ksv}2Q(gٞvbgR$\;b~|OU` }S_NQY:r6Α%_wSy_}3VgS aalRv8/UQO*QRS[}^`ac gggnm6s7s1uPyՈJĖYNYON?P|^Y[^ccdfJii mnq(uzIɄ! e} ~ab2kltmmeg<ma}=jqNuSP]koͅ-)RTe\Nghttuψ̑x_szNceuRAmn tYukx|zOnae\NNP!NQ[ehmsBvwz|oҊ|ϑuR}+PSgmq3t*W`tAXm/}^N6OOQR]`s|}o#,BTojpŒ2RAZ^_g|iijmobrr{~KΐmQy2֊-PTqjkČ`gNNkhi~nxU _NN*N1N6NYzUYPYNYZYXYbY`YgYlYiYxYYY^OOYYYYYYYY%ZZZZ ZZ@ZlZIZ5Z6ZbZjZZZZZZZZZZZZZZ [ [[2[Z*[6[>[C[E[@[Q[U[Z[[[e[i[p[s[u[x[ez[[[[[[[[[[[[[[[[[[[\\\ \\ \"\(\8\9\A\F\N\S\P\O\q[l\n\bNv\y\\\\Y\\\\\\\\\\\\\]\ ]]]\]]]]]"]]]]L]R]N]K]l]s]v]]]]]]]]]]]]]]]]]]]]] ^^^^^6^7^D^C^@^N^W^T^_^b^d^G^u^v^z^^^^^^^^^^^^^^^^^^^^^^^^_ _]_\_ ___)_-_8_A_H_L_N_/_Q_V_W_Y_a_m_s_w_____________________`_!`````)``1```+`&``:`Z`A`j`w`_`J`F`M`c`C`d`B`l`k`Y``````````````````_````Maaa``a``a!a`` aaGa>a(a'aJa?acMcdOcccccvcccccckciccccccccccd4ddd&d6ded(ddgdodvdNd*eddddddddddddddd ddbdd,eddddedeee$e#e+e4e5e7e6e8eKuHeVeUeMeXe^e]erexeeeeeeeeeeeeeeeeeerg ffesg5f6f4ffOfDfIfAf^f]fdfgfhf_fbfpffffffffffffffffff?ffffffggg&g'g8.g?g6gAg8g7gFg^g`gYgcgdggpgg|gjggggggggggggggggggggggjhFh)h@hMh2hNhh+hYhchwhhhhhhhhhjhthhhhih~hihih"i&ih ihhhh6iiihh%ihhh(i*ii#i!ihyiwi\ixikiTi~ini9iti=iYi0iai^i]iijiiiiiiiii[iiiii.jiiiiiiijji kiiijijiji jjj#jjDj jrj6jxjGjbjYjfjHj8j"jjjjjjjjjjjjjjjjjjjjjkjkk1k8k7kv9kGkCkIkPkYkTk[k_kakxkykkkkkkkkkkkkkkkkkkkkkkkkkkllll$l#l^lUlbljllllll~lhlsllllllllllllllllllmM6m+m=m8mm5m3mm mcmmdmZmymYmmmommn nmmmmmmmmmmmmmmmmm-nnn.nnrn_n>n#nkn+nvnMnnCn:nNn$nnn8nnnnnnnnnnnnnnnnnAooLpnnn?on1on2on>oonozoxooooo[oomoo|oXoooofoooooooooooooooo p popppopptoppp0p>p2pQpcppppppppppppp qpqqeqUqqfqbqLqVqlqqqqqqqqqqqqqqqqqqqqq rrr(r-r,r0r2r;rsNsOs؞Wsjshspsxsus{szsssssssssttot%ts2t:tUt?t_tYtAt\titptctjtvt~tttttttsttttttttttuuu uu uuuu&u,uz7zCzWzIzazbzizpzyz}zzzzzzzzzzzzzzzzzzzzzzzzzzz{{ {{3{{{{5{({6{P{z{{M{ {L{E{u{e{t{g{p{q{l{n{{{{{{{{{{]{{{{{{{{{{||{{`||||{{| |{#|'|*||7|+|=|L|C|T|O|@|P|X|_|d|V|e|l|u||||||||||||||||||||||;|||||}}}} }E}K}.}2}?}5}F}s}V}N}r}h}n}O}c}}}[}}}}}}}}}}}}=~}}}}}}}}}}}}}~ ~#~!~~1~~ ~ ~"~F~f~;~5~9~C~7~2~:~g~]~V~^~Y~Z~y~j~i~|~{~~}}~~~~~~~~~~~~~8:ELMNPQUTX_`higxqܘ !(?;JFRXZ_bhsrpvy}Qۀـ݀Āڀր )#/KF>SQqneft_Ɂ́сف؁ȁځ߁ )+83@YX]Z_dbhjk.qwx~߂҂ނ܂ ق5421@9PE/+#|su΃؃  " 8m*(ALONIV[Zk_lot}:A?HLNPUblxz|bȌڌ  N͌gmqsύڍ֍̍ۍˍߍ B504JGILPHYd`*cUvr|ƎŎȎˎێ  &3;9EB>LIFNW\bcdڏ!  '659OPQRI>VX^hovr}Hbې20JVXceisrɑˑБ֑ߑۑ,^WEIdH?KPZϒD."#:5;\`|nV֓דؓÓݓГȓ6+5!:ARD[`b^j)puw}Z|~ʕoÕ͕̕Օԕ֕ܕ!(./BLOKw\^]_frlΖ˖ɖ͖Mܖ Ֆ$*09=>DFHBI\`dfhRkqy|z×Ɨȗ˗ܗOz 8$!7=FOKkopqtsĘØƘ !$ ,.=>BIEPKQRLUߙۙݙؙљ+7EB@C>UM[W_bedikjϚњӚԚޚߚ"#%'()*./2DCOMNQXtʛƛϛћқԛ:   .%$!0G2F>Z`gvx *&#DA?>FH]^dQPYrozĝƝϝٝӝuy}a̞ΞϞОԞܞޞݞv!,>JRTc_`afgljwrv/XiYdtQq~H܄Op1fhfE_(NNNOO9OVOOOOOO@P"POPFPpPBPPPPJQdQQQQRRRRRSS$SrSSSSTTTTUYWeWWWWXX YSY[Y]YcYYYV[[/u[[\\\\']S]B]m]]]]!_4_g___]````` a`a7a0aabbc`dddNeff;f f.ff$fefWfYfsffffffg)fggRhghDhhhiii0jkjFjsj~jjjk?l\llollmmommmmmmm9n\n'n?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWp!q!r!s!t!u!v!w!x!y!`!a!b!c!d!e!f!g!h!i!12!!!5"~H܄Op1fhfE_(NNNOO9OVOOOOOO@P"POPFPpPBPPPPJQdQQQQRRRRRSS$SrSSSSTTTTUYWeWWWWXX YSY[Y]YcYYYV[[/u[[\\\\']S]B]m]]]]!_4_g___]````` a`a7a0aabbc`dddNeff;f f.ff$fefWfYfsffffffg)fggRhghDhhhiii0jkjFjsj~jjjk?l\llollmmommmmmmm9n\n'n?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~N}L~ƒÃăŃƃǃȃɃʃ˃̃̓΃σЃу҃ӃԃՃփF@ABCDEGHIJKLMNOPQRSTUVWXYZ[\]^_`pqrstuwxyz{|}~v]\efghdcTUVWXYZ[\]@ABCDEFGHIˁ́́݁΁ށ假ځaȁɁ߁ہ܁@ABCDEFGHIJKLMNOPQRS@ABVXYZqrstuvwxyzkl‚ÂĂłƂǂȂɂʂ˂̂͂΂ςЂт҂ӂԂՂւׂ؂قڂۂ܂݂ނ߂JKTU@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~E[RSei`cakjdlfn_mbgh~rsopqutꈚO㏺s^NuhۊO厥TvVRh娘揩T\]݌܌jiS划lYmwedtWiߗȈ‹Cjkl˜Ɉތꊚx`ĘLmfϒAȘʈZC̑nǘ]ØŘƘCΘјϘɘ͘gҘʘp˘ИorӘ̘qˈDN֕Warsטܘژ՘ؘۘ٘ە֘MݘޘCoUvqŒ{|ߘw؎ul㘑ϗ`tzẍΕyÎUT{PÍbBXC͋@AlD}EHFmGI|KJƕVMNLQPOԘRSDזUTWVXYZ[~[ƖeZ\}]S_`ZaTbc~fečgh`ijkʎnlmyopq~ustrvwxyyÙzË{}}~MʓonؐYʕh䒍퍎OU܍菛nc͗wwJNuEו啫΋MَܖkxٔC\ߌ™ڔ쑦PmęTřƙK늌pəșʙ˙З̙Ι͙~X}ϙЙљQҙyFofՙbpÌٙ@ڙؙ‰䑶jEiۙܙhegݒD@fNi۔܊ߙzݙޙCۓČaB@]PDCiAƍENFGLKNMJSOHISBYXOPUR[VWTZQ`ea\fPhA^b[슅c_igridcmkpjnlkorwutQÉqsRv܉}{|~\XxyӓdXdlc͈}Ōޕyݍ\nϋVBRؒ^C_Wu|x͑š‘ÚĚƚꁉgۗ̚ȚY˚h˒ǍǚUɚŚo͚mΚĒКnњ֚՚ϚҚԚǕךdؚٚښܚۚޚӚߚݚmpsᚺ누ْϕ蚟ĉ[OǙgVvΈޓt_zDz@DA@ܔϖDJWdBEÑWiFȍGonƌψKLIWHÖPpЈQORPNPMؕVWSKkUXwYT}ZQ[_\ʼn^]kda`bcefhgilڒdjmnqopqrEstuyFЖGnjvwwxyz{}~FvG@蒶Xq鐺G{ɍQƉeh⎃ГxQ@ljJ˞RΑˎшqޖċAڎKsANj͓rWjƎwԓR򊨛ZБx݊㉴sRśěۛɛƛțǛʛ˛̛ϛΛ͛՛ћЛқӛ֛כԛ؛ފٛۛڛܛݛBHIޛȌߛbJFЋsztȐёAX蛝y훋NKcHLݔXM{xɌNfpLf@CDB_FEAGHILJKMNUOٕPMQTU|VOo햷ʌWX^YJeZg[\]_`abSRc`FʍVjdeefޔihgaґmkjlk]ponqrzsOtJSKEuuYZzwyOxv|{|vӑ}}P~pbIxYߔ{Փfɐ҈ySđz䎷DӈŜƜĜǜÜȜɜœԑQT̜֜͜Μ՜ԜҜdSϜќԈӜʜМלc˜|Jڜޜߜܜٜ؜ݜeۜ蜧圜^ʐ@ABCYDEFՑˌߖ[GˍHőKILJM}NQZOVPc}RSWTRܐe┫ZcS]d_fba[YUXSِ`qg@hminAE\kwlˆgjUҔp}Jqsoߕ{̎~xPv|{uzrt@||̍TyڐT[wdf͒}~`KghrgېE̖TQPdBohi^FC[xǓĝq~ݝsŝǝƝU֓hȝG~ɝʝ˝|Đk֍l͝ΎΝҋːϝafzVН{ӝѝԝҝ՝֝؝םٝڝU|{۝ߝVޝݝՈ̐ftcE蝞WWNAӔiqŋɉgÈb\A@ܓBCjDFGHȋgXIJf֙]\֑ōLK񍽒LN]MNOؖ{DQpSVURTWLjލێZmXYۖ[\aYt^ܝnf`”f]cb͐їʉ}ged_͌kiˉgmsƑuAt^_ђMpoqnvljrhĎ`̒ȓhIxZz}ji͍{jyĈ|~ˋKjVO~[挜Bdǖ_IXoֈAŒ̓֒kȑ^퓾žƋ|ɋOyT|ҞP՞YԞӞОĞÞ֞ΞɞƞǞϞ̞\ƒʞŞȞl͞מߞ؞ޞݞΒ۞ٞWڞ➾͖~ўMk@ɓh@wKGFEBDCIELHJMQNOܞRSTUӋ~WVY\ԋ\[]̉V^`_abc~c΍defgihw}cjlBkmnopqsrtiuEkvaʚBwxꕈœyіz|{~}CXiÔ`Ĕ𓇟]rDדBv͉򐑔@AgDבjmÒk^FhlY_Q\CZO@ܗAUtƟҗßBişʟȟŸWɟğ˟̟[D~CǟYEύakПߟٟnԟݟQH֟͟ϟ`F۟Iӟڟ؟ܟΌÏXGҟN՟ΟџןpퟹanMJŖؑHBޟYRAВQ@NIRK઒HגkEDMGFLCKOPUTVYbSLWQZX][^aZG\`_JMdhfNObcgemmjilғnPoqprsΉD܎ЍQFutRxY{vzy_׈b}G~|wBTSకŏRďVWUƏϔώFonMYRӗzWCיZܒݎꖩuЕŔvĖSqҍ]Ɣ[\ό_ƓKTҖ—]LPQbl_ʋߊ`ωaXdbc]ǔfegihjԗՋilڗklmŠZ@ZABCDFGErIHnKJLMONQPÊr[RᶐYSpTcRb\jUV[YXEW؈Ȕ\Z{L^᪗l_]Ԕ`aoوfcbEidehgDa`^jklnmuvprt]usᾎoqaǏxwyzɒ|{s}~×ȕoᒔSpIFcHsqrtMu~mvᐓXῖĊՔږӖȏŊ^v“r˕uėᵖmZḋΐӍxuԍmCjv{yɏzd{VOqɕאm֔A@⁖CBʏDbFEGIH|ЎJV_FSPOcLNj_MKIˏ[ՍQRh֋\TSЉTUWXHYZ[׋щÓG\Hȉb]d`a≔`^_̏ڈHbcŐBdetŗgfilj҉mkemsoϐnnpqrntuv˓ސwy{xzA|Eq~M}⧗͏vG[^|ƊΏJ}yM؋}͕ӉZNJ\ߐ͔ѕzŽēUәȊАĕ̋HeSl⟊Ϗ⸐ЌWfƗnI@gC[RBюhAfaےFݗ׍GaIЏHIgDJEoMQ㋌LUiROPNKGWTVSpX㎑ea[_ۈZbfjԖԒ\dY]^㻈Ȗ]ًΗgchjmiҕɊɖ܈lknuovrȎtqwpcDks{~|z`ѐɔ}x@qJDUyJ[\Zʊߍrul딭rQA`HKˊ|sVlҎ㧎ϑkՖ^㮒EW㣔]яI̊Ҍbmnx݈_wّEӌE\ƐeҐrE]BAtDCorTHIGFJBڑNOKLMpUQGPSRcVWVXZ^[Y^\]d_`acbefgbh՗LvijPklmno介pqɎrsܕڊCwMtquʔwǑvDxzy|{}~͊ǗFŎHmcԉF|ڋۑcՉꋗϓpΖ։s䃒t`r׉Ί䜔eۋىҏ؍p؉ԌH专Gވ䎗t䟓䒑K䘕ӏN֖f䓑~uW䪖`H@̕UӒ@הԏǎBCnJPQDNFHRGKLOEEIFdOVTmSUWX[YZ˔M\a唑`Abh]_^PAdcefgՌsi|jklqrm\naopztwsuv֎x`ua{^|}~gؔIwXIډZIayOspXqՏt߈\܋Uܑьٍ啑T֏廐J]݋A@CBDPEFG漐vHeIJ橌KK`LoMO旗NePQRϊSTUVpWXYGZ[\]vu`_P^Lab׏cKݐidf؏ehigُ]frmwllkFlbYڏjopn֌_FsaUvrwtuqǓNۉbzxkЊyzȗ_{泒~|@}攏dyuӎwTދ戕xc]̝QJLؓۏ^eLvn݉̔ъӐ晒M惔ݑ\fGdGo^܏qw桑Ԑ͎q拕NzՐ׌HHxH@DABCJE֐GIFLRKMNQPOSRUTVWYXgZ[]^_\`ԎaORb]cfedygriڍhqkmjlpnPory֗SsAutx`wv{zyQ|}~DhCJ_ӕҒHIv}ߋԕމ痔Rqǒޑt秓r瀐ʒ笑秈AߑTi툝NٓxV^Օ߉繓BሦkyKՎJIɗҊWߓM׎@xYSsXsAѓUގz|珗Vy_XݏΔэߎ碗dʗB瘊jޒtݓbn،S甉ޏzge_LKNݕsee|K獐@BACыdB^EDF^tՒKbGHLJIߏOȒZMNLPVYXLQRUWZTS^_`]\[dbcaefhӊgsiljkmopqtruwvxMy•zJ[ՊԊ{|}~֊t}{ňhjɑ~Õ@w׊A’˗褗zG@Ku脌ۍBחꗯǐYWٌ蓎GԙJᐴ_뗋dkIPÐrʖvxCƈfڕ؊B蹉Cŕ{aДړ̗zjopz{犰^ޗڌ@BACDEFHGIHQJKZєOLݖM{a`NOPRSUQTيVWXYZ\[^a]_`bcd遍e]nfgyhʑwmljkiwnopqsrxtvRuxˑyz}|~{[@ETS@飖DBAC驕LNDEI~F邊khVLؗP–Γ鼓鰎DCEL@ABHQJGFKHG{LMNIOߒSTRQWPUVYX[\]hZ^J_`abcdefghki[jlٗmꞔnpqoꍍ˖sotuvKwٖxzy{|}~Cیl@Vs@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~X^u}~IIWVij{C|D^OPQRSTUVWXFGH`abcdefghijklmnopqrstuvwxym_nOQMobp`ʁPUУ@@@@P@0@@@@P@@Л@ @@{@{@ @0@@@`@@@@@p@@ @@@0@P@Ѝ@0@А@P@Д@@@@@@ @}@{@{@cp932_japanese_ci&|Y @Z @[ @\ @] @^ @_ @` @a @b @c @d @e @f @  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz[[\\]]^^__``AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz{{||}}~~x           ! !"#"#$%$%&'&'()()*+*+,-,-././0iI1232345456767889:9:;<;<=>=>?@?@ABABCDCDEFEFGHGHIIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyzyz{|{|}~}~SCSTVWY[`cih=or u           !!"#"#$%$%&'&'()()*+*+,-,-././01012323445566778899:e,;<;<=>f,~,?,@ABABCDEFGFGHIHIJKJKLMLMNONOo,Pm,Qp,RSTUUVWXXYZZ[\]]^^__`abbcddefgghijb,klmmnnoppn,qrssttuvvwwxxyyzz{{||d,}~~ŧDE            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnoopqpqrsrsttuuvwvwxxyyzz{|}~~{|}PQRSTUVWX Y Z [ \ ]^_0123456789:;<=>? @!A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0123456789:;<=>? @!A"B#C$D%E&F'G(H)I*J+K,L-M.N/OPQRSTUVWX Y Z [ \ ]^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyxyz{z{|}|}~~           ! !"#"#$%$%&'&'()()*+*+,-,-././001a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUVWWXXYYZZ[[\\]]^^__``1a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUV            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~--------- - - - - ------------------- -!-"-#-$-%-'---            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~pqrstuvwxyz{|}~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~!""*bJ            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxx}yzz{{||c,}~~Ƨ           ! !"#"#$%$%&'&'()()*+*+,-,-././01012323454567678989:;:;<=<=>?>?@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyxyz{z{|}|}~~`          ( )!*"+#,$-%.&/'( )!*"+#,$-%.&/'8091:2;3<4=5>6?78091:2;3<4=5>6?7H@IAJBKCLDMEFFGGH@IAJBKCLDMENNOOPPYQRR[STT]UVV_WXXYQZZ[S\\]U^^_Wh`iajbkcldmenfogh`iajbkcldmenfogpqrstuvwxyz{|}~~pqrstuvwz{xy|}!!!!!!!!!!!!!!!!!! ! ! ! ! ! ! ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!"!"!#!#!$!$!%!%!&!'!'!(!(!)!)!*!k+!,!,!-!-!.!.!/!/!0!0!1!1!2!N!3!3!4!4!5!5!6!6!7!7!8!8!9!9!:!:!;!;!!>!?!?!@!@!A!A!B!B!C!C!D!D!E!E!F!F!G!G!H!H!I!I!J!J!K!K!L!L!M!M!2!N!O!O!P!P!Q!Q!R!R!S!S!T!T!U!U!V!V!W!W!X!X!Y!Y!Z!Z![![!\!\!]!]!^!^!_!_!`!p!a!q!b!r!c!s!d!t!e!u!f!v!g!w!h!x!i!y!j!z!k!{!l!|!m!}!n!~!o!!`!p!a!q!b!r!c!s!d!t!e!u!f!v!g!w!h!x!i!y!j!z!k!{!l!|!m!}!n!~!o!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $!$!$"$"$#$#$$$$$%$%$&$&$'$'$($($)$)$*$*$+$+$,$,$-$-$.$.$/$/$0$0$1$1$2$2$3$3$4$4$5$5$6$6$7$7$8$8$9$9$:$:$;$;$<$<$=$=$>$>$?$?$@$@$A$A$B$B$C$C$D$D$E$E$F$F$G$G$H$H$I$I$J$J$K$K$L$L$M$M$N$N$O$O$P$P$Q$Q$R$R$S$S$T$T$U$U$V$V$W$W$X$X$Y$Y$Z$Z$[$[$\$\$]$]$^$^$_$_$`$`$a$a$b$b$c$c$d$d$e$e$f$f$g$g$h$h$i$i$j$j$k$k$l$l$m$m$n$n$o$o$p$p$q$q$r$r$s$s$t$t$u$u$v$v$w$w$x$x$y$y$z$z${${$|$|$}$}$~$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,0,,1,,2,,3,,4,,5,,6,,7,,8, ,9, ,:, ,;, ,<, ,=,,>,,?,,@,,A,,B,,C,,D,,E,,F,,G,,H,,I,,J,,K,,L,,M,,N,,O, ,P,!,Q,",R,#,S,$,T,%,U,&,V,',W,(,X,),Y,*,Z,+,[,,,\,-,],.,^,/,_,,0,,1,,2,,3,,4,,5,,6,,7,,8, ,9, ,:, ,;, ,<, ,=,,>,,?,,@,,A,,B,,C,,D,,E,,F,,G,,H,,I,,J,,K,,L,,M,,N,,O, ,P,!,Q,",R,#,S,$,T,%,U,&,V,',W,(,X,),Y,*,Z,+,[,,,\,-,],.,^,/,_,`,a,`,a,b,kc,}d,}:e,>f,g,h,g,h,i,j,i,j,k,l,k,l,m,Qn,qo,Pp,Rq,q,r,s,r,s,t,t,u,v,u,v,w,w,x,x,y,y,z,z,{,{,|,|,},},~,?,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------- - - - - ------------------- -!-"-#-$-%-&-&-'-(-(-)-)-*-*-+-+-,-,---.-.-/-/-0-0-1-1-2-2-3-3-4-4-5-5-6-6-7-7-8-8-9-9-:-:-;-;-<-<-=-=->->-?-?-@-@-A-A-B-B-C-C-D-D-E-E-F-F-G-G-H-H-I-I-J-J-K-K-L-L-M-M-N-N-O-O-P-P-Q-Q-R-R-S-S-T-T-U-U-V-V-W-W-X-X-Y-Y-Z-Z-[-[-\-\-]-]-^-^-_-_-`-`-a-a-b-b-c-c-d-d-e-e-f-f-g-g-h-h-i-i-j-j-k-k-l-l-m-m-n-n-o-o-p-p-q-q-r-r-s-s-t-t-u-u-v-v-w-w-x-x-y-y-z-z-{-{-|-|-}-}-~-~-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~¦¦ææĦĦŦŦƦƦǦǦȦȦɦɦʦʦ˦˦̦̦ͦͦΦΦϦϦЦЦѦѦҦҦӦӦԦԦզզ֦֦צצئئ٦٦ڦڦۦۦܦܦݦݦަަߦߦ  !!"#"#$%$%&'&'()()*+*+,-,-././00112323454567678989:;:;<=<=>?>?@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonoppqqrrssttuuvvwwxxyzyz{|{|}y~~eħf\aljS§ç§çħŧƧǧȧǧȧɧʧɧʧ˧˧̧̧ͧͧΧΧϧϧЧѧЧѧҧҧӧӧԧԧէէ֧ק֧קا٧ا٧ڧڧۧۧܧܧݧݧާާߧߧ  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnoopqrstuvwxyz{|}~««ëëīīūūƫƫǫǫȫȫɫɫʫʫ˫˫̫̫ͫͫΫΫϫϫЫЫѫѫҫҫӫӫԫԫիի֫֫׫׫ثث٫٫ګګ۫۫ܫܫݫݫޫޫ߫߫  !A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0P1Q2R3S4T5U6V7W8X9Y:Z;;<<==>>??@@!A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0P1Q2R3S4T5U6V7W8X9Y:Z[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~()*+,-./0 1 2 3 4 56789:;<=>?@ABCDEFG H!I"J#K$L%M&N'O()*+,-./0 1 2 3 4 56789:;<=>?@ABCDEFG H!I"J#K$L%M&N'OPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnoopqrstuvwxyz{{|}~pqrstuvwxyz|}~                                                                  ! ! " " # # $ $ % % & & ' ' ( ( ) ) * * + + , , - - . . / / 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 : : ; ; < < = = > > ? ? @ @ A A B B C C D D E E F F G G H H I I J J K K L L M M N N O O P P Q Q R R S S T T U U V V W W X X Y Y Z Z [ [ \ \ ] ] ^ ^ _ _ ` ` a a b b c c d d e e f f g g h h i i j j k k l l m m n n o o p p q q r r s s t t u u v v w w x x y y z z { { | | } } ~ ~                                                                                                                                                                                                                                                                               !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~nnnnnnnnnnnnnnnnnn n n n n n n n n n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn n n!n!n"n"n#n#n$n$n%n%n&n&n'n'n(n(n)n)n*n*n+n+n,n,n-n-n.n.n/n/n0n0n1n1n2n2n3n3n4n4n5n5n6n6n7n7n8n8n9n9n:n:n;n;nn>n?n?n@n`nAnanBnbnCncnDndnEnenFnfnGngnHnhnIninJnjnKnknLnlnMnmnNnnnOnonPnpnQnqnRnrnSnsnTntnUnunVnvnWnwnXnxnYnynZnzn[n{n\n|n]n}n^n~n_nn@n`nAnanBnbnCncnDndnEnenFnfnGngnHnhnIninJnjnKnknLnlnMnmnNnnnOnonPnpnQnqnRnrnSnsnTntnUnunVnvnWnwnXnxnYnynZnzn[n{n\n|n]n}n^n~n_nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn"#$%&'()* + , - . /0123456789:;<=>?@A B!C"#$%&'()* + , - . /0123456789:;<=>?@A B!CDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~AAAAAACEEEEIIIINOOOOOUUUUYSAAAAAACEEEEIIIINOOOOOUUUUYY  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz[[\\]]^^__``AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz{{||}}~~x @@@@@}@@AAAAAACCCCCCCCDDEEEEEEEEEEGGGGGGGGHH&&IIIIIIIIII22JJKK8LLLLLL??AANNNNNNIJJOOOOOORRRRRRRRSSSSSSSSTTTTffUUUUUUUUUUUUWWYYYZZZZZZSOOUUAAIIOOUUUUUUUUUUAAAAGGKKOOOOJGGNNAAAAAAEEEEIIIIOOOORRRRUUUUSSTTHH !""$$AAEEOOOOOOOOYY456789:;<=>?@ABCDEFGHIJKLMNOPQRUXZ\]^_abdefgjklmnpqstvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~   # !"#$%&'()*+,-./ !"#$%&'()*+,-./   #``bbddffhhjjllnnpprrttttxxzz||~~--######''++      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUV      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~AABBBBBBCCDDDDDDDDDDEEEEEEEEEEFFGGHHHHHHHHHHIIIIKKKKKKLLLLLLLLMMMMMMNNNNNNNNOOOOOOOOPPPPRRRRRRRRSSSSSSSSSSTTTTTTTTUUUUUUUUUUVVVVWWWWWWWWWWXXXXYYZZZZZZHTWYSAAAAAAAAAAAAAAAAAAAAAAAAEEEEEEEEEEEEEEEEIIIIOOOOOOOOOOOOOOOOOOOOOOOOUUUUUUUUUUUUUUYYYYYYYYFGNOXZ\^~!!!!!!!!! ! ! ! ! !!!!!!!!!!!!!!!!!!! !!!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!`!a!b!c!d!e!f!g!h!i!j!k!l!m!n!o!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$ $ $ $ $ $$$$$$$$$$$$$$$$$$$ $!$"$#$$$%$&$'$($)$*$+$,$-$.$/$0$1$2$3$4$5$6$7$8$9$:$;$<$=$>$?$@$A$B$C$D$E$F$G$H$I$J$K$L$M$N$O$P$Q$R$S$T$U$V$W$X$Y$Z$[$\$]$^$_$`$a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$u$v$w$x$y$z${$|$}$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !"#$%&'()*+,-./0123456789:;<=>?@!"#$%&'()*+,-./0123456789:[\]^_`abcdefghijklmnopqrstuvwxyz{|}~           ! !"#"#$%$%&'&'()()*+*+,-,-././0iI1232345456767889:9:;<;<=>=>?@?@ABABCDCDEFEFGHGHIIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyzyz{|{|}~}~SSTVWY[`cihoru            !!"#"#$%$%&'&'()()*+*+,-,-././01012323445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSTUUVWXXYZZ[\\]]^^__`aabbcddeeffgghijjkkllmmnnoppqqrssttuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~PQRSTUVWX Y Z [ \ ]^_0123456789:;<=>? @!A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0123456789:;<=>? @!A"B#C$D%E&F'G(H)I*J+K,L-M.N/OPQRSTUVWX Y Z [ \ ]^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyxyz{z{|}|}~~            !!""##$$%%&&''(())**++,,--..//001a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUVWWXXYYZZ[[\\]]^^__``1a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUV            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~           ! !"#"#$%$%&'&'()()*+*+,-,-././01012323454567678989:;:;<=<=>?>?@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyxyz{z{|}|}~~`          ( )!*"+#,$-%.&/'( )!*"+#,$-%.&/'8091:2;3<4=5>6?78091:2;3<4=5>6?7H@IAJBKCLDMEFFGGH@IAJBKCLDMENNOOPPYQRR[STT]UVV_WXXYQZZ[S\\]U^^_Wh`iajbkcldmenfogh`iajbkcldmenfogpqrstuvwxyz{|}~~pqrstuvwz{xy|}!!!!!!!!!!!!!!!!!! ! ! ! ! ! ! ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!"!"!#!#!$!$!%!%!&!'!'!(!(!)!)!*!k+!,!,!-!-!.!.!/!/!0!0!1!1!2!2!3!3!4!4!5!5!6!6!7!7!8!8!9!9!:!:!;!;!!>!?!?!@!@!A!A!B!B!C!C!D!D!E!E!F!F!G!G!H!H!I!I!J!J!K!K!L!L!M!M!N!N!O!O!P!P!Q!Q!R!R!S!S!T!T!U!U!V!V!W!W!X!X!Y!Y!Z!Z![![!\!\!]!]!^!^!_!_!`!p!a!q!b!r!c!s!d!t!e!u!f!v!g!w!h!x!i!y!j!z!k!{!l!|!m!}!n!~!o!!`!p!a!q!b!r!c!s!d!t!e!u!f!v!g!w!h!x!i!y!j!z!k!{!l!|!m!}!n!~!o!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $!$!$"$"$#$#$$$$$%$%$&$&$'$'$($($)$)$*$*$+$+$,$,$-$-$.$.$/$/$0$0$1$1$2$2$3$3$4$4$5$5$6$6$7$7$8$8$9$9$:$:$;$;$<$<$=$=$>$>$?$?$@$@$A$A$B$B$C$C$D$D$E$E$F$F$G$G$H$H$I$I$J$J$K$K$L$L$M$M$N$N$O$O$P$P$Q$Q$R$R$S$S$T$T$U$U$V$V$W$W$X$X$Y$Y$Z$Z$[$[$\$\$]$]$^$^$_$_$`$`$a$a$b$b$c$c$d$d$e$e$f$f$g$g$h$h$i$i$j$j$k$k$l$l$m$m$n$n$o$o$p$p$q$q$r$r$s$s$t$t$u$u$v$v$w$w$x$x$y$y$z$z${${$|$|$}$}$~$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$  !A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0P1Q2R3S4T5U6V7W8X9Y:Z;;<<==>>??@@!A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0P1Q2R3S4T5U6V7W8X9Y:Z[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AaBbCcDdEeFfGgHhI1JjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz[[\\]]^^__``AaBbCcDdEeFfGgHh0iJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz{{||}}~~x  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz[[\\]]^^__``AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz{{||}}~~x           ! !"#"#$%$%&'&'()()*+*+,-,-././0iI1232345456767889:9:;<;<=>=>?@?@ABABCDCDEFEFGHGHIIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyzyz{|{|}~}~SCSTVWY[`cih=or u           !!"#"#$%$%&'&'()()*+*+,-,-././01012323445566778899:e,;<;<=>f,~,?,@ABABCDEFGFGHIHIJKJKLMLMNONOo,Pm,Qp,RSTUUVWXXYZZ[\\]]^^__`aabbcddeeffgghijjb,kllmmnnoppn,qrssttuvvwwxxyyzz{{||d,}~~DE            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnoopqpqrsrsttuuvwvwxxyyzz{|}~~{|}PQRSTUVWX Y Z [ \ ]^_0123456789:;<=>? @!A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0123456789:;<=>? @!A"B#C$D%E&F'G(H)I*J+K,L-M.N/OPQRSTUVWX Y Z [ \ ]^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyxyz{z{|}|}~~           ! !"#"#$%$%&&''(())**++,,--..//001a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUVWWXXYYZZ[[\\]]^^__``1a2b3c4d5e6f7g8h9i:j;k<l=m>n?o@pAqBrCsDtEuFvGwHxIyJzK{L|M}N~OPQRSTUV            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~--------- - - - - ------------------- -!-"-#-$-%-            !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AABBCCDDEEFFGGHHIIJJKKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxx}yzz{{||c,}~~           ! !"#"#$%$%&'&'()()*+*+,-,-././01012323454567678989:;:;<=<=>?>?@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonopqpqrsrstutuvwvwxyxyz{z{|}|}~~`          ( )!*"+#,$-%.&/'( )!*"+#,$-%.&/'8091:2;3<4=5>6?78091:2;3<4=5>6?7H@IAJBKCLDMEFFGGH@IAJBKCLDMENNOOPPYQRR[STT]UVV_WXXYQZZ[S\\]U^^_Wh`iajbkcldmenfogh`iajbkcldmenfogpqrstuvwxyz{|}~~pqrstuvwz{xy|}!!!!!!!!!!!!!!!!!! ! ! ! ! ! ! ! ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !!!!!"!"!#!#!$!$!%!%!&!'!'!(!(!)!)!*!k+!,!,!-!-!.!.!/!/!0!0!1!1!2!N!3!3!4!4!5!5!6!6!7!7!8!8!9!9!:!:!;!;!!>!?!?!@!@!A!A!B!B!C!C!D!D!E!E!F!F!G!G!H!H!I!I!J!J!K!K!L!L!M!M!2!N!O!O!P!P!Q!Q!R!R!S!S!T!T!U!U!V!V!W!W!X!X!Y!Y!Z!Z![![!\!\!]!]!^!^!_!_!`!p!a!q!b!r!c!s!d!t!e!u!f!v!g!w!h!x!i!y!j!z!k!{!l!|!m!}!n!~!o!!`!p!a!q!b!r!c!s!d!t!e!u!f!v!g!w!h!x!i!y!j!z!k!{!l!|!m!}!n!~!o!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!$$$$$$$$$$$$$$$$$$ $ $ $ $ $ $ $ $ $ $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ $ $!$!$"$"$#$#$$$$$%$%$&$&$'$'$($($)$)$*$*$+$+$,$,$-$-$.$.$/$/$0$0$1$1$2$2$3$3$4$4$5$5$6$6$7$7$8$8$9$9$:$:$;$;$<$<$=$=$>$>$?$?$@$@$A$A$B$B$C$C$D$D$E$E$F$F$G$G$H$H$I$I$J$J$K$K$L$L$M$M$N$N$O$O$P$P$Q$Q$R$R$S$S$T$T$U$U$V$V$W$W$X$X$Y$Y$Z$Z$[$[$\$\$]$]$^$^$_$_$`$`$a$a$b$b$c$c$d$d$e$e$f$f$g$g$h$h$i$i$j$j$k$k$l$l$m$m$n$n$o$o$p$p$q$q$r$r$s$s$t$t$u$u$v$v$w$w$x$x$y$y$z$z${${$|$|$}$}$~$~$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$,0,,1,,2,,3,,4,,5,,6,,7,,8, ,9, ,:, ,;, ,<, ,=,,>,,?,,@,,A,,B,,C,,D,,E,,F,,G,,H,,I,,J,,K,,L,,M,,N,,O, ,P,!,Q,",R,#,S,$,T,%,U,&,V,',W,(,X,),Y,*,Z,+,[,,,\,-,],.,^,/,/,,0,,1,,2,,3,,4,,5,,6,,7,,8, ,9, ,:, ,;, ,<, ,=,,>,,?,,@,,A,,B,,C,,D,,E,,F,,G,,H,,I,,J,,K,,L,,M,,N,,O, ,P,!,Q,",R,#,S,$,T,%,U,&,V,',W,(,X,),Y,*,Z,+,[,,,\,-,],.,^,_,_,`,a,`,a,b,kc,}d,}:e,>f,g,h,g,h,i,j,i,j,k,l,k,l,m,Qn,qo,Pp,Rq,q,r,s,r,s,t,t,u,v,u,v,w,w,x,x,y,y,z,z,{,{,|,|,},},~,?,@,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,--------- - - - - ------------------- -!-"-#-$-%-&-&-'-'-(-(-)-)-*-*-+-+-,-,-----.-.-/-/-0-0-1-1-2-2-3-3-4-4-5-5-6-6-7-7-8-8-9-9-:-:-;-;-<-<-=-=->->-?-?-@-@-A-A-B-B-C-C-D-D-E-E-F-F-G-G-H-H-I-I-J-J-K-K-L-L-M-M-N-N-O-O-P-P-Q-Q-R-R-S-S-T-T-U-U-V-V-W-W-X-X-Y-Y-Z-Z-[-[-\-\-]-]-^-^-_-_-`-`-a-a-b-b-c-c-d-d-e-e-f-f-g-g-h-h-i-i-j-j-k-k-l-l-m-m-n-n-o-o-p-p-q-q-r-r-s-s-t-t-u-u-v-v-w-w-x-x-y-y-z-z-{-{-|-|-}-}-~-~-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_``aabcbcdedefgfghihijkjklmlmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~¦¦ææĦĦŦŦƦƦǦǦȦȦɦɦʦʦ˦˦̦̦ͦͦΦΦϦϦЦЦѦѦҦҦӦӦԦԦզզ֦֦צצئئ٦٦ڦڦۦۦܦܦݦݦަަߦߦ  !!"#"#$%$%&'&'()()*+*+,-,-././00112323454567678989:;:;<=<=>?>?@A@ABCBCDEDEFGFGHIHIJKJKLMLMNONOPQPQRSRSTUTUVWVWXYXYZ[Z[\]\]^_^_`a`abcbcdedefgfghihijkjklmlmnonoppqqrrssttuuvvwwxxyzyz{|{|}y~~§§ççħħŧŧƧƧǧǧȧȧɧɧʧʧ˧˧̧̧ͧͧΧΧϧϧЧЧѧѧҧҧӧӧԧԧէէ֧֧קקاا٧٧ڧڧۧۧܧܧݧݧާާߧߧ  !A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0P1Q2R3S4T5U6V7W8X9Y:Z;;<<==>>??@@!A"B#C$D%E&F'G(H)I*J+K,L-M.N/O0P1Q2R3S4T5U6V7W8X9Y:Z[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~()*+,-./0 1 2 3 4 56789:;<=>?@ABCDEFG H!I"J#K$L%M&N'O()*+,-./0 1 2 3 4 56789:;<=>?@ABCDEFG H!I"J#K$L%M&N'OPPQQRRSSTTUUVVWWXXYYZZ[[\\]]^^__``aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~  !!""##$$%%&&''(())**++,,--..//00112233445566778899::;;<<==>>??@@AaBbCcDdEeFfGgHhI1JjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz[[\\]]^^__``AaBbCcDdEeFfGgHh0iJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz{{||}}~~x@[@[@@@bad allocation`@h@m@@h@m@@@(@8@P@h@@ $ device or resource busyinvalid argumentno such processnot enough memoryoperation not permittedresource deadlock would occurresource unavailable try again(       !''257CPR Wm no&py{)&' i  a d )'' ' '&'('3'4'p5'g6'7'm8's9':'{;'='?'f@'dA'eB'tC'vD'uE'jF'lG'wH'qI'~L'M'kO'&Q'n@@fH@dh@ex@q@@!@ؓ@ @h@ @j @g8@kX@lp@@m@@)@ؔ@@@&@((@n@@oX@*p@@@@@Е@@s@t@u@v @w8@ H@y`@'h@x@z@{@@|ؖ@@@ @(@@@P@}`@~p@ 8@@i@p@P@@ؗ@@ @@(@@@$h@ @"X@p@@@@@ؘ@@r@ @0@successaddress family not supportedaddress in useaddress not availablealready connectedargument list too longargument out of domainbad addressbad file descriptorbad messagebroken pipeconnection abortedconnection already in progressconnection refusedconnection resetcross device linkdestination address requireddirectory not emptyexecutable format errorfile existsfile too largefilename too longfunction not supportedhost unreachableidentifier removedillegal byte sequenceinappropriate io control operationinterruptedinvalid seekio erroris a directorymessage sizenetwork downnetwork resetnetwork unreachableno buffer spaceno child processno linkno lock availableno message availableno messageno protocol optionno space on deviceno stream resourcesno such device or addressno such deviceno such file or directorynot a directorynot a socketnot a streamnot connectednot supportedoperation canceledoperation in progressoperation not supportedoperation would blockowner deadpermission deniedprotocol errorprotocol not supportedread only file systemresult out of rangestate not recoverablestream timeouttext file busytimed outtoo many files open in systemtoo many files opentoo many linkstoo many symbolic link levelsvalue too largewrong protocol typekernel32.dllGetCurrentPackageIdGetSystemTimePreciseAsFileTimeGetTempPath2W  ) @h@h@m@bad exception@Т@آ@@ @ @ @ (@ 4@@@ P@ `@ p@x@ @ @ +@@@@@@@ģ@ȣ@̣@У@ܣ@ @@@@@Y @@8@@@@@@@@@@Y @ @@@@@ @$@(@,@0@4@8@@@ P@ `@h@x@@@@ؤ@@@8@X@#@@ ȥ@@&@0@@@D@P@`@#@@ @@Ц@@%@$@@%h@+@@ @"@(8@*h@@ @@ +@@ب@@@0@+@ @Y @ @@@@P@__based(__cdecl__pascal__stdcall__thiscall__fastcall__vectorcall__clrcall__eabi__swift_1__swift_2__swift_3__ptr64__restrict__unalignedrestrict( new delete>><<!==!=[]operator->++-+->*%<=>>=()~^&&||*=+=-=/=%=>>=<<=&=|=^=`vftable'`vbtable'`vcall'`typeof'`local static guard'`string'`vbase destructor'`vector deleting destructor'`default constructor closure'`scalar deleting destructor'`vector constructor iterator'`vector destructor iterator'`vector vbase constructor iterator'`virtual displacement map'`eh vector constructor iterator'`eh vector destructor iterator'`eh vector vbase constructor iterator'`copy constructor closure'`udt returning'`EH`RTTI`local vftable'`local vftable constructor closure' new[] delete[]`omni callsig'`placement delete closure'`placement delete[] closure'`managed vector constructor iterator'`managed vector destructor iterator'`eh vector copy constructor iterator'`eh vector vbase copy constructor iterator'`dynamic initializer for '`dynamic atexit destructor for '`vector copy constructor iterator'`vector vbase copy constructor iterator'`managed vector copy constructor iterator'`local static thread guard'operator "" operator co_awaitoperator<=> Type Descriptor' Base Class Descriptor at ( Base Class Array' Class Hierarchy Descriptor' Complete Object Locator'`anonymous namespace'@@@api-ms-win-core-fibers-l1-1-1api-ms-win-core-synch-l1-2-0kernel32api-ms-FlsAllocFlsFreeFlsGetValueFlsSetValueInitializeCriticalSectionEx@-@PE@`E@@XE@hE@pE@xE@E@e[e @@e XTT++++,,++:,',0,,,,++k-d-]-V-O-E-;-1-'-+.$.....---/ //......~/d0//j0O0@0/]0%00/300//F2?212#222111v3o3a3S3E3133 324444444w4i4.(@P.@(.xЮP.@h. 8XЮPh.@ .دP.@(/@8/xPدP8/@x/ذ@دP/@0h(0@@0(8@0@`/`P`/@/ @P/@/hP/@@CHHILs[Mc ""=#R###-7U7w777777788"848<8S8Z8ʹ`@PBh"@)6RSDSkTS=/Fp {D:\winx64-packages\build\client\RelWithDebInfo\mariadb-upgrade.pdbA.text$dip.text$mn +@.text$mn$00`+@ .text$mn$216.text$x9.text$yd@P.idata$5PE8.00cfgE.CRT$XCAE.CRT$XCAAE.CRT$XCUE.CRT$XCZE.CRT$XIAE.CRT$XIAAE.CRT$XIACE.CRT$XICE.CRT$XIZE.CRT$XPAE.CRT$XPZE.CRT$XTAE.CRT$XTZFPf .rdataP.rdata$00.rdata$r.rdata$voltmd.rdata$zzzdbgظ.rtc$IAA.rtc$IZZ.rtc$TAA.rtc$TZZp".xdatah.xdata$x.idata$2.idata$3 P.idata$4p .idata$6h..datah.p.data$r/.data$rs`0.bss0.pdataP_RDATA`.rsrc$01` .rsrc$02d 4R pRp`0Rp`0b20rp!d 7D70!4D7V78!D7V78! 7D70  4 2p)L0@!tJdK33!tJdK33!33tT !40!d0X!0X!0!4WRp`P X`!t[4Z(/)T!t[4Z(/)T!(/)T  4 2p!4`  !`  d 4 p!4@y!4@y!@y P0p!tTdSTR(!(`!t T41[1h!tT41[1h!1[1hP!d4 !Ԧħt 8!Ի! 8!Ի! 0!tp::(!p::(!4= >T!t >>\! >>\!4= >T x!  dT4;;!t;<!;<!d;;!;;  4 pB20dT2 p!4PBB8!PBB8+ +d8$472pP T4p`&&4dT2 p t dT42  T 2`!tGGн!4GGܽ!GGܽ!GGн6 6 1t 4 2 `P  d 2p!4KK@!KK@T 2 `!  4 t @LLp!@LLp!t 4 @LLp&p`P0  4M J`@!tLPQ!PQ 4J Hp0! !d !T !4 !2pR0! t d PTVTP!TVTTX!VTTX!PTVTP$  p`P00 'p`P0 dT42pbp0!dT[[![[  d Rp!4ll4!ll42p!4ggd!ggd  d 2p!4Pjj!Tjj!jj!T4Pjj!Pjj4 2 !  tdiJi!iJi!tdiJiB`(it6.6( d342, p PP  b!4n2n!4n2n!n2n 4R p`P( f@:f@t T42!dP^^!P^^!dP^^  B`0!## t T `__h! t T `__h!`__h!t d^d! d^d' T$4# p `$ $t&$d%$4$$P X!$ $RST TW4\p4!dV'H!tU'vl!'vl!'H!Rp4!p4 t d T 4 r ě  p`0P4"4 pP !$$dpvv!pvv!pvv 4R p ` P 4K Fp  dY4Z[ pP!==3(td T 4 ! '`P0 !22&#/.t- !  Ip`P0!4H`P!`P!4H@P!@P d T 4 Rp d T 4 Rpd 4 R p!T p!p2`!t4! d4 p P!h¯H!h¯H!¯H d T 4 2p!`ۭ!`ۭd T 4Rp)Ip00$H 00!4(!(rst~4| up`P  20  4 2`!tԾl!tԾlHHT 0! d@!t!!@d42 p  2p`!T 4`! ! !T 4`e eS K :4 Bp`P!td4(!(] ]dUMTTMp0P!L!$d4 pP%0Pp!t!d4!H!H!4!!Lp`0@!KTTJ ! $dO4NJ p@ T 4p`  B 42p`P d T4p`!t T4`uX!tT4`uX4rp`P0 4K Hp0  T 2p!  d4!* %#M p`0PP!d!!JpP0@!dSPD!PD!d4d!db&  p`P0# 4 p`PPp ` 0!  T!   ! ! p`P0@0 4~ p`P 3 !t!d!T!4! 0" pP!d@$$!$$4$%!4$%!@$$ d#h p0P..hD P!{ {f^VNF>61x*=#>?@tA dB4C++l!++l! x=>?@tAdB4C++lx, p 0 P!D Dh<'/(")*d+,!(*,!*,!,!t 0! 0d T42p!P##!P## d T 4 2p  2 pP! d 4 AA!d AA!AA 42 p`Pd42 p!P  !P   42 p ` PB`0! t PC{C!  T{CC!{CC! PC{C 4 pPPT 4Rp td4P  2p`0! T Pupu!PupuT 4 2 p!d[\![\ t T 4 2!d ]f]! ]f]dp!4@^^^4!@^^^4!d__!__!4``4!``4T 4 2 p `+ +t #4 T 2 `/ /t 4 T 2 ` d T 42p  2p0! d T@tct!@tct00!td pHpH!pHpH T 4 2 p!d PHH!PHHT 4 2 p `!d @JxJ!@JxJ& &t T 4 `& &t T 4 ` tdT4 p0H!  {A|<!d TA|}T!A|}T!{A|<4! !d!T!4!pt d4T 4 Rp`  t4 tdT4H HtCd>T94H HCt>T94`P PLtGdBT=44p`Pp 4 pp tdT4 d T 4 2pt dT2!4 h! h+ +t#4dT . .4dT ptd T4 dT4 Rp 4 2 p ` P  4 2 pP!  d@a|!@a| dT 4 Rpd T 4 rpT 4 2 p `! p!p dT4p!d! 4 r p`04  p`P! jx! jxB  4 rprp`00 d 4R p@mr6r6r2P "@K6P  4 RP4Pd4 p#d T 4 rp0td42  4 pp`0@)R( hP2h`>>Rp0Pp4p`P@)8R(AH h`B]p`pd4 p tdT4P% %htdT4dT4p 0@7rpP0 dT4rp  @ 7 BP0+ h  p`0*{A9{4W9RP p`0@B  8 B  8  8   8 d T 4 2pr0@6ge8rP t dT42  t d 4 R@=w]ww td42@%; dT4p* 1 p`0Pp 4p ` P' ' p`0P(  4 2p@*P*9P* hh.@e.e.e.e hh /(0f8/(d h`/ h`/ h/hpHB @xnXCDX8DBBB`:@E@Z CX|8ChBB| &4BPf.DThx<Zr0<L`l$@^ZL$ztos4>6p>zRH BZR>0" ~lZpHzT f(.$\2H>P8(WS2_32.dllGetModuleFileNameA|InitializeCriticalSectionAEnterCriticalSectionLeaveCriticalSectionDeleteCriticalSection/GetCurrentThreadIdTlsAllocTlsGetValueTlsSetValueCreateFileADeleteFileATGetFileAttributesAFSetFileInformationByHandleCloseHandletGetLastErrorSleepMoveFileALockFileExUnlockFileExWSetLastErrorTlsFreeGetACPGetConsoleCPGetConsoleOutputCPSetConsoleCP$SetConsoleOutputCPGetTempPathA GetTempFileNameAGetStdHandleSSetHandleInformationCreatePipeWaitForSingleObjectTerminateProcessPGetExitCodeProcessCreateProcessA)WideCharToMultiByteCGetWindowsDirectoryAGetSystemWindowsDirectoryAyInitializeConditionVariable WakeConditionVariableSleepConditionVariableCSReleaseSRWLockExclusiveAcquireSRWLockExclusiveTryAcquireSRWLockExclusivedQueryPerformanceCountereQueryPerformanceFrequencyGetSystemTimeAsFileTimeReadFile6SetEndOfFileISetFilePointerEx=WriteFile*GetCurrentProcessjGetFullPathNameA{GetLogicalDrivesKERNEL32.dll!_errno*_stricmpstrncmpstrncpyUexit__acrt_iob_funcwfflushzfgetsfputcputs__stdio_common_vfprintfPatoidstrtoulcallocfreeA_set_abort_behaviorcsignalW_setmodeG_set_invalid_parameter_handlerT_set_fmodegetenv3_tzsetsetlocale9_invalid_parameter_noinfo_noreturnJ_open_osfhandletfcloseTabort}ceilfuiswctype_getwch _cputsstrcat_sfputsstrcmpputcharastrtol!_strtoi64'_strtoui64_beginthreadexmalloc_findclose _findfirst64i32 _findnext64i32_close7_get_osfhandle!_umask}fopenreallocnisspacegiscntrl&_filenotoupperestrerror_sstrnlen__fpe_flt_roundsapi-ms-win-crt-runtime-l1-1-0.dllapi-ms-win-crt-string-l1-1-0.dllapi-ms-win-crt-stdio-l1-1-0.dllapi-ms-win-crt-convert-l1-1-0.dllapi-ms-win-crt-heap-l1-1-0.dllapi-ms-win-crt-environment-l1-1-0.dllapi-ms-win-crt-time-l1-1-0.dllapi-ms-win-crt-locale-l1-1-0.dllapi-ms-win-crt-math-l1-1-0.dllapi-ms-win-crt-conio-l1-1-0.dllapi-ms-win-crt-filesystem-l1-1-0.dllRtlCaptureContextRtlLookupFunctionEntryRtlVirtualUnwindUnhandledExceptionFilterSetUnhandledExceptionFilterIsProcessorFeaturePresent+GetCurrentProcessIdInitializeSListHeadIsDebuggerPresentGetModuleHandleWGetProcAddressRtlPcToFileHeader{RaiseExceptionRtlUnwindEx=EncodePointer}InitializeCriticalSectionAndSpinCountFreeLibraryLoadLibraryExW@_seh_filter_exeB_set_app_type __setusermatherr_configure_narrow_argv3_initialize_narrow_environment(_get_initial_narrow_environment6_initterm7_initterm_e#_exit__p___argc__p___argv_cexit_c_exit=_register_thread_local_exe_atexit_callback_configthreadlocale_set_new_mode__p__commode4_initialize_onexit_table<_register_onexit_function_crt_atexit_callnewhgterminateB_isatty!_fdopen;_getcwdstrcpy_swcsncmpF@F@8F@`F@F@F@F@G@PH@H@I@I@I@ J@XJ@J@J@K@8K@pK@K@K@0L@L@L@L@ M@XM@M@M@N@8N@pN@N@O@0O@O@Q@R@ S@S@`T@T@U@pV@@X@X@PZ@Z@@[@`[@[@^@_@`@@a@a@a@b@Pb@c@c@c@d@d@pl@Pm@pq@q@8r@hr@r@s@t@Ht@pt@t@0u@pw@w@x@x@y@y@z@z@{@{@|@|@}@x}@}@~@~@@@@@ @@@@@@@@`@@(@P@@ @@P@@P@Ј@`@@@@p@@@@@p@@@@@@@P@P@P@@@P@П@P@Ƞ@@@@@@@@@@@@@@ @@@P@@ @@@@@`@@@@X@@@ @@@@@@@`@@д@0@@@@@0@@@P@@P@й@@@@0@@`@@@@@0@@0@@@@@`@p@@@@`@@@P@@@p@@P@@0@@@h@@@@@@`@@F@8@8F@p@G@@@@@@@P@@@@@0@@@@@@@@@@@@@p@@@@@0 @ @0 @p @@0@@@@@@@@@@@P@&@(@P+@-@@@@0.@@@@.@@@@.@3@@3@3@>@3@PA@C@C@D@pD@D@PE@pE@F@H@pJ@3@@@@K@K@L@0L@L@@M@@@@M@N@@@@`N@N@ O@O@O@@@@P@O@@@@HP@`P@P@P@P@P@Q@R@T@ T@XT@T@T@T@`@ [@T@`[@`@`@T@`@`@g@T@g@`@z@T@@z@`@p@T@@`@@T@@`@h@T@@`@P@T@@`@@T@P@`@ @T@`@`@H@T@@`@@T@P@`@@T@@`@0@T@`@`@p@T@@`@@T@@`@0@T@`@`@@T@ @`@@!@T@p!@`@$@T@ %@`@(@T@)@`@T@,@`@T@0@`@T@4@`@T@9@`@T@P=@`@T@G@`@P@S@Y@`\@d@j@k@n@q@u@@y@P}@@@0@@@@Д@0@@@p@@@@@@@@@ @@@T@@`@T@`@`@ @@@@ @p@0@@ @ @@@@p@@%@ )@ -@P1@`5@7@9@;@=@PA@D@PH@K@M@O@ V@\@^@`@b@d@h@l@o@s@@u@`w@}@@@@@@Ў@p@@p@И@ @T@0@`@@@@ @@@@T@@`@@T@@`@H@T@p@`@@@H@T@@P@@@`@0@T@p@`@@T@P@`@h @T@ @`@V@T@V@`@xZ@T@Z@`@``@T@`@`@h@T@Ph@`@m@T@m@`@q@T@q@`@w@T@x@`@@T@0@`@x@T@@`@@(@T@`@`@@@T@ @`@ @T@`@`@h@T@@`@P@T@@`@@T@@`@@T@`@`@@T@@@`@p@T@@`@0@T@p@`@0@T@`@`@@ @,@4@?@@h@bp@ @p@ ȡ@p@0@0@ء@dp@ @#@  @e0@0@0@`@Tp@0@0@@p@ @l@`7@`7@ @v@0@0@P@f`@0@0@ԣ@h@ @p@P7@P7@ p@Wx@@k@X7@X7@ Ԥ@P@ p@*@ @@0@0@إ@S@ @@@@T@`@`0@`0@ @ @h0@h0@ @@p0@p0@ (@!8@x0@x0@ `@h@0@0@ @q@0@0@ ȧ@rا@0@0@ @" @0@0@ P@bp@0@0@@t@ @s0@0@0@@u@@@ @v@0@0@P@VX@@k@0@0@p@h@0@0@Ԭ@@@@@ @@@@@Э@@@@@ @ (@<@D@@@p@@ @@ @(@0@8@P@P@H@g@е@е@е@е@е@е@е@е@P@е@P@е@P@е@P@е@P@е@е@P@е@P@е@е@@P@е@е@е@P@е@е@е@е@е@е@е@е@е@е@е@P@P@P@е@е@е@е@P@е@P@е@P@е@P@е@P@е@P@е@P@е@е@P@е@е@е@е@е@е@е@P@P@е@P@P@е@е@е@е@е@е@е@е@е@е@е@е@е@е@е@е@е@е@е@P@е@е@е@е@е@е@е@е@е@P@е@е@е@е@P@е@е@е@е@P@е@P@P@е@е@P@е@е@@@@е@е@P@е@е@P@е@е@&@@(P*@        ! 5A CPR S WY l m pr   )     е@@@ @H@p@@@+@@8@X@x@@@@ @P@x@@@p@@@8@h@@@@h@@@@(@P@@@@8@P@@@@@@+@0-@H@P@T@X@\@`@h@p@x@@@@@@@@@@@@@@@@(@P@@@@ @8@P@h@@@@@@8@X@x@@@@@ @H@@@@@P@@@@@@8@X@@@@@@@x@@@0@h@@@@@H@x@@@H@x@@@@ @H@X@p@@@@@@@@@@@@@@@x@@@@@ @!@@+@@@@@@ @P @qo#ſt[Am-jd8n헧?O>. 8/t#ڰͼ3&N|.[Ӿr؇/PkpnJؕnq&fƭ$6ZB<TcsUe(U܀n_Sp1@t1@x1@1@1@1@ 1@} ((((( H   !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ABCDEFGHIJKLMNOPQRSTUVWXYZ{|}~! @ @+@` @p @p @p @a@ ` @p @.@ @H @ 8 @2@3@4@a@ @ @ @             ?1 @ @+@ @ @ @P @ @ d'@Bʚ; TvHrN @zZƤ~o#]xEcd #NJ_a @Y @+@ @ @ @ @X @ X @ X @ @( @0 @8 @@ @H @P @w @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@@@'@/@7@?@G@O@W@@b@@d@@f@@h@@j@@l@@n@@p@@r@@t@@v@@x@Y@@z@@@@@@@@@@@@@@@@@@@@@@@@@@z@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@"@@*@@2@@:@@B@@J@@R@@Z@@b@@j@@r@@z@@@ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @@@@@'@/@7@?@G@O@ d'@B2-+] fu@X@.?AVbad_array_new_length@std@@X@.?AVbad_alloc@std@@X@.?AVexception@std@@X@.?AVruntime_error@std@@X@.?AVsystem_error@std@@X@.?AV_System_error@std@@X@.?AVlogic_error@std@@X@.?AVlength_error@std@@X@.?AVbad_exception@std@@X@.?AVerror_category@std@@X@.?AV_Generic_error_category@std@@X@.?AVtype_info@@wP(#0(00XXQ(`   AA`Ⱥ`B ( < 2X@yyPP  8!Ի8!((((((/)T/)*h*b+b+o+o+5,,, ,#-0-.غ.081[1h[13p3m3m3z333355555й5557 7D70D7V78V77L77`77p780888909a:(p::(:7;07;;D;;;<<==Լ==Y=Y==== = >T >>\>j?pj?????@(AA(AAANBPBB8BBHBC\CDlEGGGGGнGGܽGHH;H;HWH`HQI`IKJPJK$KK@K1LL1Lj(>jJj8Pjjjjjkk l l/l/l(@y(|(C0D00)0,f0h(00X(DdL(  HH0t\|0PP0Ps(ilGHhp%(op;l0(;00_t`"(H0'(:(<N(Ph0h0?@WX((1,8g0((;(<U(X_(`(y|}`ADMHP00{ |0 0@ $  0   XX$```,r0t0`` `g"`h"###0$F$0H$$0$$$E%%%(%%(&&&(0&w&(&&h&'`''h'(`@))H*]*@*+H0+2+P+V+++P+/`@/P/hP/5`56`6667P777e8Le88@888A9LA9W9W9z999(_0pHseQ=)mYEX `@x mYEuN4:-pPseWI 8 o    @       X  b"["M"?"1"#"""! 8Ph  `HaH4VS_VERSION_INFO  ?StringFileInfo040904E42 FileVersion11.4.0.06 ProductVersion11.4.0.0DVarFileInfo$Translation  UTF-8@ PX`hpȥ<آ08@HPX`hpxP (08@HPX`hpxȮЮخ ȠРؠ (08HPX`hpxȡСء (0hxȢآ(8HXhxȣأ8HXhxȤؤ(8HXhx8Xجد (Xh8HXhpxȢТآ (08@HPxȦЦئة (08@HX`hpxȪЪت (08@PX`hpxȫP P d(08@HPX`hpxȨШب (08@HPX`hpx` بȪت誘p 8h`ȡС(`@HPXpxȪЪXhxȮخ(8HXhxȯد(8HXhxȠؠ(8HXhxȡء(8HXhxȢآ(8xЫ 0@P`pЬ 0@P`pЭ 0@P`pЮ 0@P`pЯx 0@P`pР 0@P`pС 0@P`phpx (ȫЫث (08@HPX`hpxȠРؠ (08@HPX`hpxȡСء (08@HPX`hpxȢТآ (08@HPX`hpxȣУأ (08@HPX`hpxȤФؤ (08@HPX`hpxȥХإ (08@HPX`hpxȦЦئ (08@HPX`hpxȧЧا (08@HPX`hpxȨШب (08@HPX`hpxȩЩة (08@HPX`hpxȪЪت (08@HPX`hpxȫЫث (08@HPX`hpxȬЬج (08@HPX`hpxȭЭح (08@HPX`hpxȮЮخ (08@HPX`hpxȯЯد (08@HPX`hpxȠРؠ (08@HPX`hpxȡСء (08@HPX`hpxȢТآ (08@HPX`hpxȣУأ (08@HPX`hpxȤФؤ 0XhpxЦ(8`pȨب0@HPhxЪ8HPXpج@PX`ȭ (0xHX`hȯЯ (08P`ȡСء 08@XhpxУأ࣐ФؤHPXhpȥХ (08@HPX`hpxȦЦئ (08@HPX`hpxȧЧا (08@HPX`hpxȨШب (08@HPX`hpxȩЩة (08@HXh (08@HPX`hpxȬЬج (08@X`pxȭЭح 08@HPX`hpxȮЮخ (08@HPX`hpxȯЯد0| (08@HPX`hpxРX` 8Ph 08@HhЦ(X`p`  (Hxȩ`ȭ(pxȢ袈Pج<ȥȭDȥȭx Ȣ<ȥ(pxȪ誈P ؤ  @h8`د0 @'0' *H '0'10  `He0\ +7N0L0 +70 010  `He 1$(Ib_?SP>ЩJ5 w00kE3ÅeHEQ0  *H  0L1 0U GlobalSign Root CA - R610U  GlobalSign10U GlobalSign0 141210000000Z 341210000000Z0L1 0U GlobalSign Root CA - R610U  GlobalSign10U GlobalSign0"0  *H 0 sf{< E ,H[!C7y2,LC)0Ӭ!3vT"*M .phS\ӝD DfFm%]1QTFMۙ\xy]>LUop0BF“}c{?q|蘮x4% k;AHzswiǶ\X(+l^m{%7hB]Pu6i{ni HY{`zdiCLlS-^r>TȽgLEӹ0#LٙZW̻S,Ğ4L$x_|Jt%>K,V8\yt-a ~~OY_-CRF fGywT[$7EZNDHذ IIeqnE>l gZɤ0Y0A @.@]|Gt0  *H  0L1 0U GlobalSign Root CA - R610U  GlobalSign10U GlobalSign0 180620000000Z 341210000000Z0[1 0 UBE10U GlobalSign nv-sa110/U(GlobalSign Timestamping CA - SHA384 - G40"0  *H 0 0#tu_GRa:c|9#ymt1t'b['W54Ǭ fm(J,prZ]vD|A$O6A-xNC1ϼ;njĈK&ɠL?][eE T=TSnT1;z}X߁jle*!ǔB; F=zeV.X=SM[trK 7 ЫZՙ?O57R%4gIz) ]ևCtp({*o mV >$g& {gXAUnŻLKBo6df!#4DIgZf3ޙ%qn]L`<rBM&wW a&ȲMdE?Tvlj"\ )K7tf4s}|^=PmW~7k)0%0U0U00UiWE93@ýe0U#0lgS0>+2000.+0"http://ocsp2.globalsign.com/rootr606U/0-0+)'%http://crl.globalsign.com/root-r6.crl0GU @0>0<U 0402+&https://www.globalsign.com/repository/0  *H  Wg+B_ Ļ(VLp :`39k@I%֤ AOἫ#ƅK$D¤вVeނȷaӵFHgzJbг4HEUJ^rqvp7W܍8X©~n&*Hdi/Қr$KtZ}r5WLSLIUOuoJ.jʈ0Ns^֙}K,kY7 ,Eֲnuڍ[/.=}0{|ŬQ0QV`|=" $S'H',y<㪄>J!b0H'|uBkkX4 P{H+Uٍ% QclraJCWŝ<1@l - ƍmqR!>9/z -j<SMGY|CA%,~ } `r@P CD YxƤj"0h0PH=ŠM W)0  *H  0[1 0 UBE10U GlobalSign nv-sa110/U(GlobalSign Timestamping CA - SHA384 - G40 220406074158Z 330508074158Z0c1 0 UBE10U GlobalSign nv-sa1907U 0Globalsign TSA for MS Authenticode Advanced - G400  *H 0P* 蜤!(t#^/] P_v#&5!ﵢ:Ő! 'd;ړV/BCL<cL[]X9(^v#0 emtE:Fuޢ*p|v]Ϊⵣn@vN4T$Wv죣u(kKR+x*1,Lo&.hlM|j˾u/A@ ψ ɰCkQBQ(';]w)A*f}Rs\BӍţ7s$BCєK~mN{ "KIIp-O4`>00U0U% 0 +0U[k{pt *Ĺ@J0LU E0C0A +20402+&https://www.globalsign.com/repository/0 U00+009+0-http://ocsp.globalsign.com/ca/gstsacasha384g40C+07http://secure.globalsign.com/cacert/gstsacasha384g4.crt0U#0iWE93@ýe0AU:0806420http://crl.globalsign.com/ca/gstsacasha384g4.crl0  *H  .k>`ܕ_ $QUaeq $W }/j`3UVvT;\!^*5MF˦L@``,2 xVKprLkt>y|vwH Ò /?k5շo|X? IL𴗧Mj%4bfxis_r5X&2zkr936>a$~v"T@. vi= T,+["8d@᩟Ao&j(@/NvPM#Ok)l0>P+9ŲM'$vؾT vX<$6/YӒ`RF%~ٓ.TsL78PVOɡl/ o-h#'cˬg,?zG`?hXJ¡­ޢקU|MJDف=%U_k6lrZɠA@jucZ33~s:s{ r00@`ҜL^ͩ0  *H  0b1 0 UUS10U  DigiCert Inc10U www.digicert.com1!0UDigiCert Trusted Root G40 210429000000Z 360428235959Z0i1 0 UUS10U DigiCert, Inc.1A0?U8DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA10"0  *H 0 մ/B(x]9YB3=pŻą&0h\4$KOxCgROẂ>Mp$d}4}LWkC;GZL %Ӌ eI5=Q!xE.,IpB2ehMLHRhW]eO,HV5.7|2t9`ֹ1ܭ#GGnmjg-ҽD; Ǜ2Zj`TI\o&ղ8Αoa4\E(6*f(_s΋&%\Lb^3 +6yue̻HPwPFaX|<(9Է SGu00v[K]taM?v޿Xr)Am&vhAX&+MYxρJ>@G_ɁPs#!Y`dT!8|fx8E0OcOL SA|X=G2 l< VY0U0U00Uh7;_a{eNB0U#0q]dL.g?纘O0U0U% 0 +0w+k0i0$+0http://ocsp.digicert.com0A+05http://cacerts.digicert.com/DigiCertTrustedRootG4.crt0CU<0:08642http://crl3.digicert.com/DigiCertTrustedRootG4.crl0U 00g 0g 0  *H  :#D=v:VH4,tfrʯl0'DK|&7:]Hm?I'EPv~7q"Zj PyH~؀aVv_C>v9=ԙJ(_&XH'?v`\ 98Nn6!SZj>C3O8Tm]@3|╲!usRF4Kov7,?&C p)5\8U7 1.\9qᾜ &gN_zI.t<V+#{pk栺:?ERAHKMD@(V*/ d<3(<ˏ ;{˷w(?/"lA\flņ&3 Kjj@0HK4Q Y mP+JtRH!W;Eanh&`ȯc:VxN0o0W #р;14Mjp0  *H  0i1 0 UUS10U DigiCert, Inc.1A0?U8DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA10 211210000000Z 240104235959Z0t1 0 UFI10 UEspoo10U MariaDB Corporation Ab10U  Connectors10UMariaDB Corporation Ab0"0  *H 0 ̔Dh3-%C[мX خd]oF¶G_0~uj#cKV""H_Nk1\.S$E[iEp9uzXרrHJ9ȧw$d|΂⟲"{d(| QL^TkX,n@oF|_Y$$EzLA]%(l~DEAH#VǓ.b[ֵqQ/bn-2vU#XpރAՁdSXLZ=xzfWV!Z 0pHFENfeG b@]){@Z^"z5DRbXג\%c*qP8Yz{\Ʋ\-0jz MWMi Ms0u :'c@|Ȣ!MYlurb`2[VDâ%00U#0h7;_a{eNB0Uj]WU,_Xx20U0U% 0 +0U00SQOMhttp://crl3.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl0SQOMhttp://crl4.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crl0>U 70503g 0)0'+http://www.digicert.com/CPS0+00$+0http://ocsp.digicert.com0\+0Phttp://cacerts.digicert.com/DigiCertTrustedG4CodeSigningRSA4096SHA3842021CA1.crt0 U00  *H  ,yVzODTwkJ4熯0zOk5' ; ֑t{jžM&u|g/GBj׃*YHPIQEJxM3uoɐl!3#/ρm?O}ω |%O;+&Y ='5ek, p}g Ihmn҄iK9ш@v:d;XJn!!J+A>7(!\.wxLU`DI!5?WU+A;-ߡ>7A+vTA@a|d:Lϋ֡.@g_̧i}Bv4Uls4oбjZ h?zܞTB*">Ы!x{ 6wQxŒee&9mE2A\CرFC|qp >ue2Ђ8!'a&T100}0i1 0 UUS10U DigiCert, Inc.1A0?U8DigiCert Trusted G4 Code Signing RSA4096 SHA384 2021 CA1 #р;14Mjp0  `He|0 +7 100 *H  1  +70 +7 10  +70/ *H  1" #RʳX@y;'e?c̄ԅp0  *H u{`,8)Mk0OV%~.Qٸ+W7͢wxԲK)) ]QN~']M2yK%/ !#č"KjoQj\Q"]sD:E=vDc"=+e9J>{#(o8 > YyY9م-Q?=DK4V0 *H   10001jY.,2X]0s0_]0[1 0 UBE10U GlobalSign nv-sa110/U(GlobalSign Timestamping CA - SHA384 - G4H=ŠM W)0  *H  H^6 =e<{'`u~5;,lDx!nam䨱"@ly"Ĭ oY"[s 7kQ-= Te'yr7/AYǨI?4=5-x #gQ:D̂Hm,XHjF GYۏD3 Ԁd+N^TC=fdJ5MPΗ(線Zf$d_P E&mɲ͒]o^4]2Y!tZ C8W<q2˗WNf?6W𳸌7{ʇflۣ |%P/I3 c]j\eN a_@ CLOKct[,