
Framstegen stĂ„r aldrig stilla, sĂ„ anledningarna att uppgradera till de senaste MySQL-versionerna blir alltmer övertygande. Nyligen behövde ett av vĂ„ra projekt uppgradera sina mysiga Percona Server 5.7-kluster till version 8. Allt detta gjordes pĂ„ plattformen. Ubuntu Linux 16.04 april. Hur man utför den hĂ€r Ă„tgĂ€rden med minimal driftstopp och vilka problem vi stötte pĂ„ under uppdateringen â lĂ€s den hĂ€r artikeln.
Utbildning
Varje uppdatering av databasservern Àr troligtvis förknippad med omkonfiguration av databasen: Àndringar i krav pÄ systemresursgrÀnser och korrigering av databaskonfigurationer, vilka mÄste rensas frÄn förÄldrade direktiv.
Innan vi uppdaterar kommer vi definitivt att hÀnvisa till den officiella dokumentationen:
- ;
- ;
- ;
- .
Och lÄt oss göra en handlingsplan:
- à tgÀrda konfigurationsfiler genom att ta bort förÄldrade direktiv.
- Kontrollera kompatibilitet med verktyg.
- Uppdatera slavdatabaser genom att installera paketet
percona-server-server. - Uppdatera mastern genom att installera samma paket.
LÄt oss titta pÄ varje punkt i planen och se vad som kan gÄ fel.
VIKTIGT! Proceduren för att uppdatera ett MySQL-kluster baserat pÄ Galera har sina egna finesser, vilka inte beskrivs i artikeln. Du bör inte anvÀnda den hÀr instruktionen i ett sÄdant fall.
Del 1: Kontrollera konfigurationer
I den Ättonde versionen av MySQL togs den bort query_cacheEgentligen var han det. tillbaka i version 5.7, men nu Följaktligen Àr det nödvÀndigt att ta bort de relaterade direktiven. Och för cachning av frÄgor kan du nu anvÀnda externa verktyg - till exempel, .
Ăven i konfigurationen fanns det förĂ„ldrade direktiv om innodb_file_formatOm MySQL 5.7 hade möjlighet att vĂ€lja InnoDB-formatet, sĂ„ fungerar version 8 redan. .
VÄrt resultat Àr att följande direktiv tas bort:
-
query_cache_type,query_cache_limitĐžquery_cache_size; -
innodb_file_formatĐžinnodb_file_format_max.
För att kontrollera anvÀnder vi Percona Server Docker-avbildningen. Vi placerar serverkonfigurationen i katalogen mysql_config_test, och bredvid den skapar vi kataloger för data och loggar. Exempel pÄ percona-serverkonfigurationstest:
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-centosResultatet: antingen i Docker-loggarna eller i logs-katalogen â beroende pĂ„ dina konfigurationer â kommer en fil att visas som beskriver de problematiska direktiven.
Detta Àr vad vi hade:
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. SÄ vi var fortfarande tvungna att lista ut kodningarna och ersÀtta det förÄldrade direktivet. expire-logs-days.
Del 2: Kontroll av fungerande installationer
Uppdateringsdokumentationen innehÄller tvÄ verktyg för att kontrollera databasens kompatibilitet. Genom att anvÀnda dem kan administratören kontrollera kompatibiliteten hos den befintliga datastrukturen.
LÄt oss börja med det klassiska mysqlcheck-verktyget. Kör det bara:
mysqlcheck -u root -p --all-databases --check-upgradeOm inga problem hittas avslutas verktyget med kod 0:

Dessutom har moderna versioner av MySQL ett verktyg tillgÀngligt. (i Perconas fall Àr det ett paket) percona-mysql-shell). Den ersÀtter den klassiska mysql-klienten och kombinerar funktionerna hos en klient, en SQL-kodredigerare och MySQL-administrationsverktyg. För att kontrollera servern innan du uppdaterar kan du köra följande kommandon genom den:
mysqlsh -- util check-for-server-upgrade { --user=root --host=1.1.1.1 --port=3306 } --config-path=/etc/mysql/my.cnfOch hÀr Àr kommentarerna vi fick:

