Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

Chan eil adhartas a’ seasamh fhathast, agus mar sin tha na h-adhbharan airson ùrachadh gu na dreachan as ùire de MySQL a’ sìor fhàs làidir. O chionn ghoirid, ann am fear de na pròiseactan againn, bha an t-àm ann na cruinneachaidhean comhfhurtail Percona Server 5.7 ùrachadh gu dreach 8. Thachair seo uile air àrd-ùrlar Ubuntu Linux 16.04. Mar a nì thu leithid de dh ’obair le glè bheag de dh’ ùine downt agus dè na duilgheadasan a choinnich sinn rè an ùrachaidh - leugh san artaigil seo.

Ullachadh

Tha e coltach gu bheil ùrachadh sam bith air frithealaiche an stòr-dàta co-cheangailte ri ath-dhealbhadh stòr-dàta: atharrachaidhean ann an riatanasan airson crìochan air goireasan siostaim agus ceartachadh rèiteachaidhean stòr-dàta a dh’ fheumar a ghlanadh bho stiùiridhean seann-fhasanta.

Mus tèid ùrachadh, bheir sinn iomradh gu cinnteach air na sgrìobhainnean oifigeil:

Agus leig dhuinn plana gnìomh a dhealbhadh:

  1. Ceartaich faidhlichean rèiteachaidh le bhith a’ toirt air falbh seann stiùiridhean.
  2. Thoir sùil air co-chòrdalachd le goireasan.
  3. Ùraich stòran-dàta tràillean le bhith a’ stàladh a’ phacaid percona-server-server.
  4. Ùraich am maighstir leis an aon phacaid.

Bheir sinn sùil air gach puing den phlana agus faic dè dh’ fhaodadh a dhol ceàrr.

CUDROMACH! Tha an dòigh-obrach airson cruinneachadh MySQL ùrachadh stèidhichte air Galera a’ toirt a-steach na feartan aige fhèin nach eil air am mìneachadh san artaigil. Cha bu chòir dhut an stiùireadh seo a chleachdadh sa chùis seo.

Pàirt 1: Thoir sùil air configs

Chaidh MySQL a thoirt air falbh ann an dreach 8 query_cache. Gu fìrinneach bha e air a chur an ceill air ais ann an dreach 5.7, ach a-nis air a sguabadh às gu tur. A rèir sin, feumar na stiùiridhean co-cheangailte a thoirt air falbh. Agus airson iarrtasan tasgadan faodaidh tu a-nis innealan taobh a-muigh a chleachdadh - mar eisimpleir, ProxySQL.

Cuideachd anns an config bha seann stiùiridhean mu dheidhinn innodb_file_format. Ma bha e comasach ann am MySQL 5.7 cruth InnoDB a thaghadh, tha an tionndadh 8th ag obair mu thràth a-mhàin le cruth Barracuda.

Is e an toradh againn toirt air falbh na stiùiridhean a leanas:

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

Gus sgrùdadh a dhèanamh, cleachdaidh sinn an ìomhaigh Docker de Percona Server. Cuiridh sinn rèiteachadh an fhrithealaiche san eòlaire mysql_config_test, agus ri thaobh cruthaichidh sinn clàran airson dàta agus logaichean. Eisimpleir deuchainn rèiteachaidh 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

Gu h-ìosal: an dàrna cuid ann an logaichean Docker no san eòlaire leis na logaichean - a rèir na rèiteachaidhean agad - nochdaidh faidhle anns an tèid na stiùiridhean duilgheadas a mhìneachadh.

Seo na bh’ againn:

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.

Mar sin, dh'fheumadh sinn fhathast na còdachaidhean obrachadh a-mach agus an seann stiùireadh a chuir na àite expire-logs-days.

Pàirt 2: Thoir sùil air ionadan-obrach

Anns na sgrìobhainnean ùrachaidh tha 2 ghoireas airson sgrùdadh a dhèanamh air an stòr-dàta airson co-chòrdalachd. Bidh an cleachdadh a’ cuideachadh leis an rianaire sgrùdadh a dhèanamh air co-chòrdalachd an structair dàta a th’ ann.

Feuch an tòisich sinn leis a’ ghoireas mysqlcheck clasaigeach. Dìreach ruith:

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

