MySQL之備份與恢復(八)

備份與恢復

還原邏輯備份

如果還原的是邏輯備份而不是物理備份,則與使用操作系統簡單地復制文件到適當位置的方式不同,需要使用MySQL服務器本身來加載數據到表中。在加載導出文件之前,應該先花一點時間考慮文件有多大,需要多久加載完,以及在啟動之前還需要做什么事情,例如通知用戶或禁用掉部分應用。禁掉二進制日志也是個好主意,除非需要將還原操作復制到備庫:服務器加載一個巨大的導出文件的代價很高,并且寫二進制日志會增加更多的(可能沒有必要的)開銷。加載巨大的文件對于一些存儲引擎也有影響。例如,在單個事務中加載100GB數據到InnoDB就不是個好想法,因為巨大的回滾段將會導致問題。應該以可控大小的塊來加載,并且逐個提交事務。有兩種類型的邏輯備份,所以相應地有兩種類型的還原操作。

加載SQL文件

如果有一個SQL導出文件,它將包含可執行的SQL.需要做的就是運行這個文件。假設備份Sakila示例數據庫和Schema到單個文件,下面是用來還原的常用命令。

mysql < sakila-backup.sql

也可以從mysql米精靈行客戶端用SOURCE命令加載文件。這只是做相同事情的不同方法,不過該方法使得某些事情更簡單。例如,如果你是MySQL管理用戶,就可以關閉用客戶端連接執行時的二進制記錄,然后加載文件而不需要重啟MySQL服務器。

mysql>SET SQL_LOG_BIN =0;
mysql>SOURCE sakila-backup.sql;
mysql>SET SQL_LOG_BIN=1;

需要注意的時,如果使用SOURCE,當定向文件到mysql時,默認秦廣下,發生一個錯誤不會導致一批語句退出。如果備份做過壓縮,那么不要分別解壓縮和加載。應該在單個操作中完成解壓縮和加載,這樣做會快很多。

gunzip -c sakila-backup.sql.gz | mysql

如果想用SOURCE命令加載一個壓縮文件,請見下面關于命名管道的討論。如果只想恢復單個表(例如,actor表),要怎么做呢?如果數據沒有分行但有schema信息,那么還原數據并不難。

grep 'INSERT INTO `actor` sakila-backup.sql | mysql sakila'

或者,如果文件是壓縮過的,那么命令如下:

gunzip -c sakila-backup.sql.gz | grep 'INSERT INTO `actor`' | mysql sakila

如果需要創建表并還原數據,而在單個文件中有整個數據庫,則必須先編輯這個文件。這也是有一些人喜歡導出每個表到各自文件中的原因。大部分編輯器無法應付巨大的文件,尤其如果它們是壓縮過的。另外,也不會想實際地編輯文件本身——只想抽取相關地行——因此可能必須做一些命令工作。使用grep來僅抽出給定表的INSERT語句較簡單,就像我們在前面命令中做的那樣,但得到CREATE TABLE語句比較難。下面是抽取所需段落的sed腳本。

sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `actor`/!d;q' sakila-backup.sql

我們得承認這條命令非常隱晦。如果必須以這種方式還原數據,那只能說明備份設計非常糟糕。如果有一點規劃,可能就不會需要痛苦地區嘗試弄清楚sed如何工作了。只需要備份每個表到各自地文件,或者可以更進異步,分別備份數據和Schema.

加載符號分隔文件

在這里插入圖片描述

(符號分隔樣式)

在這里插入圖片描述
在這里插入圖片描述
(sql文件)

如果是通過SELECT INTO OUTFILE導出的符號分隔文件,可以使用LOAD DATA INFILE通過相同的參數來加載。也可以用mysqlimport,這是LOAD DATA INFILE的一個包裝。這種方式依賴命名約定決定從哪里加載一個文件的數據。我們希望你導出了Schema,而不僅是數據。如果是這樣,那應該是一個SQL導出,就可以使用上一節中描述的技術來加載。使用LOAD DATA FILE有一個非常好的優化技巧。LOAD DATA INFILE必須直接從文本文件中讀取,因此,如果是壓縮文件很多人會在加載前先解壓縮,這是非常慢的磁盤密集型操作。然而,在支持FIFO"命名管道"文件的系統如GNU/Linux上,對這種操作有個很好的方法。首先,創建一個命名管道并將解壓縮數據流到它里面。

