문맥:

문맥:

문맥:

서브셸 내의 백업 덤프에서 SQL을 생성한 다음 실행을 위해 mysql로 ​​파이프합니다.

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar;
 echo "SET FOREIGN_KEY_CHECKS=1;";
) | mysql -h 127.0.0.1 -P 3306 -D mydatabase

이것은 훌륭하게 작동합니다. 테이블에서 복구된 데이터를 볼 수 있습니다.


안타깝게도 mysqld이는 Kubernetes 클러스터의 일부이므로 다음을 통해 SQL 출력을 전달해야 합니다 kubectl exec.

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar;
 echo "SET FOREIGN_KEY_CHECKS=1;";
) | kubectl exec -i mysql-pod -- mysql -D mydatabase

실패하고 충돌함:

x backup-dump.sql
라인 143의 오류 2006(HY000): MySQL 서버가 사라졌습니다.
명령이 종료 코드로 종료되었습니다. 1
: 쓰기 오류
tar: 이전 오류로 인해 오류 종료가 지연되었습니다.

\t일부 디버깅 후에 탭( )이 추출을 중단한 것을 발견했습니다 tar. 수정 사항은 정규 표현식을 통해 모든 것을 공백( )으로 바꾸는 것이었습니다 \t.\ssed


질문:

서브쉘을 지시하기 전에 다음을 사용하여 출력을 tar정규화 해야 합니다.sed표준 출력도착하다 mysql.

질문:

Kubernetes로 파이프될 때 명령이 실패하는 이유는 무엇입니까? 이해하기 쉽고 복잡하지 않은 방법은 무엇입니까stdout중간 파이프를 가로채서 추가하세요와 함께 kubectl?

나는 노력했다

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar | sed 's/\t/\s/g';
 echo "SET FOREIGN_KEY_CHECKS=1;";
) | mysql -D mydatabase

(그러나 정규식 대체를 수행하지 않습니다. tar로 출력하지 않습니다 pipe)

그리고

(
 echo "SET FOREIGN_KEY_CHECKS=0;";
 tar --to-stdout -xvjf archive.tar;
 echo "SET FOREIGN_KEY_CHECKS=1;";
) \
  | sed 's/\t/\s/g' \
  | mysql -D mydatabase

(그러나 tar서브쉘 실행을 완료하기 전에 명령이 실패합니다)

관련 정보