Mura lorgar duilgheadas, fàgaidh an goireas le còd 0:

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

A bharrachd air an sin, tha goireas ri fhaighinn ann an dreachan ùr-nodha de MySQL mysql-slige (a thaobh Percona is e seo am pasgan percona-mysql-shell). Tha e na àite an neach-dèiligidh mysql clasaigeach agus bidh e a’ cothlamadh gnìomhan teachdaiche, deasaiche còd SQL agus innealan rianachd MySQL. Gus sùil a thoirt air an fhrithealaiche mus ùraich thu e, faodaidh tu na h-òrdughan a leanas a ruith troimhe:

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

Seo na beachdan a fhuair sinn:

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

San fharsaingeachd, chan eil dad riatanach - dìreach rabhaidhean mu chòdachadh (faic gu h-ìosal). Toradh iomlan de choileanadh:

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

Cho-dhùin sinn gum bu chòir don ùrachadh a dhol gun duilgheadasan.

Nòta mu na rabhaidhean gu h-àrd a' nochdadh duilgheadasan le còdachadh. Is e an fhìrinn gu bheil UTF-8 ann am MySQL gu o chionn ghoirid cha robh e "fìor" UTF-8, leis nach robh e a’ stòradh ach 3 bytes an àite 4. Ann an MySQL 8 tha seo comasach mu dheireadh cho-dhùin e a chàradh: ailias utf8 a dh'aithghearr a 'leantainn gu còdadh utf8mb4, agus fàsaidh na seann colbhan anns na bùird utf8mb3. Tuilleadh còdachadh utf8mb3 a thoirt air falbh, ach chan ann san fhoillseachadh seo. Mar sin, chuir sinn romhainn na còdachaidhean a tha air an stàladh DBMS a bha a’ ruith a cheartachadh, às deidh dhuinn ùrachadh.

Pàirt 3: Ùrachaidhean Server

Dè a dh’ fhaodadh a dhol ceàrr nuair a tha plana cho snasail ann?.. A’ tuigsinn gu math gu bheil nuances an-còmhnaidh a’ tachairt, rinn sinn a’ chiad deuchainn air cruinneachadh dev MySQL.

Mar a chaidh ainmeachadh cheana, sgrìobhainnean oifigeil a’ còmhdach na cùise mu bhith ag ùrachadh frithealaichean MySQL le mac-samhail. Is e an loidhne gu h-ìosal gum bu chòir dhut a h-uile mac-samhail (tràillean) ùrachadh an-toiseach, oir faodaidh MySQL 8 ath-riochdachadh bho phrìomh dhreach 5.7. Tha duilgheadas ann leis gu bheil sinn a’ cleachdadh am modh maighstir maighstir, nuair a tha am maighstir iomallach ann am modh leughaidh a-mhàin. Is e sin, gu dearbh, bidh trafaic sabaid a ’dol gu aon ionad dàta, agus tha an dàrna fear na chùl-taic.

Tha an topology a 'coimhead mar seo:

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

Feumaidh an t-ùrachadh tòiseachadh le mac-samhail Mysql mac-samhail dc 2 a-nuas, Maighstir mysql dc 2 a-nuas и mysql replica dc 1, agus crìochnaich leis an fhrithealaiche mysql master dc 1. Gus a bhith nas earbsaiche, chuir sinn stad air na h-innealan mas-fhìor, ghabh sinn dealbhan dhiubh, agus dìreach mus do chuir an t-ùrachadh stad air ath-riochdachadh leis an àithne STOP SLAVE. Tha an còrr den ùrachadh a’ coimhead mar seo:

  1. Bidh sinn ag ath-thòiseachadh gach mac-samhail le bhith a’ cur 3 roghainnean ris na configs: skip-networking, skip-slave-start, skip-log-bin. Is e an fhìrinn gu bheil ùrachadh an stòr-dàta a’ gineadh logaichean dà-chànanach le ùrachaidhean air clàran siostam. Tha na stiùiridhean sin a’ gealltainn nach bi atharrachaidhean sam bith air dàta tagraidh san stòr-dàta, agus cha tèid fiosrachadh mu bhith ag ùrachadh chlàran an t-siostaim a thoirt a-steach do na logaichean binary. Bidh seo a’ seachnadh duilgheadasan nuair a bhios tu ag ath-thòiseachadh ath-riochdachadh.
  2. A 'stàladh a' phacaid percona-server-server. Tha e cudromach cuimhneachadh gu bheil ann an dreach MySQL 8 chan eil feumaidh tu an àithne a ruith mysqlupgrade às deidh ùrachadh an fhrithealaiche.
  3. Às deidh tòiseachadh soirbheachail, bidh sinn ag ath-thòiseachadh an fhrithealaiche a-rithist - às aonais na paramadairean a chaidh a chur ris sa chiad pharagraf.
  4. Nì sinn cinnteach gun obraich ath-riochdachadh gu soirbheachail: thoir sùil SHOW SLAVE STATUS agus faic gu bheil na bùird le cunntairean ann an stòr-dàta an tagraidh air an ùrachadh.