mkfifo /tmp/backup/default/sakila/payment.fifo
chmod 666 /tmp/backup/default/sakila/payment.fifo
gunzip -c /tmp/backup/default/sakila/payment.txt.gz > /tmp/backup/default/sakila/payment.fifo

注意到我們使用了一個大于號字符(>)來重定向解壓縮輸出到payment.fifo文件中——而不是在不同程序之間創建匿名管道的管道符號。管道會等待,直到其他程序打開它并從另外一段讀取數據。簡單一點說,MySQL服務器可以從管道中讀取解壓縮后的數據,就像其他文件一樣。如果可能,不要忘記盡調二進制日志。

mysql>SET SQL_LOG_BIN = 0; -- Optional> LOAD DATA INFILE 'tmp/backup/defualt/sakila/payment/fifo'> INTO TABLE sakila.payment;

一旦MySQL加載完數據,gunzip就會退出,然后可以刪除該命令管道。在MySQL命令行客戶端使用SOURCE命令加載壓縮的文件也可以使用此技術。Percona Toolkit中的pt-fifo-split程序還可以幫助分塊加載大文件,而不是在單個大事務中操作,這樣效率更高

你無法從這里到達那里

從DATETIME變為TIMESTAMP.以節約空間并使處理過程更快,表定義如下:

CREATE  TABLE tbl(
col1 timestamp NOT NULL,
col2 timestamp NOT NULL default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTMAP
......

這個表帝國一在MySQL5.0.40版本上導致了一個語法錯誤,而這是創建時的版本。可以執行導出,但無法加載。這很奇怪,諸如這樣無法預料的錯誤也是測試備份重要的原因之一。你永遠不會直到什么會阻止你還原數據

基于時間點的恢復

對MySQL做基于時間點的恢復常見的方法是還原最近一次全備份,然后從那個時間點開始重放二進制日志(有時較"前滾恢復")。只要有二進制日志,就可以恢復到任何希望的時間點。甚至可以不太費力地恢復單個數據庫。主要的缺點是二進制日志重放可能會是一個很慢的過程。它大體上等同于復制。如果有一個備庫,并且已經測量到SQL線程的利用率有多高,那么對重放二進制日志會有多快就會心里有數了。例如,,如果SQL線程約有50%被利用,則恢復一周二進制日志的工作可能在三到四天內完成。一個典型場景是對有害的語句的結果做回滾操作,例如DROP TABLE。讓我們看一個簡化的例子,看只有MyISAM表的情況下該如何做。假如是在半夜,備份任務在運行與下面所列相當的語句,復制數據庫到同一服務器上的其他地方。

mysql> FLUSH TABLES WITH READ LOCK;> server1# cp -a /var/lib/mysql/sakila /backup/sakila;
mysql> FLUSH LOGS;> server1# mysql -e "SHOW MASTER STATUS" --vertical > /backup/master.info
mysql> UNLOCK TABLES;

然后,假設有人在晚些時間運行下列語句.

mysql>USE sakila;
mysql>DROP TABLE sakila.payment;

為了便于說明,我們先假設可以單獨地恢復這個數據庫(即此庫中地表不涉及跨庫查詢)。再假設是直到后來出問題才意識到這個有問題地語句。目標是恢復數據庫中除了有問題地語句之外所有發生地事務。也就是說,其他表已經做的所有修改都必須保持,包括有問題的語句運行之后的修改。這并不是很難做到。首先,停掉MySQL以阻止更多的修改,然后從備份中僅恢復sakila數據庫。

server1# /etc/init.d/mysql stop
server1# mv /var/lib/mysql/sakila /var lib/mysql/sakila.tmp
server1# cp -a /backup/sakila /var/lib/mysql

再到運行的服務器的my.cnf中添加如下配置以禁止正常的連接

skip-networking
socket=/tmp/mysql_recover.sock

現在可以安全地啟動服務器了。

server1# /etc/init.d/mysql start

下一個任務是從二進制日志中分出需要重放和忽略的語句。事發時,自半夜的備份依賴服務器只創建了一個二進制日志。我們可以用grep來檢查二進制日志文件以找到問題語句

server1# mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 | grep -B3 -i 'drop table sakila.payment'

我們可以看到,想忽略的語句在日志文件中的某個位置,下一個語句的位置是多少。可以用下面的命令重放二進制日志直到某個位置,然后從某個位置繼續

server1# mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 --stop-position=352 | mysql -uroot -p
server1# mysqlbinlog --database=sakila /var/log/mysql/mysql-bin.000215 --start-position=429 | mysql -uroot -p

接下來要做的是檢測數據以確保沒問題,然后關閉服務器并撤銷對my.cnf的改變,最后重啟服務器

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/42467.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/42467.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/42467.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

金蝶云蒼穹-插件開發(二)新建、更新、刪除數據

加載本頁面數據 關于加載數據&#xff0c;還要多補充一個點&#xff0c;如果要加載一個基礎資料/單據界面中正在操作的界面&#xff0c;比如要獲取剛填寫好的字段值&#xff0c;就要獲取當前界面的模型層&#xff0c;再獲取具體數據。具體操作如下&#xff1a; //獲取日任務信…

C++ 函數高級——函數的占位參數

C中函數的形參列表里可以有占位參數&#xff0c;用來做占位&#xff0c;調用函數時必須填補改位置 語法&#xff1a; 返回值類型 函數名&#xff08;數據類型&#xff09;{ } 在現階段函數的占位參數存在意義不大&#xff0c;但是后面的課程中會用到該技術 示例&#xff1a;…

STM32快速復習(八)SPI通信

文章目錄 前言一、SPI是什么&#xff1f;SPI的硬件電路&#xff1f;SPI發送的時序&#xff1f;二、庫函數二、庫函數示例代碼總結 前言 SPI和IIC通信算是我在大學和面試中用的最多&#xff0c;問的最多的通信協議 IIC問到了&#xff0c;一般SPI也一定會問到。 SPI相對于IIC多了…

heml之樣式布局技巧博客

在編寫關于 HEML&#xff08;HTML CSS JavaScript&#xff09;的樣式布局技巧博客時&#xff0c;可以涵蓋很多不同的方面 1. 響應式設計 介紹媒體查詢&#xff08;Media Queries&#xff09;以及如何根據設備尺寸調整樣式。使用百分比寬度、視口單位&#xff08;vw、vh&…

含并行連結的網絡

一、Inception塊 1、白色部分通過降低通道數來控制模型復雜度&#xff0c;藍色做特征提取工作&#xff0c;每條路上的通道數可能不同&#xff0c;大概我們會把更重要的那部分特征分配更多的通道數 2、Inception只改變高寬&#xff0c;不改變通道數 3、在不同的情況下需要選擇…

pin是什么?管腳

1.平面分割 1)啟動Allegro PCB design &#xff0c;打開.brd。深色部分屬于一個net&#xff0c;要做一下修改&#xff0c;將上面的pin包含進shape中&#xff0c;i進行a&#xff0c;b兩步操作&#xff0c;刪除以前存在的Anti Etch下的line&#xff0c;再將其進行補齊 使它保住上…