I allmÀnhet inget kritiskt - bara varningar om kodningar (se nedan). Totalt resultat av utförandet:

Vi bestÀmde att uppdateringen skulle gÄ utan problem.
En anmÀrkning om varningarna ovan som indikerar kodningsproblem. Saken Àr den att UTF-8 i MySQL fram tills nyligen , eftersom den bara lagrade 3 byte istÀllet för 4. I MySQL 8 Àr detta Àntligen : alias utf8 kommer snart att leda till kodning utf8mb4, och de gamla kolumnerna i tabellerna kommer att bli utf8mb3Vidare kodning utf8mb3 kommer att tas bort, men inte i den hÀr versionen. DÀrför beslutade vi att ÄtgÀrda kodningarna som redan finns pÄ den pÄgÄende DBMS-installationen, efter dess uppdatering.
Del 3: Uppdatera servrar
Vad kan gÄ fel nÀr det finns en sÄ briljant plan?... VÀl medvetna om att nyanser alltid uppstÄr, genomförde vi det första experimentet pÄ ett MySQL-utvecklingskluster.
Som redan nÀmnts, behandlar frÄgan om att uppdatera MySQL-servrar med repliker. KÀrnan Àr att du bör uppdatera alla repliker (slave) först, eftersom MySQL 8 kan replikera frÄn masterversion 5.7. En viss svÄrighet ligger i det faktum att vi anvÀnder lÀget mÀstare <-> mÀstare, nÀr fjÀrrstyrningsmastern Àr i lÀge skrivDet vill sÀga att stridstrafiken faktiskt kommer till ett datacenter, och det andra Àr en backup.
Topologin ser ut sÄ hÀr:

