MySQL Innodb 스토리지 엔진 (1)

InnoDB 온 디스크 구조 물리적 구조 (디스크 구조)

소개 : 테이블 스페이스의 개념은 Oracle 데이터베이스에서 시작되었습니다. 초기 목적은 스토리지 확장을 잘 수행 할 수 있도록하는 것입니다.

位置 : InnoDB 스토리지 엔진 —> InnoDB 온 디스크 구조 —> 테이블 스페이스

  1. 공유 테이블 공간 (시스템 테이블 공간)
    ① 테이블 공간 저장 모드 : ibdata1 ~ ibdataN

기본 테이블 스페이스 스토리지 유형의 5.5+ 버전.

ibdata1 스토리지 : 시스템 데이터, 로그, 실행 취소, 임시 테이블, 사용자 데이터 (인덱스 세그먼트 + 데이터 세그먼트).
frm storage : 각 테이블의 데이터 사전 정보 저장

위의 저장 구조를 읽은 후 Innodb 테이블의 xxx.frm 및 xxx.ibd 파일을 다른 인스턴스로 복사하면 데이터 테이블이 백업된다는 의미입니까?

사실은 아닙니다. 글로벌 데이터 사전의 사본이 없기 때문입니다. xxx.frm 및 xxx.ibd 파일은 데이터의 일부일 뿐이며 누락 된 ibdataN에는 시스템 관련 데이터, 로그 정보 및 임시 테이블 정보가 있습니다. 복사가 필요한 경우 라이브러리는 저장된 전체 디렉토리를 해당 디렉토리로 복사합니다.

myisam 테이블의 user.frm, user.MYD 및 user.MYI 파일을 다른 인스턴스로 복사 할 수 있습니까?

할 수있다. myisam에는 전역 데이터 사전 정보 (시스템 데이터 정보)가 없기 때문입니다. 그러나 다시 시작이 적용 되려면 권한이 정확해야합니다.

② 버전 별 IbdataN 공유 테이블 스페이스 변경

InnoDB 데이터 사전은 테이블, 인덱스 및 테이블의 열과 같은 개체를 추적하기위한 메타 데이터가 포함 된 내부 시스템 테이블로 구성됩니다. 메타 데이터는 실제로 InnoDB 시스템 테이블 스페이스에 있습니다. 역사적 이유 때문에 데이터 딕셔너리 메타 데이터는 InnoDB 테이블 메타 데이터 파일 (.frm 파일-> desc city)에 저장된 정보와 어느 정도 겹칩니다.

공식 문서 링크 : https://dev.mysql.com/doc/refman/5.7/en/innodb-architecture.html

버전 5.5
공유 테이블 스페이스 저장소 시스템 데이터 및 사용자 데이터

시스템 관련 : (글로벌) 데이터 사전 정보, 실행 취소 롤백 정보, DoubleWrite 버퍼 정보, 임시 테이블 정보, 버퍼 변경

(글로벌) 데이터 사전 정보
테이블 기본 구조 정보, 상태, 시스템 매개 변수, 속성 등 백업 된 모든 테이블의 데이터 사전 합계와 동일합니다.

롤백 취소 정보
작업을 취소하는 데 사용되는 로그는 수정 전 백업과 유사하므로 실수 한 경우 백업합니다.

DoubleWrite 버퍼 정보 이중 쓰기 메커니즘
정렬 기준과 같은 임시 테이블 정보를 먼저 정렬 한 다음 복제하고 , 한곳에서 생성하고, 시스템에서 처리하고, 다 사용하면 폐기합니다.

버퍼 변경 (버퍼 삽입) 버퍼 변경 기능을 사용하여 보조 인덱스에 필요한 업데이트 된 데이터를 임시로 버퍼링합니다. 새로운 인서트의 데이터를 쿼리해야 할 때 메모리에서 병합 작업이 수행되고 보조 인덱스는 이때 최신입니다.
사용자 데이터 : 테이블 데이터 행, 테이블 인덱스 데이터

버전 5.6
공유 테이블 스페이스는 시스템 데이터 만 저장하고 사용자 데이터를 분리 (* .ibd 파일은 분리됨)하며 독립적 인 테이블 스페이스를 관리합니다.

