문맥:
서브셸 내의 백업 덤프에서 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
.\s
sed
질문:
서브쉘을 지시하기 전에 다음을 사용하여 출력을 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
서브쉘 실행을 완료하기 전에 명령이 실패합니다)