{"id":95518,"date":"2020-09-30T19:42:27","date_gmt":"2020-09-30T17:42:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql"},"modified":"2020-09-30T19:42:27","modified_gmt":"2020-09-30T17:42:27","slug":"istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","status":"publish","type":"post","link":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","title":{"rendered":"Historien om fysisk sletning af 300 millioner poster i MySQL","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<h2>Introduktion<\/h2>\n<p>\nHej. Jeg er ningenMe, webudvikler.<\/p>\n<p>Som titlen antyder, er min historie en historie om fysisk sletning af 300 millioner poster i MySQL.<\/p>\n<p>Jeg blev interesseret i dette, s\u00e5 jeg besluttede at lave en huskeseddel (vejledning).<\/p>\n<h2>Start \u2014 Alert<\/h2>\n<p>\nI batch-processen <a class=\"wpil_keyword_link\" href=\"https:\/\/prohoster.info\/da\/server\/dts-dronten\/\"   title=\"serveren\" data-wpil-keyword-link=\"linked\"  data-wpil-monitor-id=\"2600\">serveren<\/a>, som jeg bruger og vedligeholder, er der en regelm\u00e6ssig proces, der dagligt indsamler data fra den sidste m\u00e5ned fra MySQL. <\/p>\n<p>Normalt afsluttes denne proces omkring 1 time, men denne gang blev den ikke afsluttet i 7 eller 8 timer, og alerten stoppede ikke med at dukke op\u2026 <noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>S\u00f8gning efter \u00e5rsagen<\/h2>\n<p>\nJeg pr\u00f8vede at genstarte processen, kigge i loggene, men s\u00e5 ikke noget alvorligt. <br \/>\nForesp\u00f8rgslen blev indekseret korrekt. Men da jeg t\u00e6nkte over, hvad der gik galt, inds\u00e5 jeg, at databasest\u00f8rrelsen var ganske stor. <\/p>\n<pre><code class=\"sql\">hoge_table | 350'000'000 |<\/code><\/pre>\n<p>\n350 millioner poster. Det ser ud til, at indekseringen fungerede korrekt, bare meget langsomt.<\/p>\n<p>Den n\u00f8dvendige datainsamling for m\u00e5neden var omkring 12.000.000 poster. Det ser ud til, at select-kommandoen tog meget lang tid, og transaktionen blev ikke gennemf\u00f8rt i lang tid. <\/p>\n<h2>DB<\/h2>\n<p>\nI bund og grund er det en tabel, der hver dag vokser med omkring 400.000 poster. Databasen skulle kun indsamle data fra den sidste m\u00e5ned, og derfor var tanken, at den skulle kunne h\u00e5ndtere dette datavolumen, men desv\u00e6rre var rotationen ikke blevet aktiveret.<\/p>\n<p>Denne database blev ikke udviklet af mig. Jeg overtog den fra en anden udvikler, s\u00e5 der er en f\u00f8lelse af, at dette er teknisk g\u00e6ld. <\/p>\n<p>Der kom et tidspunkt, hvor volumen af dagligt indsatte data blev stort og endelig n\u00e5ede gr\u00e6nsen. Det er antaget, at man skal opdele s\u00e5danne store datavolumener, men det blev desv\u00e6rre ikke gjort.<\/p>\n<p>Og s\u00e5 kom jeg ind i billedet.<\/p>\n<h2>Retning<\/h2>\n<p>\nDet var mere rationelt at reducere selve databasen og forkorte behandlingstiden i stedet for at \u00e6ndre selve logikken.<\/p>\n<p>Situationen burde \u00e6ndre sig markant, hvis jeg slettede 300 millioner poster, s\u00e5 jeg besluttede at g\u00f8re det\u2026 \u00c5h, jeg troede, at det bestemt ville virke.<\/p>\n<h2>Handling 1<\/h2>\n<p>\nEfter at have forberedt en p\u00e5lidelig sikkerhedskopi, begyndte jeg endelig at sende foresp\u00f8rgsler.<\/p>\n<p>\u300cSender foresp\u00f8rgslen\u300d<\/p>\n<pre><code class=\"sql\">DELETE FROM hoge_table WHERE create_time &lt;= &#039;YYYY-MM-DD HH:MM:SS&#039;;<\/code><\/pre>\n<p>\n\u300c\u2026\u300d<\/p>\n<p>\u300c\u2026\u300d<\/p>\n<p>\u201cHmm\u2026 Ingen svar. M\u00e5ske tager processen lang tid?\u201d \u2014 t\u00e6nkte jeg, men for en sikkerheds skyld kiggede jeg i grafana og s\u00e5, at diskbelastningen voksede meget hurtigt. <br \/>\n\u201cDet er risikabelt\u201d \u2014 t\u00e6nkte jeg igen og stoppede straks foresp\u00f8rgslen.<\/p>\n<h2>Handling 2<\/h2>\n<p>\nEfter at have analyseret alt, inds\u00e5 jeg, at datam\u00e6ngden var for stor til at slette alt p\u00e5 \u00e9n gang.<\/p>\n<p>Jeg besluttede at skrive et script, som kunne slette omkring 1.000.000 poster, og startede det.<\/p>\n<p>\u300cimplementerer script\u300d<\/p>\n<p>\u201cNu virker det helt sikkert,\u201d t\u00e6nkte jeg.<\/p>\n<h2>Handling 3<\/h2>\n<p>\nDen anden metode fungerede, men viste sig at v\u00e6re meget arbejdskr\u00e6vende.<br \/>\nFor at g\u00f8re alt pr\u00e6cist uden un\u00f8dvendig stress ville det tage omkring to uger. Men dette scenarie levede stadig ikke op til servicekravene, s\u00e5 jeg m\u00e5tte frav\u00e6lge det.<\/p>\n<p>Derfor besluttede jeg at:<\/p>\n<h3>Kopiere tabellen og give den et nyt navn.<\/h3>\n<p>\nFra det forrige skridt inds\u00e5 jeg, at sletning af s\u00e5 store datam\u00e6ngder skaber en tilsvarende stor belastning. Derfor besluttede jeg at oprette en ny tabel fra bunden ved hj\u00e6lp af insert og flytte de data, jeg planlagde at slette, ind i den.<\/p>\n<pre><code class=\"sql\">| hoge_table     | 350'000'000|\n| tmp_hoge_table |  50'000'000|<\/code><\/pre>\n<p>\nHvis den nye tabel har samme st\u00f8rrelse som ovenfor, burde databehandlingshastigheden ogs\u00e5 blive 1\/7 hurtigere.<\/p>\n<p>Da jeg havde oprettet tabellen og givet den et nyt navn, begyndte jeg at bruge den som master tabel. Nu, hvis jeg sletter tabellen med 300 millioner poster, skulle alt v\u00e6re i orden.<br \/>\nJeg fandt ud af, at truncate eller drop skaber mindre belastning end delete, og besluttede at bruge denne metode.<\/p>\n<h3>Udf\u00f8relse<\/h3>\n<p>\n\u300cSender foresp\u00f8rgslen\u300d<\/p>\n<pre><code class=\"sql\">INSERT INTO tmp_hoge_table SELECT FROM hoge_table create_time &gt; 'YYYY-MM-DD HH:MM:SS';<\/code><\/pre>\n<p>\n\u300c\u2026\u300d<br \/>\n\u300c\u2026\u300d<br \/>\n\u300cem\u2026\uff1f\u300d<\/p>\n<h2>Handling 4<\/h2>\n<p>\nJeg troede, den tidligere id\u00e9 ville fungere, men efter at have sendt insert-foresp\u00f8rgslen opstod der mange fejl. MySQL sk\u00e5ner ikke.<\/p>\n<p>Jeg var s\u00e5 tr\u00e6t, at jeg begyndte at t\u00e6nke, at jeg ikke ville g\u00f8re dette mere.<\/p>\n<p>Jeg satte mig ned og t\u00e6nkte, at m\u00e5ske var der for mange insert-foresp\u00f8rgsler for \u00e9n gang...<br \/>\nJeg fors\u00f8gte at sende en insert-foresp\u00f8rgsel med en datam\u00e6ngde, som databasen skulle h\u00e5ndtere p\u00e5 en dag. Det lykkedes!<\/p>\n<p>Og s\u00e5 fortsatte vi med at sende foresp\u00f8rgsler med den samme datam\u00e6ngde. Da vi skulle fjerne en m\u00e5neds datam\u00e6ngde, gentog vi denne operation omkring 35 gange.<\/p>\n<h3>Omd\u00f8bning af tabellen <\/h3>\n<p>\nHer var heldet p\u00e5 min side: alt gik glat.<\/p>\n<h3>Alerts forsvandt.<\/h3>\n<p>\nHastigheden for batchbehandling blev \u00f8get.<\/p>\n<p>Tidligere tog denne proces omkring en time, nu tager det cirka 2 minutter. <\/p>\n<p>Efter at have bekr\u00e6ftet, at alle problemer var l\u00f8st, droppede jeg 300 millioner poster. Jeg slettede tabellen og f\u00f8lte mig genf\u00f8dt.<\/p>\n<h2>Resum\u00e9<\/h2>\n<p>\nJeg inds\u00e5, at rotate processing blev overset under batchbehandlingen, og det var det, der udgjorde det prim\u00e6re problem. En s\u00e5dan fejl i arkitekturen f\u00f8rer til spild af tid. <\/p>\n<p>T\u00e6nker du over belastningen ved datareplikering, n\u00e5r du sletter poster fra databasen? Lad os ikke overbelaste MySQL.<\/p>\n<p>De, der har god forst\u00e5else for databaser, vil bestemt ikke m\u00f8de et s\u00e5dant problem. Og for de andre h\u00e5ber jeg, at denne artikel har v\u00e6ret nyttig.<\/p>\n<p><i>Tak for l\u00e6sningen!<\/p>\n<p>Vi vil v\u00e6re meget glade, hvis du fort\u00e6ller os, om du kunne lide denne artikel, om overs\u00e6ttelsen var klar, og om den var nyttig for dig?<\/i><br \/>\n<br \/>Kilde: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/521226\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442. \u042f ningenMe, \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a. \u041a\u0430\u043a \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0438, \u043c\u043e\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u2014 \u044d\u0442\u043e \u0438\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 300 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 MySQL. \u042f \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0441\u044f \u044d\u0442\u0438\u043c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0448\u0438\u043b \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u043a\u0443 (\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e). \u041d\u0430\u0447\u0430\u043b\u043e \u2014 Alert \u0412 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e, \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u0432 \u0434\u0435\u043d\u044c \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0437\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043c\u0435\u0441\u044f\u0446 \u0438\u0437 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-95518","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"da_DK\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 300 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 MySQL | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-30T17:42:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-30T17:42:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Historien om fysisk sletning af 300 millioner poster i MySQL | ProHoster","description":"Introduktion Hej.","canonical_url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"da_DK","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0418\u0441\u0442\u043e\u0440\u0438\u044f \u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u043c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 300 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u043e\u0432 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0432 MySQL | ProHoster","og:description":"\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u041f\u0440\u0438\u0432\u0435\u0442.","og:url":"https:\/\/prohoster.info\/da\/blog\/administrirovanie\/istoriya-o-fizicheskom-udalenii-300-millionov-zapisej-v-mysql","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-30T17:42:27+00:00","article:modified_time":"2020-09-30T17:42:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"95518","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:04:40","updated":"2026-02-09 21:38:05","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/95518","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=95518"}],"version-history":[{"count":1,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/95518\/revisions"}],"predecessor-version":[{"id":159882,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/95518\/revisions\/159882"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=95518"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=95518"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=95518"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}