{"id":81,"date":"2020-08-08T04:07:10","date_gmt":"2020-08-08T04:07:10","guid":{"rendered":"https:\/\/adrianotanaka.com.br\/?p=81"},"modified":"2020-08-08T04:40:51","modified_gmt":"2020-08-08T04:40:51","slug":"backup-mysql-diretamente-no-object-storage","status":"publish","type":"post","link":"https:\/\/adrianotanaka.com.br\/index.php\/2020\/08\/08\/backup-mysql-diretamente-no-object-storage\/","title":{"rendered":"Backup mysql diretamente no Object Storage"},"content":{"rendered":"\n<p>Tamb\u00e9m me rendi ao que muitas pessoas come\u00e7aram a fazer que \u00e9 mover seu blog ou servi\u00e7os mais simples para o Free Tier da Oracle (esse blog atualmente est\u00e1 hospedado em uma inst\u00e2ncia Always free), antigamente usava o GitHub pages mas algumas coisas nele me limitavam muito, por isso resolvi migrar para o OCI.<\/p>\n\n\n\n<p>Pensando na seguran\u00e7a dos meus posts, criei um comando bem simples para realizar um backup di\u00e1rio do MySQL do site diretamente para o Object Storage, o \u00fanico requisito \u00e9 ter o <strong>oci cli<\/strong> configurado na m\u00e1quina e que ela possa realizar a\u00e7\u00f5es no Bucket, abaixo o script completo:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"shell\" data-enlighter-theme=\"bootstrap4\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#!\/bin\/bash\n###bkp_mysql_bucket.sh\n###Esse Script faz um dump do mysql diretamente em um Bucket do OCI\nexport OCI_CLI_AUTH=instance_principal\nexport DATA=$(date +\"%m-%d-%Y\")\nDB_USER=root\nDB_PASS=senha_usuario\nDB_NAME=nome_banco\n\n\nfunct_normal(){\nmysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME}  --single-transaction  | oci os object put -bn bkp-site --file - --name dump_$DB_NAME_$DATA.sql\n}\n\nfunct_compactado(){\nmysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME}  --single-transaction | gzip -c | oci os object put -bn bkp-site --file - --name dump_$DB_NAME_$DATA.sql.gzip\n}\n\n\n#funct_normal\n#funct_compactado<\/pre>\n\n\n\n<p>Nesse script criei algumas vari\u00e1veis onde voc\u00ea pode especificar o usu\u00e1rio(DB_USER), senha do usu\u00e1rio(DB_PASS) e tamb\u00e9m qual banco vai ser exportado(DB_NAME), caso voc\u00ea coloque &#8211;all-databases voc\u00ea consegue exportar todos os bancos, al\u00e9m disso criei uma fun\u00e7\u00e3o que faz o dump em um arquivo sql(funct_normal) e outra que compacta o arquivo(funct_compactado) enquanto est\u00e1 sendo feito e j\u00e1 faz o upload em paralelo.<\/p>\n\n\n\n<p>A ideia aqui \u00e9 bem simples, usamos o pipe do linux <strong>(|)<\/strong> para redirecionar a sa\u00edda do mysqldump que \u00e9 imprimido no <strong>stdout <\/strong>para o <strong>stdin <\/strong>do comando oci object com o car\u00e1cter <strong>&#8211;<\/strong> <strong>(&#8211;file &#8211; )<\/strong>.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"><code><span class=\"has-inline-color has-vivid-green-cyan-color\">mysqldump -u ${DB_USER} -p${DB_PASS} ${DB_NAME}  --single-transaction <\/span> | <span class=\"has-inline-color has-vivid-cyan-blue-color\">oci os object put -bn bkp-site --file <\/span><span class=\"has-inline-color has-vivid-red-color\">-<\/span><span class=\"has-inline-color has-vivid-cyan-blue-color\"> --name dump_$DB_NAME_$DATA.sql<\/span><\/code><\/pre>\n\n\n\n<p>A primeira parte (em verde) \u00e9 um mysqldump normal, depois temos o pipe (|) e na parte em azul temos o comando respons\u00e1vel pelo upload de objetos no OCI recebendo a sa\u00edda do mysqldump com o car\u00e1cter &#8211; (em vermelho).<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img decoding=\"async\" src=\"https:\/\/i.imgur.com\/WdTpvAd.png\" alt=\"\"\/><\/figure>\n\n\n\n<p>Fontes:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Upload de arquivos via linha de comando no oci: <a href=\"https:\/\/docs.cloud.oracle.com\/en-us\/iaas\/tools\/oci-cli\/2.12.6\/oci_cli_docs\/cmdref\/os\/object\/put.html\">https:\/\/docs.cloud.oracle.com\/en-us\/iaas\/tools\/oci-cli\/2.12.6\/oci_cli_docs\/cmdref\/os\/object\/put.html<\/a><\/li><li>Linux stdout\/stdin : <a href=\"https:\/\/www.howtogeek.com\/435903\/what-are-stdin-stdout-and-stderr-on-linux\/#:~:text=The%20Linux%20Standard%20Streams,stderr%20(standard%20error)%20stream.\">https:\/\/www.howtogeek.com\/435903\/what-are-stdin-stdout-and-stderr-on-linux\/#:~:text=The%20Linux%20Standard%20Streams,stderr%20(standard%20error)%20stream.<\/a><\/li><li>Par\u00e2metros mysqldump: <a href=\"https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldump.html#option_mysqldump_single-transaction\">https:\/\/dev.mysql.com\/doc\/refman\/8.0\/en\/mysqldump.html<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Tamb\u00e9m me rendi ao que muitas pessoas come\u00e7aram a fazer que \u00e9 mover seu blog ou servi\u00e7os mais simples para o Free Tier da Oracle (esse blog atualmente est\u00e1 hospedado em uma inst\u00e2ncia Always free), antigamente usava o GitHub pages mas algumas coisas nele me limitavam muito, por isso resolvi migrar para o OCI. Pensando [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":91,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"material-hide-sections":[],"footnotes":""},"categories":[7,8,6],"tags":[12,9,10,13,3,11],"class_list":["post-81","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-oci","category-oracle","tag-cli","tag-linux","tag-oci","tag-oci-cli","tag-oracle","tag-script"],"_links":{"self":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/81","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=81"}],"version-history":[{"count":10,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/81\/revisions"}],"predecessor-version":[{"id":99,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/posts\/81\/revisions\/99"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media\/91"}],"wp:attachment":[{"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=81"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=81"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adrianotanaka.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=81"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}