TencentDB for MySQL5.6 버전은 Online DDL을 지원하게 되었습니다. 5.5 버전으로 테이블 구조 변경 시 테이블 잠금으로 인해 비즈니스에 영향을 주지 않도록 계속해서 pt-online-schema-change 등 오픈 소스 툴로 해당 조작을 완료할 것을 권장하였지만, 사용자가 CVM을 통해 pt-online-schema-change를 사용해 MySQL 테이블 구조를 변경하는 과정에서 적잖은 문제가 발생하고 있습니다.
자주 발생하는 오류 정보:Use of uninitialized value $host in string eq at /usr/local/percona-toolkit-3.0.3/bin/pt-online-schema-change line 4284.
상응하는 소스 코드 보기:
sub _find_slaves_by_processlist {
my ( $self, $dsn_parser, $dbh, $dsn ) = @_;
my @slaves = map {
my $slave = $dsn_parser->parse("h=$_", $dsn);
$slave->{source} = 'processlist';
$slave;
}
grep { $_ }
map {
my ( $host ) = $_->{host} =~ m/^([^:]+):/;
if ( $host eq 'localhost' ) {
$host = '127.0.0.1'; # Replication never uses sockets.
}
$host;
} $self->get_connected_slaves($dbh);
return @slaves;
}
코드상에서 보면 processlist 방식으로 slave 정보를 찾을 때, TencentDB에서 계정 복제 관련 정보에 대해 처리함에 따라 processlist로 slave 정보를 획득하지 못한 상황입니다.
복구 방식:
pt-osc를 사용할 때 아래와 같은 매개변수를 추가해 slave의 상태를 확인하지 않도록 합니다.
--recursion-method=none
오류 발생 원인:
사용자가 CVM 명령 라인으로 XXXX.sql 파일을 MySQL로 가져올 때, MySQL에 Specified key was too long이라는 오류 메시지가 출력됩니다.
"ERROR 1071 (42000): Specified key was too long; max key length is 767 bytes"라고 출력되는 오류 메시지는 "인덱스 필드의 길이가 767bytes를 초과해 너무 깁니다."라는 뜻입니다.
설명:
768 / 2 = 384개 2바이트 또는 767 / 3 = 255개 3바이트의 필드(GBK는 2바이트이고 UTF8는 3바이트, UTF8MB4는 4바이트)
MySQL 5.6 이상 버전의 모든 myisam 테이블은 모두 innodb로 자동 전환됩니다. 따라서, 자체 구축한 데이터베이스에 767bytes를 초과한 결합 인덱스 칼럼이 있을 경우, 자체 구축한 라이브러리에서는 myisam 스토리지 엔진으로 인해 테이블 생성 명령을 정상적으로 실행할 수 있지만 MySQL 5.6 버전 이상에서는 문제가 발생할 수 있습니다.
솔루션
create table test(test varcahr(255) primary key)charset=utf8;
-- 성공create table test(test varcahr(256) primary key)charset=utf8;
-- 실패ERROR 1071(42000):Specified key was too long; max key length is 767 bytes
2. TencentDB 5.5 버전을 사용하면 myisam 엔진이 innodb로 자동 전환되지 않습니다.
플랫폼의 보안성 문제로 file 권한 활성화 및 select into outfile 방식으로 데이터 내보내기를 지원하지 않습니다. 기타 방식으로 내보내시기 바랍니다.
MySQL 인스턴스 내부, 클라이언트와 MySQL의 인스턴스 연결 등 3가지 방면에 대해 진단하고 모두 utf8mb4 문자 세트를 사용 또는 지원하는지 확인합니다.
MySQL 인스턴스에서 스토리지 emoji 이모티콘을 사용하려면 MySQL 내부, 클라이언트와 MySQL의 인스턴스 연결 3가지 방면에 대해 진단하고 모두 utf8mb4 문자 세트를 사용 또는 지원하는지 확인합니다.
character_set_server
매개변수를 수정합니다.주의:
해당 매개변수를 수정하면 데이터베이스가 재시작되므로, 사전에 데이터베이스를 백업해 두어 데이터 손실이 없도록 해주시기 바랍니다.
String query = “set names utf8mb4”;
stat.execute(query);
문제 해결에 도움이 되었나요?