【幀中繼實驗-ensp】

實驗要求 在R1上開啟一個點對點子接口&#xff0c;用于連接 R1–R2&#xff0c;兩端IP地址為12.1.1.x 。開啟一個多點子接口 &#xff0c;用于連接R1–R3&#xff0c;R4&#xff0c;兩段IP地址為134.1.1.x。 具體DLCI分配和映射關系如下&#xff1a; R1 102 R2 201—動態映射…

python獲取海康威視所有攝像頭的OSD通道名稱

讀取IP地址的txt文檔 根據IP地址獲取監控攝像頭的OSD通道名稱 # codingutf-8 import os import time import requests from requests.auth import HTTPBasicAuth, HTTPDigestAuth import xml.etree.ElementTree as ET #注意&#xff1a;和ip.txt放在一個文件夾&#xff0c;會生…

論文略讀:Can Long-Context Language Models Subsume Retrieval, RAG, SQL, and More?

202406 arxiv 1 intro 傳統上&#xff0c;復雜的AI任務需要多個專門系統協作完成。 這類系統通常需要獨立的模塊來進行信息檢索、問答和數據庫查詢等任務大模型時代&#xff0c;尤其是上下文語言模型&#xff08;LCLM&#xff09;時代&#xff0c;上述問題可以“一體化”完成…

【程序大俠傳】大表分庫分表切換數據庫類型導致pagehelper生成sql語法報錯

前序 代碼劍宗等級分明&#xff0c;其門下弟子等級劃分如下&#xff1a; 入門弟子 剛剛拜入代碼劍宗&#xff0c;學習基礎編程語言和基本劍法&#xff08;語法和基礎概念&#xff09;。他們的代碼還顯得生澀&#xff0c;但已經開始展現出對優雅代碼的追求。 江湖小蝦 初步掌握…

