Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Progresi nuk qëndron, prandaj arsyet për t'u azhurnuar në versionet më të fundit të MySQL po bëhen gjithnjë e më domethënëse. Kohët e fundit, në një nga projektet tona, erdhi koha për të azhurnuar klasterat e rehatshëm të Percona Server 5.7 në versionin 8. Kjo e gjithë ndodhi në platformën Ubuntu Linux 16.04. Si të realizohet një operacion i tillë me një minimum shkarke dhe mbi cilat probleme u përballëm gjatë azhurnimit - lexoni në këtë artikull.

Përgatitja

Çdo azhurnim tĂ« serverit tĂ« bazĂ«s sĂ« tĂ« dhĂ«nave ndoshta lidhet me riparimin e bazĂ«s: ndryshimin e kĂ«rkesave ndaj kufijve tĂ« burimeve sistemore dhe pastrimin e konfigurations sĂ« bazĂ«s, tĂ« cilat duhet tĂ« largohen nga direktivat e vjetruara.

Para azhurnimit, ne do të sigurohemi të konsultohemi me dokumentacionin zyrtar:

Dhe do të përgatisim një plan veprimi:

  1. Të korrigjojmë skedarët e konfigurimit, duke hequr direktivat e vjetruara.
  2. Të kontrollojmë përputhshmërinë duke përdorur mjete.
  3. Të azhurnojmë bazat slave, duke instaluar paketën percona-server-server.
  4. Të azhurnojmë masterin, duke instaluar të njëjtën paketë.

Do të shqyrtojmë secilën pikë të planit dhe do të shohim se çfarë mund të shkojë keq.

E RËNDËSISHME! Procedura e azhurnimit tĂ« clusterit MySQL mbi bazĂ«n Galera ka nuanca tĂ« veta, tĂ« cilat nuk pĂ«rmenden nĂ« kĂ«tĂ« artikull. Mos e pĂ«rdorni kĂ«tĂ« udhĂ«zues nĂ« kĂ«tĂ« rast.

Pjesa 1: Kontrollimi i konfigurimeve

Në versionin 8 të MySQL është hequr query_cache. Në të vërtetë, ai ishte shpallur i vjetruar që në versionin 5.7, por tani është hequr plotësisht. Në përputhje me rrethanat, është e nevojshme të hiqen direktivat e lidhura. Ndërsa për ruajtjen e kërkesave, tani mund të përdoren mjete të jashtme - për shembull, ProxySQL.

Po ashtu në konfigurim u gjetën direktiva të vjetruara në lidhje me innodb_file_format. Nëse në MySQL 5.7 kishte mundësi për të zgjedhur formatin InnoDB, versioni 8 tashmë punon vetëm me formatin Barracuda.

Përfundimi ynë - heqja e direktivave të mëposhtme:

  • query_cache_type, query_cache_limit dhe query_cache_size;
  • innodb_file_format dhe innodb_file_format_max.

Për verifikimin do të përdorim imazhin Docker të Percona Server. Skedari i serverit do të vendoset në direktorinë mysql_config_test, dhe pranë do të krijojmë direktori për të dhënat dhe logot. Një shembull i testit të konfigurimit percona-server:

