#bash #postgresql #kubernetes
#bash #postgresql #kubernetes
Вопрос:
Я пытаюсь выполнить запрос к postgres pod в k8s с помощью bash-скрипта, но не могу получить результаты при выборе большого количества столбцов. Вот мой запрос:
kubectl exec -it postgres-pod-dcd-wvd -- bash -c "psql -U postgres -c "Select json_build_object('f_name',json_agg(f_name),'l_name',json_agg(l_name),'email',json_agg(email),'date_joined',json_agg(date_joined),'dep_name',json_agg(dep_name),'address',json_agg(address),'zip_code',json_agg(zip_code),'city',json_agg(city), 'country',json_agg(country)) from accounts WHERE last_name='ABC';""
Когда я уменьшаю количество столбцов, которые нужно выбрать в запросе, я получаю результаты, но если я использую все имена столбцов, запрос просто зависает на неопределенный срок. Что здесь может быть не так?
Обновить:
Я попытался использовать запрос как :
kubectl exec -it postgres-pod-dcd-wvd -- bash -c "psql -U postgres -c "Select last_name,first_name,...(other column names).. row_to_json(accounts) from register_account WHERE last_name='ABC';""
Но это также зависает.
Комментарии:
1. Что-нибудь в журналах pod?
2. @RamanSailopal Спасибо за ответ. Нет, в журналах ничего нет. Запрос просто зависает
Ответ №1:
Когда я пытаюсь изнутри модуля, он работает, но мне нужно выполнить его с помощью bash-скрипта
Означает, что это почти наверняка разбивка результатов на страницы; при запуске exec -t
он устанавливает TTY в Pod, точно так же, как вы были подключены в интерактивном режиме, поэтому он, вероятно, ждет, когда вы нажмете пробел или «n» для следующей страницы
Вы можете отключить разбивку на страницы с env PAGER=cat psql -c "select ..."
помощью или использовать --pset pager=off
как в psql --pset pager=off -c "Select ..."
Кроме того, нет необходимости запускать bash -c
, если вы .bashrc
не устанавливаете некоторые переменные или иным образом выполняете работу в Pod. Использование exec -- psql
должно работать нормально, при прочих равных условиях. Вам нужно будет использовать env
команду, если вы хотите использовать этот PAGER=cat
подход, потому $ ENV=var some_command
что это синтаксис оболочки, и, следовательно, его нельзя вводить напрямую в exec
Ответ №2:
Поскольку результирующие столбцы обрабатывают много json, я думаю, что время, затрачиваемое на выполнение этих двух запросов, различно.
Возможно, вы можете войти в модуль, выполнить запрос и посмотреть.
kubectl exec -it postgres-pod-dcd-wvd -- bash
Теперь вы внутри модуля. Затем мы можем выполнить запрос.
# psql -U postgres -c "Select json_build_object('f_name',json_agg(f_name),'l_name',json_agg(l_name),'email',json_agg(email),'date_joined',json_agg(date_joined),'dep_name',json_agg(dep_name),'address',json_agg(address),'zip_code',json_agg(zip_code),'city',json_agg(city), 'country',json_agg(country)) from accounts WHERE last_name='ABC';"
# psql -U postgres -c "Select last_name,first_name,...(other column names).. row_to_json(accounts) from register_account WHERE last_name='ABC';"
Теперь вы сможете увидеть, занимает ли выполнение одного запроса больше времени.
Кроме того, kubectl exec pod
команда может быть выполнена со значением тайм-аута запроса ( --request-timeout=5m
), чтобы увидеть, есть ли медлительность.
Комментарии:
1. @Ikamal спасибо за ответ. Когда я пытаюсь изнутри модуля, он работает, но мне нужно выполнить его с помощью bash-скрипта
2. @devcloud да, но сначала вам нужно будет выяснить время, затраченное на эти два запроса. Для этого вы можете войти в модуль и посмотреть. Если один запрос занимает больше времени, вам придется установить
--request-timeout
большее число внутри вашего скрипта.