MySQL (Percona Server) atjauninÄÅ”ana no 5.7 uz 8.0
Progress nestÄv uz vietas, tÄpÄc iemesli jauninÄÅ”anai uz jaunÄkajÄm MySQL versijÄm kļūst arvien pÄrliecinoÅ”Äki. Pirms neilga laika vienÄ no mÅ«su projektiem bija pienÄcis laiks atjauninÄt mÄjÄ«gos Percona Server 5.7 klasterus uz 8. versiju. Tas viss notika Ubuntu Linux 16.04 platformÄ. KÄ veikt Å”Ädu darbÄ«bu ar minimÄlu dÄ«kstÄvi un ar kÄdÄm problÄmÄm saskÄrÄmies atjauninÄÅ”anas laikÄ - lasiet Å”ajÄ rakstÄ.
TreniÅÅ”
JebkurÅ” datu bÄzes servera atjauninÄjums, visticamÄk, ir saistÄ«ts ar datu bÄzes pÄrkonfigurÄciju: izmaiÅÄm sistÄmas resursu ierobežojumu prasÄ«bÄs un datu bÄzes konfigurÄciju laboÅ”anu, kas jÄatbrÄ«vo no novecojuÅ”Äm direktÄ«vÄm.
Pirms atjauninÄÅ”anas mÄs noteikti atsauksimies uz oficiÄlo dokumentÄciju:
PÄrbaudiet saderÄ«bu ar komunÄlajiem pakalpojumiem.
Atjauniniet vergu datu bÄzes, instalÄjot pakotni percona-server-server.
Atjauniniet galveno, izmantojot to paŔu pakotni.
ApskatÄ«sim katru plÄna punktu un redzÄsim, kas varÄtu noiet greizi.
SVARÄŖGI! Uz Galera balstÄ«ta MySQL klastera atjauninÄÅ”anas procedÅ«rai ir savi smalkumi, kas rakstÄ nav aprakstÄ«ti. Å ajÄ gadÄ«jumÄ jums nevajadzÄtu izmantot Å”o instrukciju.
1. daļa: konfigurÄciju pÄrbaude
MySQL tika noÅemts 8. versijÄ query_cache. PatiesÄ«bÄ viÅÅ” bija pasludinÄts par novecojuÅ”u atpakaļ versijÄ 5.7, bet tagad pilnÄ«bÄ izdzÄsts. AttiecÄ«gi ir jÄsvÄ«tro saistÄ«tÄs direktÄ«vas. Un pieprasÄ«jumu saglabÄÅ”anai keÅ”atmiÅÄ tagad varat izmantot ÄrÄjos rÄ«kus, piemÄram, ProxySQL.
ArÄ« konfigurÄcijÄ bija novecojuÅ”as direktÄ«vas par innodb_file_format. Ja MySQL 5.7 bija iespÄja izvÄlÄties InnoDB formÄtu, tad jau darbojas 8. versija tikai ar Barracuda formÄtu.
MÅ«su rezultÄts ir Å”Ädu direktÄ«vu noÅemÅ”ana:
Lai pÄrbaudÄ«tu, mÄs izmantosim Percona Server Docker attÄlu. MÄs ievietosim servera konfigurÄciju direktorijÄ mysql_config_test, un blakus izveidosim datu un žurnÄlu katalogus. Percona servera konfigurÄcijas testa piemÄrs:
ApakÅ”ÄjÄ rinda: vai nu Docker žurnÄlos, vai direktorijÄ ar žurnÄliem ā atkarÄ«bÄ no jÅ«su konfigurÄcijÄm ā tiks parÄdÄ«ts fails, kurÄ tiks aprakstÄ«tas problemÄtiskÄs direktÄ«vas.
LÅ«k, kas mums bija:
2020-04-03T12:44:19.670831Z 0 [Warning] [MY-011068] [Server] The syntax 'expire-logs-days' is deprecated and will be removed in a future release. Please use binlog_expire_logs_seconds instead.
2020-04-03T12:44:19.671678Z 0 [Warning] [MY-013242] [Server] --character-set-server: 'utf8' is currently an alias for the character set UTF8MB3, but will be an alias for UTF8MB4 in a future release. Please consider using UTF8MB4 in order to be unambiguous.
2020-04-03T12:44:19.671682Z 0 [Warning] [MY-013244] [Server] --collation-server: 'utf8_general_ci' is a collation of the deprecated character set UTF8MB3. Please consider using UTF8MB4 with an appropriate collation instead.
TÄdÄjÄdi mums joprojÄm bija jÄizdomÄ kodÄjumi un jÄaizstÄj novecojusi direktÄ«va expire-logs-days.
2. daļa: Darba instalÄciju pÄrbaude
AtjauninÄÅ”anas dokumentÄcijÄ ir 2 utilÄ«tas datu bÄzes saderÄ«bas pÄrbaudei. To izmantoÅ”ana palÄ«dz administratoram pÄrbaudÄ«t esoÅ”Äs datu struktÅ«ras saderÄ«bu.
SÄksim ar klasisko mysqlcheck utilÄ«tu. VienkÄrÅ”i palaist:
Ja problÄmas netiek atrastas, utilÄ«ta tiks aizvÄrta ar kodu 0:
TurklÄt modernajÄs MySQL versijÄs ir pieejama utilÄ«ta mysql-shell (Percona gadÄ«jumÄ tas ir iepakojums percona-mysql-shell). Tas aizstÄj klasisko mysql klientu un apvieno klienta funkcijas, SQL koda redaktoru un MySQL administrÄÅ”anas rÄ«kus. Lai pÄrbaudÄ«tu serveri pirms atjauninÄÅ”anas, caur to varat palaist Å”Ädas komandas:
VispÄr nekas kritisks - tikai brÄ«dinÄjumi par kodÄjumiem (SkatÄ«t zemÄk). KopÄjais izpildes rezultÄts:
MÄs nolÄmÄm, ka atjauninÄjumam vajadzÄtu notikt bez problÄmÄm.
PiezÄ«me par iepriekÅ” minÄtajiem brÄ«dinÄjumiem, kas norÄda uz problÄmÄm ar kodÄjumu. Fakts ir tÄds, ka MySQL UTF-8 vÄl nesen nebija "patiess" UTF-8, jo tajÄ tika saglabÄti tikai 3 baiti, nevis 4. MySQL 8 tas beidzot ir nolÄma to salabot: aizstÄjvÄrds utf8 drÄ«z novedÄ«s pie kodÄÅ”anas utf8mb4, un vecÄs kolonnas tabulÄs kļūs utf8mb3. TÄlÄka kodÄÅ”ana utf8mb3 tiks noÅemts, bet ne Å”ajÄ laidienÄ. TÄpÄc mÄs nolÄmÄm labot kodÄjumus jau darboÅ”ajÄ DBVS instalÄcijÄ pÄc tÄs atjauninÄÅ”anas.
3. daļa: Serveru atjauninÄjumi
Kas var noiet greizi, ja ir tik gudrs plÄns?.. Labi saprotot, ka nianses vienmÄr notiek, mÄs veicÄm pirmo eksperimentu MySQL izstrÄdÄtÄju klasterÄ«.
KÄ jau minÄts, oficiÄlÄ dokumentÄcija attiecas uz MySQL serveru atjauninÄÅ”anu ar replikÄm. BÅ«tÄ«ba ir tÄda, ka vispirms ir jÄatjaunina visas kopijas (vergu), jo MySQL 8 var replicÄt no galvenÄs versijas 5.7. Dažas grÅ«tÄ«bas rada fakts, ka mÄs izmantojam režīmu meistars <-> meistars, kad tÄlvadÄ«bas pults ir režīmÄ tikai lasÄms. Tas ir, faktiski kaujas trafika iet uz vienu datu centru, bet otrais ir rezerves.
TopoloÄ£ija izskatÄs Å”Ädi:
AtjauninÄÅ”anai jÄsÄkas ar replikÄm mysql replica dc 2, mysql master dc 2 Šø mysql replica dc 1, un beidzas ar mysql master dc 1 serveri. Lai nodroÅ”inÄtu lielÄku uzticamÄ«bu, mÄs apturÄjÄm virtuÄlÄs maŔīnas, uzÅÄmÄm to momentuzÅÄmumus un tieÅ”i pirms atjauninÄÅ”anas apturÄjÄm replikÄciju ar komandu STOP SLAVE. PÄrÄjais atjauninÄjums izskatÄs Å”Ädi:
MÄs restartÄjam katru reprodukciju, pievienojot 3 opcijas konfigurÄcijÄm: skip-networking, skip-slave-start, skip-log-bin. Fakts ir tÄds, ka datu bÄzes atjauninÄÅ”ana Ä£enerÄ binÄros žurnÄlus ar sistÄmas tabulu atjauninÄjumiem. Å Ä«s direktÄ«vas garantÄ, ka datu bÄzÄ netiks veiktas izmaiÅas lietojumprogrammu datos, un informÄcija par sistÄmas tabulu atjauninÄÅ”anu netiks iekļauta binÄrajos žurnÄlos. Tas ļaus izvairÄ«ties no problÄmÄm, atsÄkot replikÄciju.
Pakotnes instalÄÅ”ana percona-server-server. Ir svarÄ«gi atzÄ«mÄt, ka MySQL versijÄ 8 nÄ jums ir jÄpalaiž komanda mysqlupgrade pÄc servera atjauninÄÅ”anas.
PÄc veiksmÄ«ga starta mÄs restartÄjam serveri vÄlreiz ā bez tiem parametriem, kas tika pievienoti pirmajÄ rindkopÄ.
MÄs pÄrliecinÄmies, ka replikÄcija darbojas veiksmÄ«gi: pÄrbaudiet SHOW SLAVE STATUS un redzÄt, ka tiek atjauninÄtas tabulas ar skaitÄ«tÄjiem lietojumprogrammu datubÄzÄ.
Viss izskatÄs pavisam vienkÄrÅ”i: izstrÄdÄtÄja atjauninÄjums bija veiksmÄ«gs. Labi, varat droÅ”i ieplÄnot ikvakara atjauninÄjumu ražoÅ”anai.
Nebija skumjas - mÄs atjauninÄjÄm prod
TomÄr veiksmÄ«gas izstrÄdes pieredzes nodoÅ”ana ražoÅ”anÄ nebija bez pÄrsteigumiem.
Par laimi, pats atjauninÄÅ”anas process sÄkas ar replikÄm, tÄpÄc, kad radÄs grÅ«tÄ«bas, mÄs pÄrtraucÄm darbu un atjaunojÄm kopiju no momentuzÅÄmuma. ProblÄmu izmeklÄÅ”ana tika atlikta lÄ«dz nÄkamajam rÄ«tam. ŽurnÄlos bija Å”Ädi ieraksti:
2020-01-14T21:43:21.500563Z 2 [ERROR] [MY-012069] [InnoDB] table: t1 has 19 columns but InnoDB dictionary has 20 columns
2020-01-14T21:43:21.500722Z 2 [ERROR] [MY-010767] [Server] Error in fixing SE data for db1.t1
2020-01-14T21:43:24.208365Z 0 [ERROR] [MY-010022] [Server] Failed to Populate DD tables.
2020-01-14T21:43:24.208658Z 0 [ERROR] [MY-010119] [Server] Aborting
PÄtot dažÄdu adresÄtu sarakstu arhÄ«vus Google tÄ«klÄ, tika saprasts, ka Ŕī problÄma rodas tÄdÄļ MySQL kļūda. Lai gan Ŕī, visticamÄk, ir utilÄ«tas kļūda mysqlcheck Šø mysqlsh.
IzrÄdÄs, ka MySQL mainÄ«ja veidu, kÄdÄ tie attÄlo decimÄldaļu datus (int, tinyint utt.), tÄpÄc mysql-server izmanto citu veidu, kÄ tos uzglabÄt. Ja jÅ«su datu bÄze sÄkotnÄji bija versijÄ 5.5 vai 5.1, un pÄc tam atjauninÄjÄt uz 5.7, iespÄjams, tas bÅ«s jÄdara OPTIMIZE dažiem galdiem. PÄc tam MySQL atjauninÄs datu failus, pÄrsÅ«tot tos uz paÅ”reizÄjo uzglabÄÅ”anas formÄtu.
Ja field_type Ja jums tas ir vienÄds ar 0, tad tabulÄ tiek izmantots vecais veids - jums ir jÄveic OPTIMIZE. TomÄr, ja vÄrtÄ«ba ir 246, jums jau ir jauns veids. PlaÅ”Äku informÄciju par veidiem var atrast kods.
TurklÄt iekÅ”Ä Å”Ä« kļūda MÄs apsveram otro iespÄjamo iemeslu, kas mÅ«s apieta: InnoDB tabulu neesamÄ«ba sistÄmas tabulÄ INNODB_SYS_TABLESPACES, ja tÄs, tabulas, tika izveidotas versijÄ 5.1. Lai izvairÄ«tos no problÄmÄm atjauninÄÅ”anas laikÄ, varat izmantot pievienots SQL skripts.
KÄpÄc mums nebija Å”Ädu problÄmu izstrÄdÄtÄjÄ? DatubÄze tur periodiski tiek kopÄta no ražoÅ”anas, tÄdÄjÄdi, tabulas tiek izveidotas no jauna.
DiemžÄl lielajÄ datu bÄzÄ, kas patieÅ”Äm darbojas, jÅ«s nevarÄsit vienkÄrÅ”i paÅemt un izpildÄ«t universÄlu OPTIMIZE. Å eit palÄ«dzÄs percona-toolkit: pt-online-schema-change utilÄ«ta ir lieliska tieÅ”saistes OPTIMIZÄÅ ANAS darbÄ«bai.
AtjauninÄtais plÄns izskatÄ«jÄs Å”Ädi:
OptimizÄjiet visas tabulas.
Atjauniniet datu bÄzes.
Lai to pÄrbaudÄ«tu un tajÄ paÅ”Ä laikÄ uzzinÄtu atjauninÄÅ”anas laiku, mÄs atspÄjojÄm vienu no replikÄm un palaidÄm Å”Ädu komandu visÄm tabulÄm:
Tabulas tiek atjauninÄtas bez ilgstoÅ”Äm bloÄ·ÄÅ”anÄm, jo āāutilÄ«ta izveido jaunu pagaidu tabulu, kurÄ tÄ kopÄ datus no galvenÄs tabulas. BrÄ«dÄ«, kad abi galdi ir identiski, oriÄ£inÄlais galds tiek bloÄ·Äts un aizstÄts ar jaunu. MÅ«su gadÄ«jumÄ testa palaiÅ”ana parÄdÄ«ja, ka visu tabulu atjauninÄÅ”ana prasÄ«s apmÄram dienu, taÄu datu kopÄÅ”ana radÄ«ja pÄrÄk lielu slodzi uz diskiem.
Lai no tÄ izvairÄ«tos, ražoÅ”anÄ komandai pievienojÄm argumentu --sleep ar vÄrtÄ«bu 10 - Å”is parametrs pielÄgo gaidÄ«Å”anas ilgumu pÄc datu partijas pÄrsÅ«tÄ«Å”anas uz jaunu tabulu. TÄdÄ veidÄ jÅ«s varat samazinÄt slodzi, ja faktiski darbojas lietojumprogramma prasa atbildes laiku.
PÄc optimizÄcijas atjauninÄÅ”ana bija veiksmÄ«ga.
EkrÄnuzÅÄmumÄ ir redzams zÄÄ£a zoba grafiks, jo daži MySQL servera pavedieni periodiski avarÄja ar kļūdu. LietojumprogrammÄ parÄdÄ«jÄs kļūdas:
Ätra žurnÄlu pÄrbaude atklÄja, ka mysqld dÄmons nevarÄja iegÅ«t nepiecieÅ”amos resursus no operÄtÄjsistÄmas. Å Ä·irojot kļūdas, mÄs atklÄjÄm sistÄmÄ "bÄreÅu" apparmor politikas faili:
# dpkg -S /etc/apparmor.d/cache/usr.sbin.mysqld
dpkg-query: no path found matching pattern /etc/apparmor.d/cache/usr.sbin.mysqld
# dpkg -S /etc/apparmor.d/local/usr.sbin.mysqld
dpkg-query: no path found matching pattern /etc/apparmor.d/local/usr.sbin.mysqld
# dpkg -S /etc/apparmor.d/usr.sbin.mysqld
mysql-server-5.7: /etc/apparmor.d/usr.sbin.mysqld
# dpkg -l mysql-server-5.7
rc mysql-server-5.7 5.7.23-0ubuntu0.16.04.1 amd64
Å ie faili tika izveidoti, pirms pÄris gadiem jauninot uz MySQL 5.7, un tie pieder noÅemtajai pakotnei. Failu dzÄÅ”ana un apparmor pakalpojuma restartÄÅ”ana atrisinÄja problÄmu:
Jebkura, pat visvienkÄrÅ”ÄkÄ darbÄ«ba, var radÄ«t neparedzÄtas problÄmas. Un pat pÄrdomÄts plÄns ne vienmÄr garantÄ gaidÄ«to rezultÄtu. Tagad visos mÅ«su komandas atjauninÄÅ”anas plÄnos ir iekļauta arÄ« obligÄtÄ nevajadzÄ«go failu tÄ«rÄ«Å”ana, kas varÄtu bÅ«t parÄdÄ«juÅ”ies neseno darbÄ«bu rezultÄtÄ.
Un, Åemot vÄrÄ Å”o ne pÄrÄk profesionÄlo grafisko jaunradi, es vÄlos teikt milzÄ«gu paldies Percona par izcilajiem produktiem!