Невозможно выполнить длинный sql-запрос к postgres pod в kubernetes с помощью bash-скрипта

#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 большее число внутри вашего скрипта.