시스템 관련 : (글로벌) 데이터 사전 정보, 실행 취소 롤백 정보, DoubleWrite 버퍼 정보, 임시 테이블 정보, 버퍼 변경
여기에 사진 설명 삽입

버전 5.7 버전
5.6을 기반으로 임시 테이블은 독립적이며 (ibtmp1) 실행 취소를 독립적으로 설정할 수도 있습니다.
시스템 관련 : (글로벌) 데이터 사전 정보, 실행 취소 롤백 정보, DoubleWrite 버퍼 정보, 버퍼 변경
여기에 사진 설명 삽입

버전 8.0.19 버전
5.7을 기반으로 UNDO 롤백 정보는 기본적으로 독립적이며 (undo_00x) 데이터 사전은 더 이상 mysql 라이브러리 아래의 .ibd 파일 인 공유 테이블 공간에 중앙에 저장되지 않습니다.
시스템 관련 : DoubleWrite 버퍼 정보, 버퍼 변경

버전 8.0.20
이전 버전, 독립적 인 DoubleWrite 버퍼 정보를 기반으로합니다.
시스템 관련 : 버퍼 변경
여기에 사진 설명 삽입

공식 문서 15.6.4 이중 쓰기 버퍼 :
MySQL 8.0.20 이전에는 이중 쓰기 버퍼 저장 영역이 InnoDB 시스템 테이블 스페이스에
있었으며 MySQL 8.0.20부터 이중 쓰기 버퍼 저장 영역은 이중 쓰기 파일에 있습니다.

독립 저장 기능 : 전반적인 상황에 영향을주지 않고 파일을 파괴하여 데이터 보안을 보장합니다.


③ 공유 테이블 스페이스 관리 새 환경을 설정할 때 초기화 : mysql --initalize-insecure
. 공유 테이블 스페이스는 초기화 중 설정되지 않습니다. 기본값은 하나입니다 : ibdata1, ibdata1 : 12M : autoextend ibdata1 파일, 기본 초기 크기는 12M, 충분하지 않은 경우 자동으로 확장됩니다. 기본적으로 각 확장은 64M입니다.

-테이블 스페이스의 이름과 크기를 쿼리합니다.

select @@innodb_data_file_path;

기본 확장 크기를 쿼리합니다.

show variables like "%increm%"select @@innodb_autoextend_increment64

공유 테이블 스페이스를 확장하는 방법은 무엇입니까?

第一历程:查看表空间的大小
# ls -lh ibdata1
-rw-r----- 1 mysql mysql 12M May  7 10:04 ibdata1

第二历程:# vim /etc/my.cnf
innodb_data_file_path=ibdata1:12M;ibdata2:100M;ibdata3:100M:autoextend

第三历程:重启数据库
# systemctl restart mysqld

# ll -h ibdata*
-rw-r----- 1 mysql mysql  12M May  7 11:29 ibdata1
-rw-r----- 1 mysql mysql 100M May  7 11:29 ibdata2
-rw-r----- 1 mysql mysql 100M May  7 11:29 ibdata3

注意:ibdata1的大小是实际的大小,否则会报错

如果不一致:innodb_data_file_path=ibdata1:8M;ibdata2:100M;ibdata3:100M:autoextend

重启报错:# /etc/init.d/mysqld restart
Shutting down MySQL.... SUCCESS!
Starting MySQL. ERROR! The server quit without updating PID file (/server/3306/data/db01.pid).


错误日志信息:
# tail -30 /server/3306/data/db01.err
[ERROR] InnoDB: The innodb_system data file './ibdata1' is of a different size 768 pages (rounded down to MB) than the 640 pages specified in the .cnf file!

错误提示得出:ibdata1文件的实际大小:
# awk "BEGIN{print 768*16/1024}"      768页*16KB/1024=12M
12

设置大小:
# awk "BEGIN{print 640*16/1024}"
10

④ 초기화시 공유 테이블 스페이스 설정 (제작 권장 사항)
Version 5.7에서는 512M 또는 1G 크기의 공유 테이블 스페이스 2 ~ 3 개 설정을 권장하며 마지막은 자동 확장을 위해 커스터마이징

第一历程:修改配置文件
# vim /etc/my.cnf
innodb_data_file_path=ibdata1:1024M;ibdata2:1024M;ibdata3:1024M:autoextend

第二历程:初始化
# mysqld --initialize-insecure --user=mysql --basedir=/server/app/mysql --datadir=/server/3306/data