Tha e uile a’ coimhead gu math sìmplidh: bha an ùrachadh dev soirbheachail. Ceart gu leòr, faodaidh tu ùrachadh oidhche a chuir air dòigh gu sàbhailte airson cinneasachadh.

Cha robh bròn sam bith ann - dh'ùraich sinn am prod

Ach, cha robh e na iongnadh gluasad eòlas leasachaidh soirbheachail gu cinneasachadh.

Gu fortanach, tha am pròiseas ùrachaidh fhèin a’ tòiseachadh le mac-samhail, agus mar sin nuair a choinnich sinn ri duilgheadasan, chuir sinn stad air an obair agus thug sinn air ais am mac-samhail bhon dealbh. Chaidh rannsachadh nan trioblaidean a chur dheth chun an ath mhadainn. Anns na clàran bha na h-inntrigidhean a leanas:

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

Le bhith a’ sgrùdadh tasglannan diofar liostaichean puist air Google thàinig tuigse gu bheil an duilgheadas seo a’ tachairt air sgàth Bug MySQL. Ged a tha seo nas coltaiche gur e bug goireis a tha seo mysqlcheck и mysqlsh.

Tha e a 'tionndadh a-mach gun do dh'atharraich MySQL an dòigh anns a bheil iad a' riochdachadh dàta airson raointean deicheach (int, tinyint, msaa), agus mar sin bidh mysql-server a 'cleachdadh dòigh eadar-dhealaichte airson an stòradh. Ma tha an stòr-dàta agad an toiseach bha e ann an dreach 5.5 no 5.1, agus an uairsin dh'ùraich thu gu 5.7, is dòcha gum feum thu a dhèanamh OPTIMIZE airson cuid de bhùird. An uairsin bheir MySQL ùrachadh air na faidhlichean dàta, gan gluasad chun chruth stòraidh gnàthach.

Faodaidh tu cuideachd sgrùdadh a dhèanamh air seo leis a’ ghoireas mysqlfrm:

mysqlfrm --diagnostic -vv /var/lib/mysql/db/table.frm
...
 'field_length': 8,
  'field_type': 246, # формат поля
  'field_type_name': 'decimal',
  'flags': 3,
  'flags_extra': 67,
  'interval_nr': 0,
 'name': 'you_deciaml_column',
...

ma field_type Ma tha e co-ionann ri 0, tha an seann sheòrsa air a chleachdadh sa chlàr - feumaidh tu a dhèanamh OPTIMIZE. Ach, ma tha an luach 246, tha seòrsa ùr agad mu thràth. Gheibhear tuilleadh fiosrachaidh mu na seòrsaichean ann an còd.

A bharrachd air an sin, ann an am biast seo Tha sinn a’ beachdachadh air an dàrna adhbhar a dh’ fhaodadh a bhith ann, a chaidh seachad oirnn: dìth chlàran InnoDB ann an clàr an t-siostaim INNODB_SYS_TABLESPACES, ma chaidh iad, clàran, a chruthachadh ann an dreach 5.1. Gus duilgheadasan a sheachnadh nuair a bhios tu ag ùrachadh, faodaidh tu a chleachdadh sgriobt SQL ceangailte.

Carson nach robh na duilgheadasan sin againn air dev? Bithear a’ lethbhreacadh an stòr-dàta an sin bho àm gu àm bho riochdachadh - mar sin, tha bùird air an ath-chruthachadh.