Uppdateringen bör börja med repliker mysql-replika dc 2, mysql master dc 2 О mysql replica dc 1och avsluta med mysql master dc 1-servern. För ökad tillförlitlighet stoppade vi de virtuella maskinerna, tog ögonblicksbilder av dem och omedelbart före uppdateringen stoppade vi replikeringen med kommandot STOP SLAVEAnnars ser uppdateringen ut sÄ hÀr:
- Vi startar om varje replik och lÀgger till 3 alternativ i konfigurationerna:
skip-networking,skip-slave-start,skip-log-binPoÀngen Àr att uppdatering av databasen genererar binÀra loggar med uppdatering av systemtabellerna. Dessa direktiv garanterar att applikationsdata inte Àndras i databasen, och information om uppdatering av systemtabellerna kommer inte att hamna i binÀrloggarna. Detta kommer att undvika problem nÀr replikeringen Äterupptas. - Installera paketet
percona-server-serverDet Ă€r viktigt att notera att i MySQL version 8 ingen behöver köra kommandotmysqlupgradeefter serveruppdatering. - Efter en lyckad start, starta om servern igen â den hĂ€r gĂ„ngen utan de parametrar som lades till i den första punkten.
- Se till att replikeringen fungerar korrekt: kontrollera
SHOW SLAVE STATUSoch vi ser att tabellerna med rÀknare i applikationsdatabasen uppdateras.
Allt detta ser enkelt ut: utvecklaruppdateringen lyckades. Okej, vi kan tryggt schemalÀgga den nattliga uppdateringen för produktion.
Det fanns ingen sorg - vi uppdaterade prod.
Att överföra framgÄngsrik utvecklingserfarenhet till produktion var dock inte utan överraskningar.
Lyckligtvis börjar sjÀlva uppdateringsprocessen med repliker, sÄ nÀr vi stötte pÄ problem stoppade vi arbetet och ÄterstÀllde repliken frÄn en ögonblicksbild. Undersökningen av problemen sköts upp till nÀsta morgon. Följande poster hittades i loggarna:
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 En studie av arkiven för olika e-postlistor i Google ledde till förstĂ„elsen att detta problem uppstĂ„r pga. Ăven om det mer troligt Ă€r en bugg i verktygen mysqlcheck Đž mysqlsh.
Det visar sig att MySQL har Àndrat hur den presenterar data för decimalfÀlt (int, tinyint, etc.), sÄ mysql-server anvÀnder ett annat sÀtt att lagra dem internt. Om din databas initialt var i version 5.5 eller 5.1, och sedan uppdaterade du till 5.7, dÄ kan du behöva utföra OPTIMIZE för vissa tabeller. Sedan uppdaterar MySQL datafilerna och överför dem till det aktuella lagringsformatet.
Du kan ocksÄ kontrollera detta med verktyget 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',
... Om field_type Om du har 0, anvÀnder tabellen den gamla typen - du mÄste utföra OPTIMIZEMen om vÀrdet Àr 246 har du redan en ny typ. Du kan lÀsa mer om typerna i .
Dessutom i Den andra möjliga anledningen som vi inte har beaktat Àr avsaknaden av InnoDB-tabeller i systemtabellen. INNODB_SYS_TABLESPACES, om de, tabellerna, skapades i version 5.1. För att undvika problem vid uppdatering kan du anvÀnda .
Varför hade vi inte sÄdana problem pÄ utvecklarsidan? Databasen kopieras regelbundet dit frÄn produktionssidan - alltsÄ, tabellerna Äterskapas.
TyvÀrr kommer det inte vara möjligt att helt enkelt ta och utföra en allestÀdes nÀrvarande enkÀt pÄ en stor och verklig databas. OPTIMIZEPercona-toolkit hjÀlper till hÀr: verktyget pt-online-schema-change Àr perfekt för OPTIMIZE-operationen online.
Den uppdaterade planen blev sÄ hÀr:
- Optimera alla tabeller.
- Utför en databasuppdatering.
För att testa det och Àven ta reda pÄ uppdateringstiden inaktiverade vi en av replikerna och körde följande kommando för alla tabeller:
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=t1Uppdatering av tabeller sker utan lÄnga lÄsningar eftersom verktyget skapar en ny temporÀr tabell, till vilken det kopierar data frÄn huvudtabellen. NÀr bÄda tabellerna Àr identiska blockeras den ursprungliga tabellen och ersÀtts av den nya. I vÄrt fall visade en testkörning att uppdatering av alla tabeller skulle ta ungefÀr en dag, men kopiering av data orsakade för mycket belastning pÄ diskarna.
För att undvika detta lade vi till ett argument till kommandot i produktionslÀge. --sleep Med vÀrdet 10 reglerar denna parameter vÀntetiden efter överföring av en databatch till en ny tabell. Detta kan minska belastningen om den faktiska applikationen som körs Àr krÀvande vad gÀller svarstid.
Efter att optimeringen hade utförts lyckades uppdateringen.
... men inte helt och hÄllet!
Redan en halvtimme efter uppdateringen kom klienten med ett problem. Databasen fungerade mycket konstigt: periodvis anslutningsÄterstÀllningarSÄ hÀr sÄg det ut i övervakningen:

SkÀrmdumpen visar ett sÄgtandsdiagram, vilket Àr relaterat till det faktum att nÄgra av MySQL-servertrÄdarna regelbundet kraschade med ett fel. Applikationen började fÄ fel:
[PDOException] SQLSTATE[HY000] [2002] Connection refusedEn snabb granskning av loggarna visade att mysqld-daemonen inte kunde hÀmta de nödvÀndiga resurserna frÄn operativsystemet. NÀr vi felsökte felen hittade vi följande i systemet: "förÀldralösa" apparmor-policyfiler:
# 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 amd64Dessa filer skapades under en uppgradering till MySQL 5.7 för ett par Är sedan och tillhör ett borttaget paket. Att ta bort filerna och starta om apparmor-tjÀnsten löste problemet:
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 apparmorSammanfattningsvis
Varje operation, Àven den enklaste, kan leda till ovÀntade problem. Och inte ens en vÀl genomtÀnkt plan garanterar alltid det förvÀntade resultatet. Nu inkluderar alla uppdateringsplaner frÄn vÄrt team ocksÄ obligatorisk rensning av onödiga filer som kan ha uppstÄtt till följd av de senaste ÄtgÀrderna.
Och med detta inte sÄ professionella grafiska skapande vill jag rikta ett stort tack till Percona för deras utmÀrkta produkter!

PS
LÀs Àven pÄ vÄr blogg:
- «";
- «";
- «";
- «";
- «".
KĂ€lla: will.com
