외부 키 참조를 업데이트하지 않고 InnoDB 테이블의 이름을 변경하시겠습니까?
InnoDB 테이블을 새 테이블로 바꾸려고 하는데 이전 테이블을 가리키는 모든 외부 키 참조가 새 테이블을 가리키기를 원합니다.
그래서 시도해봤습니다.
SET foreign_key_checks = 0;
ALTER TABLE foo RENAME foo_old;
ALTER TABLE foo_new RENAME foo;
유감스럽게도 foreign_key_filename을 사용하지 않도록 설정한 경우에도 foo를 가리키는 모든 참조가 foo_old를 가리키도록 변경됩니다.지금 나는 둘 중 하나를 찾고 있습니다.
- 전체 테이블을 재구성하지 않고 외부 키 참조를 다시 변경하는 방법 또는
- 외부 키 참조를 업데이트하지 않고 테이블 이름을 변경하는 방법.
외국 열쇠를 떨어뜨려 다시 만들어 보려고 했는데 테이블이 커서 몇 시간이 걸립니다.테이블을 대체하는 모든 목적은 제한된 다운타임으로 스키마를 변경하는 것이었습니다.
오래된 질문이지만, 다음은 가능한 방법입니다.테이블 이름을 변경하는 대신 기본적으로 데이터를 이동합니다.물론 새 데이터가 외부 키 규칙을 준수하는지 확인해야 합니다.
SET foreign_key_checks = 0;
CREATE TABLE IF NOT EXISTS foo_old LIKE foo;
INSERT INTO foo_old SELECT * FROM foo;
TRUNCATE foo;
INSERT INTO foo SELECT * FROM foo_new;
foreign_key_checks가 전체에 적용되도록 하나의 쿼리로 실행해야 합니다.이게 도움이 되길 바랍니다.
불행하게도 저는 당신의 문제를 해결할 방법이 없다고 생각합니다. 먼저 외부 키를 삭제하고 다시 만들지 않고는 말입니다.
이것은 사소한 일이지만 당신의 것에서 무언가를 발견했습니다.RENAME
명령어도 입력합니다.모든 단계가 성공적으로 수행되지 않는 한 다른 모든 이름을 롤백할 수 있습니다.구문은 다음과 같습니다.
RENAME TABLE foo TO foo_old, foo_new TO foo;
MySQL 5.6이 설치된 5innodb_file_per_table=ON
테이블 공간을 즉시 전환할 수 있습니다.파일 작업은 별도로 수행해야 하므로 SQL을 사용하여 완전히 수행할 수 없습니다. 먼저준니다를 합니다.foo_new
합니다.foo
데이터:
SET foreign_key_checks = 0;
ALTER TABLE foo DISCARD TABLESPACE;
FLUSH TABLES foo_new FOR EXPORT;
이때 관련 InnoDB 파일을 올바른 이름으로 복사해야 합니다.파일은 데이터 디렉토리에 저장됩니다.예를 들어, 데비안에서는 기본적으로 다음과 같습니다./var/lib/mysql/yourdatabase
은 파은입니다.foo_new.ibd
,foo_new.cfg
그리고.foo_new.frm
에 복사합니다.foo.ibd
,foo.cfg
그리고.foo.frm
각각 다음과 같다. 예:
$ cp foo_new.ibd foo.ibd
$ cp foo_new.frm foo.frm
$ cp foo_new.cfg foo.cfg
MySQL은 새 파일에 액세스할 수 있습니다(예: 올바른 소유자, 액세스 권한).완료되면 테이블을 다시 가져오고 외부 키를 활성화할 수 있습니다.
UNLOCK TABLES;
ALTER TABLE foo IMPORT TABLESPACE;
SET foreign_key_checks = 1;
은 복만가니다합만 복사합니다.foo_new
foo
이 합니다.foo
로.foo_old
.
InnoDB는 외부 키에 있는 테이블의 내부 포인터를 사용하므로 이 테이블에 지정된 이름에 관계없이 (사용)RENAME
), 사용 시를 포함하여 제약 조건이 보존됩니다.SET foreign_key_checks = 0
.
전체 테이블을 재구성하지 않고 외부 키 참조를 다시 변경하는 방법
사용.innodb_file_per_table=ON
우리가 갈 수 있는 가장 가까운 곳일 것입니다(@vhu 답변 참조).
외부 키 참조를 업데이트하지 않고 테이블 이름을 변경하는 방법.
서버에 대한 셸 액세스가 필요하지 않고 다운타임과 노력이 최소화되는 솔루션은 데이터가 크게 변경되지 않는 경우 두 개의 데이터베이스를 사용하여 작업하고 적절한 시간에 전환하는 것입니다.
큰 테이블보다 다른 모든 테이블을 동기화하거나 일부 변경 사항이 있을 경우 스위치가 전환될 때까지 애플리케이션에서 mysql 명령을 임시로 복제(삭제, 업데이트, 삽입)하는 것이 더 빠를 수 있습니다.
이 일을 해결할 방법을 찾았어요소스 테이블의 이름을 변경하는 대신 해당 테이블을 삭제합니다.
이 예에서는 테이블을 'mytbl'이라고 부릅니다.
- 원본 테이블의 복사본을 만듭니다(예: 'mytbl_new').
- 새 테이블에 데이터 복사
- 소스 테이블 'mytbl' 삭제
- 'mytbl_new'의 이름을 'mytbl'로 변경합니다.
유일한 단점은 원래 테이블의 백업을 보관할 수 없다는 것입니다. 하지만 미리 백업을 해둘 수는 있습니다.또는 원래 표의 완전한 사본을 원하는 경우 추가 표 사본을 작성할 수 있습니다.
언급URL : https://stackoverflow.com/questions/6384778/renaming-an-innodb-table-without-updating-foreign-key-references-to-it
'programing' 카테고리의 다른 글
PowerShell 및 프로세스 종료 코드 (0) | 2023.08.30 |
---|---|
스프링 부트 정상 종료 (0) | 2023.08.30 |
jQuery Ajax 게시 요청이 Chrome에서 보류 중인 상태로 고착 (0) | 2023.08.30 |
텍스트 편집에서 선 색상을 변경하는 방법 (0) | 2023.08.30 |
GIT: 특정 폴더로 체크아웃 (0) | 2023.08.30 |