Gu mì-fhortanach, air stòr-dàta mòr a tha ag obair, cha bhith e comasach dhut dìreach stòr-dàta uile-choitcheann a ghabhail agus a chuir an gnìomh OPTIMIZE. cuidichidh percona-toolkit an seo: tha an goireas pt-online-schema-change sàr-mhath airson gnìomhachd OPTIMIZE air-loidhne.

Bha coltas mar seo air a’ phlana ùraichte:

  1. Optimize a h-uile clàr.
  2. Luchdaich a-nuas an stòr-dàta.

Gus sgrùdadh a dhèanamh air agus aig an aon àm faighinn a-mach an ùine ùrachaidh, chuir sinn à comas aon de na mac-samhail agus ruith sinn an àithne a leanas airson a h-uile clàr:

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

Bidh clàran air an ùrachadh às aonais glasan fada air sgàth gu bheil an goireas a’ cruthachadh clàr sealach ùr anns am bi e a’ dèanamh lethbhreac de dhàta bhon phrìomh chlàr. Aig an àm nuair a tha an dà chlàr co-ionann, tha am bòrd tùsail glaiste agus am fear ùr na àite. Anns a ’chùis againn, sheall ruith deuchainn gun toireadh e timcheall air latha na clàran gu lèir ùrachadh, ach dh’ adhbhraich copaidh dàta cus luchd air na diosgan.

Gus seo a sheachnadh, ann an riochdachadh chuir sinn an argamaid ris an àithne --sleep le luach 10 - bidh am paramadair seo ag atharrachadh an fhaid feitheimh às deidh dha baidse dàta a ghluasad gu clàr ùr. San dòigh seo faodaidh tu an luchd a lughdachadh ma tha an fhìor aplacaid ruith ag iarraidh ùine freagairt.

Às deidh an optimization a dhèanamh, bha an ùrachadh soirbheachail.

... ach chan ann gu tur!

Taobh a-staigh leth uair a thìde às deidh an ùrachadh, thàinig an neach-dèiligidh le duilgheadas. Dh'obraich an stòr-dàta gu math neònach: bho àm gu àm thòisich iad ath-shuidheachadh ceangail. Seo mar a bha e coltach ann an sgrùdadh:

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

Tha an dealbh-sgrìn a’ sealltainn graf sàbhaidh air sgàth ’s gun do thuit cuid de na snàithleanan frithealaiche MySQL bho àm gu àm le mearachd. Nochd mearachdan san tagradh:

[PDOException] SQLSTATE[HY000] [2002] Connection refused

Sheall sgrùdadh sgiobalta air na logaichean nach b’ urrainn don deamhan mysqld na goireasan riatanach fhaighinn bhon t-siostam obrachaidh. Fhad ‘s a bha sinn a’ rèiteach mhearachdan, lorg sinn san t-siostam faidhlichean poileasaidh apparmor “dìlleachdan”.:

# 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

Chaidh na faidhlichean sin a chruthachadh nuair a chaidh ùrachadh gu MySQL 5.7 o chionn bliadhna no dhà agus buinidh iad do phasgan a chaidh a thoirt air falbh. Le bhith a’ sguabadh às na faidhlichean agus ag ath-thòiseachadh seirbheis an aodaich dh’ fhuasgail e an duilgheadas:

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

Ann an co-dhùnadh

Faodaidh obair sam bith, eadhon an obair as sìmplidh, leantainn gu duilgheadasan ris nach robh dùil. Agus chan eil eadhon plana air a dheagh smaoineachadh an-còmhnaidh a’ gealltainn an toradh ris a bheil dùil. A-nis, tha planaichean ùrachaidh sam bith aig an sgioba againn cuideachd a’ toirt a-steach glanadh èigneachail de fhaidhlichean neo-riatanach a dh’ fhaodadh a bhith air nochdadh mar thoradh air gnìomhan o chionn ghoirid.

Agus leis a’ chruthachalachd grafaigeach seo nach eil gu math proifeasanta, bu mhath leam taing mhòr a thoirt do Percona airson na toraidhean sàr-mhath aca!

Ag ùrachadh MySQL (Percona Server) bho 5.7 gu 8.0

PS

Leugh cuideachd air ar blog:

Source: www.habr.com

Cuir beachd ann