《python程序語言設計》2018版第5章第53題利用turtle繪制sin和cos函數 sin藍色,cos紅色和52題類似

直接上題和代碼 5.53 &#xff08;Turtle&#xff1a;繪制sin和cos函數&#xff09;編寫程序繪制藍色的sin函數和紅色的cos函數。 代碼和結果 turtle.speed(10) turtle.penup() # sin 用藍色 turtle.color("blue") #這道題和上道題一樣&#xff0c;先把turtle放到起始…

架構面試-數據庫優化問題

文章目錄 如何定位慢查詢1. 開啟慢查詢日志MySQL示例&#xff1a;PostgreSQL示例&#xff1a; 2. 分析慢查詢日志MySQL&#xff1a;PostgreSQL&#xff1a; 3. 使用數據庫性能工具MySQL&#xff1a;PostgreSQL&#xff1a; 4. 優化慢查詢5. 監控與持續優化 sql語句執行的很慢&a…

從0到1制作單只鰲蝦運動軌跡追蹤軟件

前言 需要準備windows10操作系統&#xff0c;python3.11.9&#xff0c;cuDNN8.9.2.26&#xff0c;CUDA11.8&#xff0c;paddleDetection2.7 流程&#xff1a; 準備數據集-澳洲鰲蝦VOC數據集 基于RT-DETR目標檢測模型訓練導出onnx模型進行python部署平滑濾波處理視頻幀保留的…

簡介時間復雜度

好了&#xff0c;今天我們來了解一下&#xff0c;我們在做練習題中常出現的一個名詞。時間復雜度。我相信大家如果有在練習過題目的話。對這個名詞應該都不陌生吧。但是可能很少的去思考它是干什么的代表的什么意思。反正我以前練習的時候就是這樣。我只知道有這么一個名詞在題…

【全面講解下iPhone新機官網驗機流程】

&#x1f3a5;博主&#xff1a;程序員不想YY啊 &#x1f4ab;CSDN優質創作者&#xff0c;CSDN實力新星&#xff0c;CSDN博客專家 &#x1f917;點贊&#x1f388;收藏?再看&#x1f4ab;養成習慣 ?希望本文對您有所裨益&#xff0c;如有不足之處&#xff0c;歡迎在評論區提出…

MybatisPlus實現插入/修改數據自動設置時間

引言 插入數據時自動設置當前時間&#xff0c;更新數據時自動修改日期為修改時的日期。 使用MybatisPlus的擴展接口MetaObjectHandler 步驟 實現接口 實體類加注解 實現接口 package com.example.vueelementson.common;import com.baomidou.mybatisplus.core.handlers.M…

C++ 模版進階

目錄 前言 1. 非類型模版參數 1.1 概念與講解 1.2 array容器 2. 模版的特化 2.1 概念 2.2 函數模版特化 2.3 類模版特化 2.3.1 全特化 2.3.2 偏特化 3.模版的編譯分離 3.1 什么是分離編譯 3.2 模版的分離編譯 3.3 解決方法 4. 模版總結 總結 前言 本篇文章主要…

包/final/權限修飾符/代碼塊

包package 1、包的作用 包用來管理不同的類。 2、包名 包名要全部小寫&#xff0c;一般是域名反寫&#xff0c;如com.liu。在Java中&#xff0c;java解釋器會將package中的.解釋為目錄分隔符/&#xff0c;也就是說該文件的目錄結構為&#xff1a;...com/liu/... 3、全類名…

1.pwn的匯編基礎(提及第一個溢出:整數溢出)

匯編掌握程度 能看懂就行&#xff0c;絕大多數情況不需要真正的編程(shellcode題除外) 其實有時候也不需要讀匯編&#xff0c;ida F5 通常都是分析gadget&#xff0c;知道怎么用&#xff0c; 調試程序也不需要分析每一條匯編指令&#xff0c;單步執行然后查看寄存器狀態即可 但…

Text2SQL提問中包括時間的實戰方案

大家好,我是herosunly。985院校碩士畢業,現擔任算法研究員一職,熱衷于機器學習算法研究與應用。曾獲得阿里云天池比賽第一名,CCF比賽第二名,科大訊飛比賽第三名。擁有多項發明專利。對機器學習和深度學習擁有自己獨到的見解。曾經輔導過若干個非計算機專業的學生進入到算法…