MySQL 시리즈 의 12 백업 및 복구
MySQL 시리즈 의 시작 MySQL 관계 형 데이터베이스 기초 개념
MySQL 시리즈 중 하나 인 MariaDB-server 설치
MySQL 시리즈 의 두 번 째 인 스 턴 스 설정
MySQL 시리즈 의 3 가지 기초 편
MySQL 시리즈 의 4 SQL 문법
MySQL 시리즈 의 다섯 가지 보기,저장 함수,저장 과정,트리거
MySQL 시리즈 의 6 사용자 및 권한 부여
MySQL 시리즈 7 MySQL 저장 엔진
MySQL 시리즈 8 MySQL 서버 변수
MySQL 시리즈 의 9 my sql 캐 시 및 색인 조회
MySQL 시리즈 의 10 MySQL 사무 격 리 병행 제어 실현
MySQL 시리즈 의 11 로그 기록
MySQL 시리즈 의 12 백업 및 복구
MySQL 시리즈 13 MySQL 복사
MySQL 시리즈 의 14 MySQL 의 높 은 사용 가능 한 구현
MySQL 시리즈 의 15 MySQL 상용 설정 및 성능 압력 테스트
백업 정책
1.백업 의 유형
유형 1:
mysqldump
:논리 백업 도구 로 모든 저장 엔진 의 온 도 를 적용 합 니 다.완전 또는 일부 백업 지원;InnoDB 메모리 엔진 에 열 비 지원;Schema(데이터베이스 정의)와 데이터 가 함께 저 장 됩 니 다.
:
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
:
-A:
-B db_name1,[db_name2,...]:
-E: event scheduler
-R:
--triggers: , , --skip-triggers,
--master-data={1|2}:
1: CHANGE MASTER TO , , 1
2: CHANGE MASTER TO , : --lock-tables , --lock-all-tables ( --single-transaction)
-F: , , flush logs , , -A , , , --flush-logs -x,--master-data -single-transaction, ; : -x,--master-data --single-transaction
--compact , ,
-d:
-t: , create table
-n: create database, -A -B
--flush-privileges: , mysql
-f: SQL ,
--hex-blob: ( ,“abc” 0x616263), BINARY, VARBINARY,BLOB,BIT
-q: , ,
MyISAM 백업 옵션:온 비 를 지원 합 니 다.열 준비 가 지원 되 지 않 기 때문에 백업 할 라 이브 러 리 를 잠 그 고 백업 작업 을 시작 해 야 합 니 다.-x,--lock-all-tables:전역 읽 기 자 물 쇠 를 추가 하여 모든 라 이브 러 리 의 모든 표를 잠 그 고--single-transaction 또는--lock-tables 옵션 을 추가 하면 이 옵션 을 닫 습 니 다.주의:데이터 양 이 많 을 때 데이터 베 이 스 를 동시 방문 하지 못 할 수 있 습 니 다.
-l,--lock-tables:백업 이 필요 한 모든 데이터베이스 에 대해 백업 을 시작 하기 전에 모든 표를 잠 그 고 기본 값 은 on 입 니 다.--skip-lock-tables 옵션 을 사용 하지 않 으 면 MyISAM 을 백업 하 는 여러 라 이브 러 리 에 데이터 가 일치 하지 않 을 수 있 습 니 다.
InnoDB 백업 옵션:열 비 를 지원 합 니 다.온 비 는 가능 하지만 권장 하지 않 습 니 다.
--single-transaction:이 옵션 은 Innodb 에서 추천 합 니 다.MyISAM 은 적용 되 지 않 습 니 다.이 옵션 은 백업 을 시작 하기 전에 START TRANSACTION 명령 을 실행 하여 트 랜 잭 션 을 시작 합 니 다.이 옵션 은 하나의 트 랜 잭 션 에서 모든 표를 저장 하여 일치 하 는 스냅 샷 을 만 듭 니 다.다 중 버 전 제 어 를 지원 하 는 메모리 엔진 에 저 장 된 테이블 에 만 적 용 됩 니 다(현 재 는 InnoDB 만 가능 합 니 다).덤 프 는 다른 저장 엔진 과 일치 하 는 것 을 보장 하지 않 는 다.
단일 트 랜 잭 션 덤 프 를 진행 할 때 유효한 덤 프 파일(정확 한 표 내용 과 바 이 너 리 로그 위치)을 확보 하려 면 다음 과 같은 문 구 를 사용 하지 않도록 해 야 합 니 다:ALTER TABLE,DROP TABLE,RENAME TABLE,TRUNCATE TABLE
이 옵션 은--lock-tables(이 옵션 은 걸 려 있 는 사 무 를 포함 합 니 다)옵션 과 백업 대형 표를 서로 배척 할 때--single-transaction 옵션 과--quick 를 결합 하여 사용 하 는 것 을 권장 합 니 다.
InnoDB :
mysqldump Curoot CA CF CE CR --single-transaction --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
MyISAM :
mysqldump Curoot CA CF CE CR Cx --master-data=1 --flush-privileges --triggers --hex-blob >$BACKUP/fullbak_$BACKUP_TIME.sql
Percona 회사 가 제공 하 는 my sql 데이터베이스 백업 도구 로 innodb 와 xtradb 데이터 베 이 스 를 열 준비 할 수 있 는 도구 입 니 다.
xtrabackup 은 InnoDB 시 계 를 백업 하 는 데 사용 되 며,비 InnoDB 시 계 를 백업 할 수 없습니다.
innobackupex 스 크 립 트 는 비 InnoDB 표를 백업 하 는 데 사 용 됩 니 다.또한 xtrabackup 명령 을 사용 하여 InnoDB 표를 백업 할 것 입 니 다.또한 MySQL Server 와 명령 을 보 내 서 대화 할 것 입 니 다.예 를 들 어 전체 읽 기 자물쇠(FTWRL),비트 점 가 져 오기(SHOW SLAVE STATUS)등 입 니 다.즉,innobackupex 는 xtrabackup 위 에 포장 을 해서 이 루어 진 것 이다.
현재 MyISAM 표를 사용 하지 않 지만 MySQL 라 이브 러 리 에 있 는 시스템 표 는 MyISAM 이기 때문에 백업 은 기본적으로 innobackupex 명령 을 통 해 이 루어 집 니 다.
xtrabackup 버 전이 2.4 로 업 그 레이 드 된 후에 이전의 2.1 에 비해 비교적 큰 변화 가 생 겼 다.innobackupex 기능 은 모두 xtrabackup 에 통합 되 었 고 하나의 binary 프로그램 만 있 었 다.또한 호환성 을 고려 하기 위해 innobackupex 는 xtrabackup 의 소프트 링크 로 서 xtrabackup 은 현재 비 Innodb 표 백업 을 지원 하고 Innobackupex 는 다음 버 전에 서 제거 되 었 다.xtrabackup 을 통 해 innobackupex 를 교체 하 는 것 을 권장 합 니 다.
innobakupex 백업 을 사용 할 때 xtrabakup 을 사용 하여 모든 InnoDB 표를 백업 하고 표 구조 정의 에 관 한 모든 파일(frm)과 MyISAM,MERGE,CSV 와 ARCHIVE 표 의 관련 파일 을 복사 하 며 트리거 와 데이터베이스 설정 정보 와 관련 된 파일 도 백업 합 니 다.이 파일 들 은 시간 이름 을 가 진 디 렉 터 리 에 저 장 됩 니 다.백업 할 때 innobackupex 는 백업 디 렉 터 리 에 다음 과 같은 파일 을 만 듭 니 다.
:
innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
:
--user:
--password:
--host:
--databases: , , ; :"xtra_test dba_test", , , 。 :"mydatabase.mytable"。 innodb , innodb
--defaults-file: MySQL ,
--incremental: , --incremental-basedir
--incremental-basedir: , --incremental
--incremental-dir:
--include=name: , :databasename.tablename
--apply-log: , , , 。 , 。
--use-memory: --apply-log ,prepare ,xtrabackup crash recovery , 。 (1MB,1M,1G,1GB), 1G
--export: Mysql
--redo-only: prepare base full backup, merge
--copy-back: MySQL datadir
--move-back: --copy-back , , 。 backup , 。 : Backup
주의:1)datadir 디 렉 터 리 가 비어 있어 야 합 니 다.innobackupex--force-non-empty-directories 옵션 이 지정 되 지 않 는 한--copy-backup 옵션 은 덮어 쓰 지 않 습 니 다.
2)restore 전에 shutdown MySQL 인 스 턴 스 를 사용 해 야 합 니 다.실행 중인 인 스 턴 스 를 datadir 디 렉 터 리 에 복원 할 수 없습니다.
3)파일 속성 이 유지 되 기 때문에 대부분의 경우 인 스 턴 스 를 시작 하기 전에 파일 의 속 주 를 my sql,chown-R my sql:my sql/data/my sqldb 로 바 꿔 야 합 니 다.
1,cp+tar==물리 냉각
데이터 디 렉 터 리 를 압축 백업 하려 면 서 비 스 를 중지 해 야 합 니 다.추천 하지 않 습 니 다.
1)백업:
~]# mkdir /backup
~]# systemctl stop mariadb #
~]# tar Jcf /backup/mariadb_all.tar.xz /var/lib/mysql/ #
backup]# systemctl start mariadb
2)복원:
~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf #
~]# cd /backup/
backup]# tar xf mariadb_all.tar.xz #
backup]# cp -av var/lib/mysql/ /var/lib/ #
backup]# systemctl start mariadb # ,
2.lvm 스냅숏+binlog==거의 물리 열 준비+증분 백업1)백업:lvm 논리 볼 륨 에 데이터베이스 디 렉 터 리 를 저장 해 야 합 니 다.
~]# systemctl stop mariadb
~]# rm /var/lib/mysql/ -rf #
~]# cd /backup/
backup]# tar xf mariadb_all.tar.xz #
backup]# cp -av var/lib/mysql/ /var/lib/ #
backup]# systemctl start mariadb # ,
lvm :
~]# pvcreate /dev/sda5
~]# vgcreate vg0 /dev/sda5
~]# lvcreate -n lv_data -L 10G vg0
~]# lvcreate -n lv_binlog -L 10G vg0
~]# mkfs.xfs /dev/vg0/lv_data
~]# mkfs.xfs /dev/vg0/lv_binlog
~]# mkdir -pv /data/{mysqldb,binlog} #
~]# chown -R mysql:mysql /data/
~]# vim /etc/fstab
UUID=4e3d726a-d420-4c1e-812b-da315012ba86 /data/mysqldb xfs defaults 0 0
UUID=6dd98866-769f-4369-8738-291fbcc94ca1 /data/binlog xfs defaults 0 0
, :
~]# yum install mariadb-server -y
~]# vim /etc/my.cnf
[mysqld]
datadir = /data/mysqldb #
log_bin = /data/binlog/mariadb-bin # ,
innodb_file_per_table = ON #
~]# systemctl start mariadb
~]# mysql # , ,
MariaDB [(none)]> CREATE DATABASE school; #
MariaDB [(none)]> use school
MariaDB [school]> CREATE TABLE testtb (id int auto_increment primary key,name char(30),age int default 20); #
MariaDB [school]> DELIMITER // # “//”
MariaDB [school]> CREATE PROCEDURE pro_testtb() # ,
-> BEGIN
-> declare i int;
-> set i = 1;
-> while i < 100000
-> do INSERT INTO testtb(name,age) VALUES (CONCAT('testuser',i),i);
-> SET i = i + 1;
-> END while;
-> END//
MariaDB [school]> DELIMITER ; #
MariaDB [school]> CALL pro_testtb; #
MariaDB [school]> SELECT COUNT(*) FROM testtb; #
+----------+
| COUNT(*) |
+----------+
| 99999 |
+----------+
:
MariaDB [school]> FLUSH TABLES WITH READ LOCK; # ,
MariaDB [school]> FLUSH LOGS; #
MariaDB [school]> SHOW MASTER LOGS; #
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 30334 |
| mariadb-bin.000002 | 1038814 |
| mariadb-bin.000003 | 29178309 |
| mariadb-bin.000004 | 528 |
| mariadb-bin.000005 | 245 | # ,
+--------------------+-----------+
~]# lvcreate -L 5G -n lv_mysql_snap -s -p r /dev/vg0/lv_data # , mysql
MariaDB [school]> UNLOCK TABLES; # ,
~]# mount -o nouuid,norecovery /dev/vg0/lv_mysql_snap /mnt/ # /mnt
~]# cp -av /mnt/ /backup #
~]# umount /mnt/
~]# lvremove /dev/vg0/lv_mysql_snap # , , ~
:
MariaDB [school]> CALL pro_testtb; #
MariaDB [school]> SELECT COUNT(*) FROM testtb;
+----------+
| COUNT(*) |
+----------+
| 199998 | #
+----------+
2)복원:
:
~]# rm -rf /data/mysqldb/* # , BB,
~]# systemctl stop mariadb #
:
~]# cp -av /backup/* /data/mysqldb/ # cp
/etc/my.cnf [mysqld] skip_networking, ,
~]# systemctl start mariadb #
~]# ls -1 /data/binlog/ #
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000005 > binlog.sql #
~]# mysqlbinlog /data/binlog/mariadb-bin.000006 >> binlog.sql # sql
~]# mysql < binlog.sql #
~]# mysql -e 'SELECT COUNT(*) FROM school.testtb' # , ,nice
+----------+
| COUNT(*) |
+----------+
| 199998 |
+----------+
/etc/my.cnf [mysqld] skip_networking, , ~
3.my sqldump+InnoDB+binlog=완전 논리 열 준비+증분 백업1)백업:여기 서 나 는 더 이상 데 이 터 를 만 들 지 않 고 위의 환경 에 이 어 한다.
~]# mysqldump -A -F -E -R --single-transaction --master-data=2 --flush-privileges > /backup/full-`date +%F-%T`.sql #
2)아 날로 그 고장:
MariaDB [(none)]> CREATE DATABASE db1; #
MariaDB [(none)]> CREATE DATABASE db2; #
MariaDB [school]> use school;
MariaDB [school]> DROP TABLE testtb; # ,
MariaDB [school]> CREATE TABLE students (id INT(4) AUTO_INCREMENT PRIMARY KEY,name CHAR(30),age TINYINT); #
MariaDB [school]> INSERT INTO students(name,age) VALUES ('user1',20); #
3)복원:
, , ,
MariaDB [(none)]> FLUSH TABLES WITH READ LOCK; #
MariaDB [(none)]> FLUSH LOGS; #
MariaDB [(none)]> SHOW MASTER LOGS; #
+--------------------+-----------+
| Log_name | File_size |
+--------------------+-----------+
| mariadb-bin.000001 | 30334 |
| mariadb-bin.000002 | 1038814 |
| mariadb-bin.000003 | 29178309 |
| mariadb-bin.000004 | 528 |
| mariadb-bin.000005 | 29177760 |
| mariadb-bin.000006 | 29177786 |
| mariadb-bin.000007 | 953 |
| mariadb-bin.000008 | 245 |
+--------------------+-----------+
~]# systemctl stop mariadb # ,
~]# head -30 /backup/full-2018-06-14-05\:33\:47.sql |grep "CHANGE MASTER"
-- CHANGE MASTER TO MASTER_LOG_FILE='mariadb-bin.000007', MASTER_LOG_POS=245; # , mariadb-bin.000007 245
~]# ls -1 /data/binlog/
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.index
~]# mysqlbinlog --start-position=245 /data/binlog/mariadb-bin.000007 > /backup/binlog.sql #
~]# mysqlbinlog /data/binlog/mariadb-bin.000008 >> /backup/binlog.sql
~]# vim /backup/binlog.sql # sql , SQL
"DROP TABLE `testtb` /* generated by server */"
:
~]# rm -rf /data/mysqldb/* #
~]# vim /etc/my.cnf #
[mysqld] skip_networking,
~]# systemctl start mariadb #
~]# mysql < /backup/full-2018-06-14-05\:33\:47.sql #
~]# mysql < /backup/binlog.sql #
MariaDB [(none)]> show databases; #
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 | #
| db2 | #
| mysql |
| performance_schema |
| school |
| test |
+--------------------+
MariaDB [(none)]> SELECT COUNT(*) FROM school.testtb;
+----------+
| COUNT(*) |
+----------+
| 199999 | #
+----------+
MariaDB [(none)]> SELECT * FROM school.students;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 20 | #
+----+-------+------+
, , skip_networking , , ~
4.Xtrabackup+InnoDB==완전 핫 팩+증분 백업1)완전 백업
~]# innobackupex --user=root /backup/ #
2)첨삭 데이터
MariaDB [school]> CALL pro_testtb; #
MariaDB [school]> SELECT COUNT(*) FROM testtb; #
+----------+
| COUNT(*) |
+----------+
| 299998 |
+----------+
MariaDB [school]> INSERT INTO students VALUES (2,'user2',21);
MariaDB [school]> UPDATE students SET age=19 WHERE id=1;
MariaDB [school]> SELECT * FROM students;
+----+-------+------+
| id | name | age |
+----+-------+------+
| 1 | user1 | 19 |
| 2 | user2 | 21 |
+----+-------+------+
3)증분 백업
~]# mkdir /backup/inc{1,2} #
~]# innobackupex --incremental /backup/inc1/ --incremental-basedir=/backup/2018-06-14_10-44-57/ #
4)첨삭 데이터
MariaDB [(none)]> CREATE DATABASE db3;
MariaDB [(none)]> DROP TABLE school.students; #
MariaDB [(none)]> use school
MariaDB [school]> CALL pro_testtb; #
MariaDB [school]> SELECT COUNT(*) FROM testtb;
+----------+
| COUNT(*) |
+----------+
| 399997 |
+----------+
MariaDB [school]> SELECT * FROM students; # students , ?
ERROR 1146 (42S02): Table 'school.students' doesn't exist
5)고장 발생
~]# rm -rf /data/mysqldb/* #
MariaDB [(none)]> show databases; #
+--------------------+
| Database |
+--------------------+
| information_schema |
+--------------------+
6)긴급 복원
:
~]# systemctl stop mariadb #
~]# innobackupex --apply-log --redo-only /backup/2018-06-14_10-44-57/ # , "--redo-only"
~]# innobackupex --apply-log --redo-only /backup/2018-06-14_10-44-57/ --incremental-dir=/backup/inc1/2018-06-14_10-52-05/ # , ,"--redo-only" , ,
~]# ls /data/mysqldb/ #
~]# innobackupex --copy-back /backup/2018-06-14_10-44-57/ #
~]# chown -R mysql:mysql /data/mysqldb/ #
~]# vim my.cnf skip_networking,
~]# systemctl start mariadb # ,
, now :
~]# cat /backup/2018-06-14_10-44-57/xtrabackup_binlog_info #
mariadb-bin.000011 35740416
~]# ls -1 /data/binlog/ #
mariadb-bin.000001
mariadb-bin.000002
mariadb-bin.000003
mariadb-bin.000004
mariadb-bin.000005
mariadb-bin.000006
mariadb-bin.000007
mariadb-bin.000008
mariadb-bin.000009
mariadb-bin.000010
mariadb-bin.000011
mariadb-bin.000012
mariadb-bin.000013
mariadb-bin.index
~]# mysqlbinlog --start-position=35740416 /data/binlog/mariadb-bin.000011 > /backup/binlog.sql #
~]# mysqlbinlog /data/binlog/mariadb-bin.000012 >> /backup/binlog.sql
~]# mysqlbinlog /data/binlog/mariadb-bin.000013 >> /backup/binlog.sql
/backup/binlog.sql , "DROP TABLE `school`.`students` /* generated by server */" ,
MariaDB [(none)]> SET sql_log_bin=0; #
MariaDB [(none)]> source /backup/binlog.sql #
, my.cnf skip_networking ,
~
5.Xtrabackup 을 사용 하여 단일 테이블 백업 실현1)백업 시트
~]# innobackupex --include="testdb.testlog" /backup #
~]# mysql -e 'SHOW CREATE TABLE testdb.testlog' > /backup/desc_testdb_testlog.sql #
~]# mysql -e 'DROP TABLE testdb.testlog' # , testlog
2)복원 표
~]# innobackupex --apply-log --export /backup/2018-06-14_17-47-02/ #
~]# vim /backup/desc_testdb_testlog.sql # ,
Table Create Table
testlog
~]# mysql testdb < /backup/desc_testdb_testlog.sql #
~]# mysql testdb -e 'DESC testlog' #
+-------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(30) | YES | | NULL | |
| age | int(11) | YES | | 20 | |
+-------+----------+------+-----+---------+----------------+
~]# mysql -e 'ALTER TABLE testdb.testlog DISCARD TABLESPACE' #
~]# cd /backup/2018-06-14_17-47-02/testdb/
testdb]# cp testlog.cfg testlog.exp testlog.ibd /var/lib/mysql/testdb/ #
~]# chown -R mysql:mysql /var/lib/mysql/testdb/ #
~]# mysql -e 'ALTER TABLE testdb.testlog IMPORT TABLESPACE' #
총결산이 글 은 여기까지 입 니 다.당신 에 게 도움 을 줄 수 있 기 를 바 랍 니 다.또한 당신 이 우리 의 더 많은 내용 에 관심 을 가 져 주 기 를 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Redash를 사용할 때 몰랐던 SQL을 쓰는 법을 배웠습니다.최근 redash에서 sql을 쓸 기회가 많고, 이런 쓰는 방법이 있었는지와 sql에 대해 공부를 다시하고 있기 때문에 배운 것을 여기에 씁니다. Redash란? 월별로 데이터를 표시하고 싶습니다 주별로 데이터를 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.