第三历程:重启
# systemctl restart mysqld
8.0 版本建议设置1个就ok,大小512M或者1G。
  1. 독립 테이블 스페이스
    버전 5.6에서 사용자 데이터, 별도의 스토리지 관리, 스토리지 테이블 데이터 행 및 인덱스
    ① 독립 테이블 스페이스보기 :
select @@innodb_file_per_table;

1 별도의 스토리지 관리에 의해 생성 된 테이블, 디스크에 해당하는 파일 : t1.frm 및 t1.ibd
0 공유 테이블 스페이스는 생성 된 테이블, 디스크에 해당하는 파일 : t1.frm, .ibd 파일 없음

演示:
当前是独立的存储管理

mysql> create database t1;
mysql> create table t1(id int);

# ll /server/3306/data/t1/
-rw-r----- 1 mysql mysql    65 May  7 12:07 db.opt
-rw-r----- 1 mysql mysql  8556 May  7 12:07 t1.frm
-rw-r----- 1 mysql mysql 98304 May  7 12:07 t1.ibd

mysql> set global innodb_file_per_table=0;
mysql> create table t2(id int);
mysql> insert into t2 values (1);

# ll /server/3306/data/t1/
-rw-r----- 1 mysql mysql    65 May  7 12:07 db.opt
-rw-r----- 1 mysql mysql  8556 May  7 12:07 t1.frm
-rw-r----- 1 mysql mysql 98304 May  7 12:07 t1.ibd
-rw-r----- 1 mysql mysql  8556 May  7 12:34 t2.frm
此时存储的数据在ibdata中。

② 신속한 데이터 마이그레이션을 위해 독립적 인 테이블 공간 사용
원리 :

select @@innodb_file_per_table;
1                  --->      单独的存储管理

.ibd 파일을 통한 데이터 마이그레이션
전제 조건 : 수신 측에 ibdata 파일과 .frm 파일이 있어야합니다.
소스 : 3306 / test / t100w ----> 대상 : 3307 / test / t100w

第一历程:锁定源端t100w表,只读
mysql> lock tables test.t100w write;
mysql> show create table t100w;
CREATE TABLE `t100w` (
`id` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

第二历程:目标端创建test库和t100w的空表
mysql> create database test charset="utf8mb4";
mysql> use test
mysql> CREATE TABLE `t100w` (
`id` int(11) DEFAULT NULL,
`num` int(11) DEFAULT NULL,
`k1` char(2) DEFAULT NULL,
`k2` char(4) DEFAULT NULL,
`dt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

第三历程:单独删除目标端空的表空间文件(保留t100w的frm,ibdata1中关于t100w的系统数据)
# ll /server/3307/data/test/
-rw-r----- 1 mysql mysql    67 May  7 12:46 db.opt
-rw-r----- 1 mysql mysql  8662 May  7 12:52 t100w.frm
-rw-r----- 1 mysql mysql 98304 May  7 12:52 t100w.ibd

mysql> alter table test.t100w discard tablespace;
# ll /server/3307/data/test/
-rw-r----- 1 mysql mysql   67 May  7 12:46 db.opt
-rw-r----- 1 mysql mysql 8662 May  7 12:52 t100w.frm

第四历程:拷贝源端ibd文件到目标端目录,并设置权限    如果不是单独的表空间管理,此时是没有.ibd文件的
# cp /server/3306/data/test/t100w.ibd /server/3307/data/test/
# chown  -R mysql.mysql /server/3307/

第五历程:导入表空间
mysql> alter table test.t100w import tablespace;
mysql> select count(*) from test.t100w;
+--------------+
| count(*)     |
+--------------+
|  1000000   |
+--------------+

第六历程:解锁源端数据表
mysql> unlock tables;

글쎄요, 오늘의 내용은 먼저 여기에서 소개 할 것입니다. 데이터를 복원하기위한 마이그레이션 테이블 스페이스, Undo 테이블 스페이스, 임시 테이블 스페이스 등에 대한 후속 기사는 하나씩 자세히 설명합니다.

더 흥미로운 콘텐츠를 원하시면 WeChat 공개 계정을 팔로우하세요.

여기에 사진 설명 삽입

추천

출처blog.csdn.net/weixin_45320660/article/details/114967361