mkdir -p {mysql_config_test,mysql_data,mysql_logs}
cp -r /etc/mysql/conf.d/* mysql_config_test/
docker run  --name some-percona -v $(pwd)/mysql_config_test:/etc/my.cnf.d/  -v $(pwd)/mysql_data/:/var/lib/mysql/ -v $(pwd)/mysql_logs/:/var/log/mysql/ -e MYSQL_ROOT_PASSWORD=${MYSQL_PASSWORD} -d percona:8-centos

Përfundimi: ose në logot e Docker-it, ose në direktorinë me logot - në varësi të konfigurimeve tuaja - do të shfaqet një skedar, në të cilin do të përshkruhen direktivat problematike.

Këtu është çfarë patëm ne:

2020-04-03T12:44:19.670831Z 0 [Warning] [MY-011068] [Server] Sintaksa 'expire-logs-days' është e vjetruar dhe do të hiqet në një lëshim të ardhshëm. Ju lutemi përdorni binlog_expire_logs_seconds në vend.

Kështu, na nevojitej gjithashtu të merremi me kodimet dhe të zëvendësonim direktivën e vjetruar expire-logs-days.

Pjesa 2: Kontrollimi i instalimeve që funksionojnë

Në dokumentacionin për azhurnimin ka 2 mjete për kontrolle të përputhshmërisë së bazës. Përdorimi i tyre ndihmon administratorin të verifikojë përputhshmërinë e strukturës së të dhënave ekzistuese.

Të fillojmë me mjetin klasik mysqlcheck. Mjafton të ekzekutohet:

mysqlcheck -u root -p --all-databases --check-upgrade

Nëse nuk zbulohen probleme, mjeti do të përfundojë me kodin 0:

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Përveç kësaj, në versionet moderne të MySQL është në dispozicion mjeti mysql-shell (në rastin e Percona, kjo është paketa percona-mysql-shell). Ajo shërben si një zëvendësim për klientin klasik mysql dhe kombinon funksionet e klientit, redaktorit të kodit SQL dhe mjeteve të administratës MySQL. Për të kontrolluar serverin para azhurnimit, mund të realizoni komandën e mëposhtme përmes saj:

mysqlsh -- util check-for-server-upgrade { --user=root --host=1.1.1.1 --port=3306 } --config-path=/etc/mysql/my.cnf

Dhe ja çfarë vërejtëm:

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Në përgjithësi, asgjë kritike - vetëm paralajmërime për kodimet. (shih më poshtë). Rezultati i përgjithshëm i ekzekutimit:

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Ne vendosëm se azhurnimi duhet të shkojë pa probleme.

Paralajmërimi mbi paralajmërimet më sipër, tregon probleme me kodimet. Problemi është se UTF-8 në MySQL deri përpara pak kohësh nuk ishte "e vërtetë" UTF-8, pasi ruante vetëm 3 byte në vend të 4. Në MySQL 8, kjo përfundimisht u rregullua: aliasi utf8 shpejt do të çojë në kodimin utf8mb4, dhe kolonat e vjetra në tabela do të bëhen utf8mb3. Në të ardhmen, kodimi utf8mb3 do të hiqet, por jo në këtë lëshim. Prandaj, ne vendosëm të rregullojmë kodimet përpara se të azhurnonim instalimin aktual të DBMS.

Pjesa 3: Azhurnimi i serverëve

ÇfarĂ« mund tĂ« shkojĂ« keq, kur kemi njĂ« plan kaq tĂ« shkĂ«lqyer?... Duke e kuptuar se nuancat gjithmonĂ« ndodhin, eksperimentin e parĂ« e kryem nĂ« klasterin MySQL nĂ« dev.

Si e përmendëm më parë, dokumentacioni zyrtar shpjegon çështjen e azhurnimit të serverëve MySQL me replika. Esenca është që fillimisht duhet të azhurnohen të gjitha replikat (slave), pasi MySQL 8 mund të replikojë nga master në versionin 5.7. Disa vështirësi ndodhin sepse ne përdorim modalitetin master master, kur master-i i largët ndodhet në modalitetin read-only. Kjo do të thotë se trafiku i vërtetë po shkon në një Qendër të Dhënash (DC), ndërsa DC i dytë është rezervë.

Topologjia duket si më poshtë:

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Azhurnimi duhet të fillojë me replikat mysql replica dc 2, mysql master dc 2 dhe mysql replica dc 1, dhe të përfundojë me serverin mysql master dc 1. Për më shumë siguri ndaluam makinat virtuale, bëmë snapshot-et e tyre, dhe para azhurnimit ndaluam replikimin me komandën STOP SLAVE. Përndryshe, azhurnimi duket si më poshtë:

  1. Çdo replikĂ« ri-fillojmĂ«, duke shtuar nĂ« konfigurime 3 opsione: skip-networking, skip-slave-start, skip-log-bin. Rasti Ă«shtĂ« se azhurnimi i bazĂ«s krijon log-et binarĂ« me azhurnimin e tabelave sistemike. KĂ«to drejtime garantuan qĂ« nĂ« bazĂ« tĂ« dhĂ«nash nuk do tĂ« ketĂ« ndryshim tĂ« tĂ« dhĂ«nave tĂ« aplikacionit, dhe informacionet pĂ«r azhurnimin e tabelave sistemike nuk do tĂ« shfaqen nĂ« log-et binarĂ«. Kjo do tĂ« shmangĂ« probleme gjatĂ« rihapjes sĂ« replikimit.
  2. InstalojmĂ« paketĂ«n percona-server-server. ËshtĂ« e rĂ«ndĂ«sishme tĂ« theksohet se nĂ« versionin MySQL 8 nuk duhet tĂ« ekzekutojmĂ« komandĂ«n mysqlupgrade pas azhurnimit tĂ« serverit.
  3. Pas fillimit tĂ« suksesshĂ«m, ri-fillojmĂ« serverin — tashmĂ« pa parametrat qĂ« u shtuan nĂ« pikĂ«n e parĂ«.
  4. Sigurohemi që replikimi funksionon me sukses: kontrollojmë SHOW SLAVE STATUS dhe shohim që tabelat me numrat në bazën e aplikacionit po azhurnohen.

Të gjitha këto duken mjaft të thjeshta: azhurnimi i dev ka kaluar me sukses. Ok, mund të planifikojmë paqësisht azhurnimin e natës për prodhimin.

Nuk ishte ndonjĂ« shqetĂ«sim — prodhimi e kemi azhurnuar

Megjithatë, transferimi i përvojës së suksesshme nga dev në prodhim nuk shkoi pa surpriza.

Fatmirësisht, vetë procesi i azhurnimit fillon me replikat, kështu që, duke hasur vështirësi, ndaluam punimet dhe rikuperuam replikën nga snapshot-i. Hetimi i problemeve u shty për mëngjesin e ardhshëm. Në log u gjetën këto të dhëna:

2020-01-14T21:43:21.500563Z 2 [ERROR] [MY-012069] [InnoDB] tabela: t1 ka 19 kolona por fjalori InnoDB ka 20 kolona
2020-01-14T21:43:21.500722Z 2 [ERROR] [MY-010767] [Server] Gabim në rregullimin e të dhënave SE për db1.t1
2020-01-14T21:43:24.208365Z 0 [ERROR] [MY-010022] [Server] Dështoi të Popullojë tabelat DD.
2020-01-14T21:43:24.208658Z 0 [ERROR] [MY-010119] [Server] Duke abortuar

Hetimi i arkivave të ndryshëm të njoftimeve në Google çoi në kuptimin se një problem i tillë ndodh për shkak të bug-ut të MySQL. Sidoqoftë, kjo më shumë është një bug i mjeteve mysqlcheck dhe mysqlsh.

Kështu, në MySQL kanë ndryshuar mënyrën e përfaqësimit të të dhënave për fushat decimal (int, tinyint etj.), dhe për këtë arsye brenda mysql-server përdoret një metodë tjetër e ruajtjes së tyre. Nëse baza juaj e dhënash ka qenë fillimisht në versionin 5.5 ose 5.1, dhe pastaj keni azhurnuar në 5.7, mund të jetë e nevojshme të kryeni OPTIMIZE për disa tabela. Atëherë MySQL do të azhurnojë skedarët me të dhëna, duke i kaluar në formatin e ruajtjes aktual.

Kjo gjithashtu mund të kontrollohet me mjetin mysqlfrm:

mysqlfrm --diagnostic -vv /var/lib/mysql/db/table.frm
...
 'field_length': 8,
  'field_type': 246, # formati i fushës
  'field_type_name': 'decimal',
  'flags': 3,
  'flags_extra': 67,
  'interval_nr': 0,
 'name': 'you_deciaml_column',
...

NĂ«se field_type nĂ«se ju Ă«shtĂ« e barabartĂ« me 0, atĂ«herĂ« nĂ« tabelĂ« pĂ«rdoret tipi i vjetĂ«r — duhet kryer OPTIMIZE. SidoqoftĂ«, nĂ«se vlera Ă«shtĂ« 246 — ju tashmĂ« keni tipin e ri. MĂ« shumĂ« rreth tipeve mund tĂ« lexoni nĂ« kodin.

PĂ«r mĂ« tepĂ«r, nĂ« kĂ«tĂ« bug diskutohet njĂ« mundĂ«si tjetĂ«r e dĂ«shtimit, qĂ« na ka kaluar pa u vĂ«nĂ« re, — kjo Ă«shtĂ« mungesa e tabelave InnoDB nĂ« tabelĂ«n sistemike INNODB_SYS_TABLESPACES, nĂ«se ato, tabelat, u krijuan nĂ« versionin 5.1. PĂ«r tĂ« shmangur probleme gjatĂ« azhurnimit, mund tĂ« pĂ«rdorni skritin SQL tĂ« bashkangjitur.

Pse pra nuk kishim kĂ«to probleme nĂ« dev? Baza atje kopjohet periodicisht nga prodhimi — kĂ«shtu, tabelat krijohen sĂ«rish.

Fatkeqësisht, në një B.D. të madhe dhe aktive nuk mund të thoni thjesht të ekzekutoni një OPTIMIZE. Këtu ndihmon percona-toolkit: për operacionin online OPTIMIZE mjeti pt-online-schema-change është shumë i përshtatshëm.

Plani i azhurnuar u bë si më poshtë:

  1. Të kryejmë optimizimin e të gjitha tabelave.
  2. Të kryejmë azhurnimin e bazave të të dhënave.

Për ta kontrolluar atë dhe gjithashtu për të zbuluar kohën e azhurnimit, ne ndaluam një nga replikat, dhe për të gjitha tabelat ekzekutuam komandën e mëposhtme:

pt-online-schema-change --critical-load Threads_running=150 --alter "ENGINE=InnoDB" --execute --chunk-size 100 --quiet --alter-foreign-keys-method auto h=127.0.0.1,u=root,p=${MYSQL_PASSWORD},D=db1,t=t1

Përmirësimi i tabelave bëhet pa bllokime të zgjatura falë faktit se utilitari krijon një tabelë të përkohshme të re, në të cilën kopjon të dhënat nga tabela kryesore. Në momentin kur të dy tabelat janë identike, tabela origjinale bllokohet dhe zëvendësohet me të rejën. Në rastin tonë, testi tregoi se përmirësimi i të gjitha tabelave do të kërkonte rreth një ditë, por kopjimi i të dhënave shkaktonte një ngarkesë shumë të madhe në disqe.

PĂ«r tĂ« shmangur kĂ«tĂ«, nĂ« prodhim shtuam nĂ« komandĂ« argumentin --sleep me vlerĂ«n 10 — ky parametr regullon kohĂ«zgjatjen e pritjes pas transferimit tĂ« njĂ« grupi tĂ« dhĂ«nash nĂ« tabelĂ«n e re. KĂ«shtu mund tĂ« zvogĂ«lojmĂ« ngarkesĂ«n, nĂ«se aplikacioni qĂ« Ă«shtĂ« realisht nĂ« punĂ« Ă«shtĂ« kĂ«rkues ndaj kohĂ«s sĂ« pĂ«rgjigjes.

Pas përfundimit të optimizimit përmirësimi kaloi me sukses.


 por jo deri në fund!

Të paktën gjysmë ore pas përmirësimit, klienti erdhi me një problem. Baza punonte shumë çuditshëm: periudhësisht fillonin rëniet e lidhjeve. Kështu dukej në monitorim:

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

Në ekran duket një grafik i dhëmbëzuar, i lidhur me faktin se disa nga rrjedhat e serverit MySQL periudhësisht binin me një gabim. Në aplikacion shfaqeshin gabime:

[PDOException] SQLSTATE[HY000] [2002] Lidhja u refuzua

Një inspektim i shpejtë i logave zbuloi se demon mysqld nuk mund të merrte burimet e nevojshme nga sistemi operativ. Duke u marrë me gabimet, zbuluam në sistem dosjet "të pabesueshme" të politikave apparmor:

# 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

Këto dosje u krijuan gjatë përmirësimit në MySQL 5.7 disa vite më parë dhe iu takojnë një pakoje të fshirë. Fshirja e dosjeve dhe rinisja e shërbimit apparmor zgjidhi problemin:

systemctl stop apparmor
rm /etc/apparmor.d/cache/usr.sbin.mysqld
rm /etc/apparmor.d/local/usr.sbin.mysqld
rm /etc/apparmor.d/usr.sbin.mysqld
systemctl start apparmor

Në përfundim

Çdo operacion, edhe mĂ« i thjeshti, mund tĂ« çojĂ« nĂ« probleme tĂ« papritura. Dhe edhe prania e njĂ« plani tĂ« matur nuk garanton gjithmonĂ« rezultatin e pritur. Tani çdo plan pĂ«rmirĂ«simi qĂ« ekipi ynĂ« organzon pĂ«rfshin gjithashtu pastrimin e dosjeve tĂ« panevojshme qĂ« mund tĂ« kenĂ« dalĂ« si rezultat i veprimeve tĂ« fundit.

Me këtë krijimtari jo aq profesionale grafike do të doja të falënderoja kompaninë Percona për produktet e tyre të shkëlqyera!

Përditësimi i MySQL (Percona Server) nga 5.7 në 8.0

P.S.

Lexoni gjithashtu në blogun tonë:

Burimi: habr.com

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster