<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>baelog</title>
        <link>https://velog.io/</link>
        <description>데이터 엔지니어</description>
        <lastBuildDate>Thu, 02 May 2024 06:48:16 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>baelog</title>
            <url>https://velog.velcdn.com/images/baebae_dev/profile/921fa22c-fe2a-4705-8b9c-af3a52fc09f9/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. baelog. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/baebae_dev" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Troubleshooting] PostgreSQL shared memory resize 에러]]></title>
            <link>https://velog.io/@baebae_dev/Troubleshooting-PostgreSQL-shared-memory-resize-%EC%97%90%EB%9F%AC</link>
            <guid>https://velog.io/@baebae_dev/Troubleshooting-PostgreSQL-shared-memory-resize-%EC%97%90%EB%9F%AC</guid>
            <pubDate>Thu, 02 May 2024 06:48:16 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-postgresql-shared-memory-resize-에러">📌 PostgreSQL shared memory resize 에러</h1>
<hr/>
<br/>

<h2 id="❓-문제">❓ 문제</h2>
<ul>
<li>PostgreSQL에서 Query 수행 시 shared memory resize 에러 발생</li>
</ul>
<pre><code class="language-shell">ERROR:  could not resize shared memory segment &quot;/PostgreSQL.1966028679&quot; to 4294967296 bytes: No space left on device</code></pre>
<br/>
<hr/>
<br/>

<h2 id="🔍-원인">🔍 원인</h2>
<ul>
<li>Parallel Worker가 Leader Worker에게 결과물을 전달 할 때 shared memory 영역을 사용</li>
<li>현재 Docker psql container의 shm_size 값을 제한 하도록 하고 있음</li>
<li>Docker의 shared memory는 한정적이지만 parallel 쿼리의 shared memory는 제한 없이 할당되면서 error가 발생 </li>
</ul>
<br/>
<hr/>
<br/>

<h2 id="✅-해결">✅ 해결</h2>
<ul>
<li><p>Query 수행 시 max_parallel_workers_per_gather 파라미터 조정 </p>
<pre><code class="language-sql">  set max_parallel_workers_per_gather=4; (기본 24)</code></pre>
</li>
<li><p>psql container의 shared memory max 값 조정</p>
<pre><code class="language-shell">
1. psql docker-compose.yml의 shared memory size 수정

  services:
  postgresql:
    image: XXX
    container_name: psql
    ports:
      - &quot;5432:5432&quot;
    environment:
      - TZ=Asia/Seoul
      - PGCTLTIMEOUT=600
    volumes:
      - /etc/localtime:/etc/localtime:ro
      - /data/psql:/var/lib/postgresql/13/main
    shm_size: &quot;32gb&quot;
    #shm_size: &quot;16gb&quot;

2. psql docker container 재시작

  $ docker-compose up -D

3. postgresql.conf 파일의 shared_buffer 값 조정 (DB 메모리의 25% ~ 30%정도 권장)

    #shared_buffers = &#39;16GB&#39;
  shared_buffers = &#39;32GB&#39;     # (change requires restart)

4. change requires restart 설정이므로 container 내부에서 psql 서비스 재시작이 필요함
</code></pre>
</li>
</ul>
<pre><code>```sql
  5. psql 서비스 재시작 후 적용 여부 확인
  select name, setting, source, sourcefile, sourceline from pg_settings where name = &#39;shared_buffers&#39;;

        name      | setting |       source       |               sourcefile                | sourceline
----------------+---------+--------------------+-----------------------------------------+------------
 shared_buffers | 4194304 | configuration file | /etc/postgresql/13/main/postgresql.conf |        122</code></pre><br/>
<hr/>
<br/>

<h4 id="🌟-ref">🌟 REF</h4>
<ul>
<li><a href="https://www.cybertec-postgresql.com/en/memory-context-for-postgresql-memory-management/">https://www.cybertec-postgresql.com/en/memory-context-for-postgresql-memory-management/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] Parallel]]></title>
            <link>https://velog.io/@baebae_dev/PostgreSQL-Parallel</link>
            <guid>https://velog.io/@baebae_dev/PostgreSQL-Parallel</guid>
            <pubDate>Tue, 30 Apr 2024 05:59:05 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-about-parallel">📌 About Parallel</h1>
<hr/>
<br/>

<h2 id="🔍-worker의-개념">🔍 Worker의 개념</h2>
<br/>

<h3 id="session">Session</h3>
<ul>
<li>클라이언트와 DB의 연결</li>
</ul>
<br/>

<h3 id="process">Process</h3>
<ul>
<li>os 수준에서 생성되는 개별 프로세스</li>
<li>세션이 생기면 postgresql에서 내부적으로 process를 할당</li>
<li>실제 클라이언트의 작업을 수행</li>
</ul>
<br/>

<h3 id="worker">Worker</h3>
<ul>
<li>process 내에서 여러 작업(parallel)을 수행하기 위한 백그라운드 프로세스</li>
<li>work 프로세스 개수는 min_parallel_size 파라미터값을 기준으로 산정</li>
</ul>
<br/>
<hr/>
<br/>

<h2 id="🔍-parallel-관련-파라미터">🔍 Parallel 관련 파라미터</h2>
<br/>

<h3 id="세션-관련-파라미터">세션 관련 파라미터</h3>
<ul>
<li><p>max_worker_processes : 시스템이 지원할 수 있는 최대 백그라운드 프로세스의 수. Standby 서버에 해당 파라미터를 설정 시에는 Primary 서버보다 크거나 같은 값을 설정해주어야 함.</p>
</li>
<li><p>max_parallel_workers  : 병렬 작업에 사용될 수 있는 최대 worker 수를 설정. 해당 값을 변경할 때에는 병렬 처리와 관련된 파라미터들을 같이 수정해주어야 함. (max_parallel_workers_per_gather 등)</p>
</li>
<li><p>max_parallel_workers_per_gather : 하나의 parallel 프로세스가 생성 할 수 있는 worker 수</p>
</li>
<li><p>max_parallel_maintenance_workers : vaccum, index 생성과 같은 작업을 내부적으로 parallel로 수행할 때 최대 worker 개수</p>
</li>
</ul>
<br/>

<h3 id="성능-관련-파라미터">성능 관련 파라미터</h3>
<ul>
<li><p>parallel_setup_cost : parallel worker process가 작업 할 때 사용하는 비용의 추정값</p>
</li>
<li><p>parallel_tuple_cost : 병렬 작업 프로세스가 다른 프로세스에게 하나의 튜플을 전송하는 플래너의 비용 추정치. (조건절 없을때 패러럴 처리할 경우 작게 해야 함)</p>
</li>
<li><p>min_parallel_table_scan_size : parallel scan을 위한 테이블 데이터 최소 양</p>
</li>
<li><p>min_parallel_table_scan_size : parallel scan을 위한 인덱스 데이터 최소 양</p>
</li>
<li><p>force_parallel_mode : parallel을 강제 (하지만 더 적은 코스트가 아니면 강제되지 않음)</p>
</li>
<li><p>아래와 같은 paralle 시 발생하는 cost 및 최소 데이터를 0으로 설정하여 parallel을 유도</p>
<pre><code class="language-sql">
SET parallel_setup_cost to 0 ;
SET parallel_tuple_cost to 0 ;
SET min_parallel_table_scan_size to 0 ;
SET min_parallel_index_scan_size to 0 ;
SET max_parallel_workers_per_gather to DEFAULT ;</code></pre>
</li>
<li><p>parallel_leader_participation : 만약 Queue를 모두 순회했지만 모든 Parallel Worker가 결과물을 전달하지 않았다면 Leader Worker에게는 두 가지 선택이 주어집니다. 첫 번째는 Leader Worker 본인이 직접 자식 실행 계획을 수행하여 결과물을 만들어 내는 것입니다. 두 번째는 Parallel Worker 중 하나라도 먼저 끝내는 Worker가 생길 때까지 대기하는 방법</p>
<pre><code class="language-sql">
set parallel_leader_participation TO 0;</code></pre>
<br/>
<hr/>
<br/>

<h2 id="🔍-parallel-설정-예시">🔍 Parallel 설정 예시</h2>
</li>
</ul>
<pre><code class="language-sql">
    SET parallel_setup_cost = 100; -- 패러럴 시작 코스트 변경
     SET force_parallel_mode = on; -- 패러럴 강제(하지만 더 적은 코스트가 아니면 강제되지 않음)
    SET parallel_tuple_cost = 0.0001; -- 패러럴 튜플 코스트 변경(조건절 없을때 패러럴 처리할 경우 작게 해야 함)
    SET max_parallel_workers_per_gather = 32;
    SET max_parallel_maintenance_workers TO 16;
    SET maintenance_work_mem TO &#39;30 GB&#39;;</code></pre>
<br/>
<hr/>
<br/>

<h4 id="🌟-ref">🌟 REF</h4>
<ul>
<li><a href="https://www.cybertec-postgresql.com/en/parallel-aggregate-postgresql-16-better-performance/">https://www.cybertec-postgresql.com/en/parallel-aggregate-postgresql-16-better-performance/</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Troubleshooting] Git 파일 Permission 설정]]></title>
            <link>https://velog.io/@baebae_dev/Troubleshooting-Git-%ED%8C%8C%EC%9D%BC-Permission-%EC%84%A4%EC%A0%95</link>
            <guid>https://velog.io/@baebae_dev/Troubleshooting-Git-%ED%8C%8C%EC%9D%BC-Permission-%EC%84%A4%EC%A0%95</guid>
            <pubDate>Sat, 27 Apr 2024 23:26:41 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-git-파일-permission-설정하기">📌 Git 파일 Permission 설정하기</h1>
<hr/>
<br/>

<h2 id="❓-문제">❓ 문제</h2>
<ul>
<li>워크플로 배치 실행시 Gitlab 레퍼지토리의 .sh 파일 실행 결과 Permission denied 에러 발생</li>
</ul>
<br/>
<hr/>
<br/>

<h2 id="🔍-원인">🔍 원인</h2>
<pre><code class="language-shell">
1. 현재 git 파일 Permission 확인
$ git ls-files --stage
100644 a003xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0       hash.sh</code></pre>
<ul>
<li><p>Permission 644</p>
<ul>
<li>루트 사용자 권한 : 읽기, 쓰기</li>
<li>일반 사용자 권한 : 읽기</li>
<li>그룹 권한 : 읽기</li>
</ul>
</li>
<li><p>파일 실행 권한이 없음을 확인</p>
</li>
</ul>
<br/>
<hr/>
<br/>

<h2 id="✅-해결">✅ 해결</h2>
<pre><code class="language-shell">
1. 파일모드 변경 추적 설정 적용
$ git config core.fileMode true

2. 파일 Permission update
$ git update-index --chmod=+x ./hash.sh

3. 현재 git 파일 Permission 확인
$ git ls-files --stage
100755 a003xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 0       hash.sh

4. commit
$ git commit -m &quot;update permission&quot;

5. push
$ git push arigin main</code></pre>
<ul>
<li>Permission 755<ul>
<li>루트 사용자 권한 - 읽기, 쓰기, 실행</li>
<li>일반 사용자 권한 - 읽기, 실행</li>
<li>그룹 - 읽기, 실행</li>
</ul>
</li>
<li>파일 실행 권한을 부여하여 해결</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[FastAPI] 파이보 서비스 개발 (1)]]></title>
            <link>https://velog.io/@baebae_dev/FastAPI-%ED%8C%8C%EC%9D%B4%EB%B3%B4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-1</link>
            <guid>https://velog.io/@baebae_dev/FastAPI-%ED%8C%8C%EC%9D%B4%EB%B3%B4-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%9C%EB%B0%9C-1</guid>
            <pubDate>Wed, 24 Apr 2024 02:26:05 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-fastapi--react로-파이보-서비스-개발하기">📌 FastAPI + React로 파이보 서비스 개발하기</h1>
<hr/>


<blockquote>
<p>박응용님의 <span style="color:indianred"><code>점프 투 FastAPI</code></span> 내 파이보서비스 따라 개발하기</p>
</blockquote>
<hr/>
<br/>

<h2 id="✅-python-설치">✅ python 설치</h2>
<ul>
<li><p>python이 설치되어 있지 않다면 python을 설치한다.(3.8 이상) <a href="https://www.python.org/">https://www.python.org/</a></p>
</li>
<li><p>터미널에서 python 버전을 확인한다.</p>
<pre><code class="language-shell">
1. python 버전 확인
baebae@baebaeui-MacBookPro ~ % python -V

</code></pre>
</li>
</ul>
<ol start="2">
<li>mac의 경우 기본 python이 2.x 버전으로 설치되어 있으므로 python3 버전 확인
baebae@baebaeui-MacBookPro ~ % python3 -V
Python 3.11.5</li>
</ol>
<ol start="3">
<li><p>python의 기본 경로를 python3로 지정해줄 수 있다.</p>
<ol>
<li><p>python 설치된 경로 확인
baebae@baebaeui-MacBookPro ~ % ls -l /usr/local/bin/python*</p>
</li>
<li><p>환경변수 설정
baebae@baebaeui-MacBookPro ~ % vi ~/.zshrc</p>
</li>
<li><p>파일 내 입력
alias python=/Library/Frameworks/Python.framework/Versions/3.11/bin/python3</p>
</li>
<li><p>환경변수 적용
baebae@baebaeui-MacBookPro ~ % source ~/.zshrc </p>
</li>
<li><p>적용여부 확인
baebae@baebaeui-MacBookPro myapi % python -V
Python 3.11.5</p>
<pre><code></code></pre></li>
</ol>
</li>
</ol>
<h2 id="✅-가상환경-생성">✅ 가상환경 생성</h2>
<blockquote>
<p>프로젝트의 버전, 의존성 관리를 위해 가상환경을 생성하고 가상환경 내에서 개발한다.</p>
</blockquote>
<pre><code class="language-shell">1. 가상환경 생성

  1. venvs 디렉토리 생성
  baebae@baebaeui-MacBookPro fastapi % mkdir venvs
  baebae@baebaeui-MacBookPro fastapi % cd venvs

  2. myapi 내 가상환경 생성
  baebae@baebaeui-MacBookPro venvs % python -m venv myapi

  3. 가상환경 진입
  baebae@baebaeui-MacBookPro venvs % cd myapi
  baebae@baebaeui-MacBookPro myapi % cd bin
  baebae@baebaeui-MacBookPro bin % source activate
  (myapi) baebae@baebaeui-MacBookPro bin %

  4. 벗어나기
  (myapi) baebae@baebaeui-MacBookPro bin % deactivate
  baebae@baebaeui-MacBookPro bin %


2. FastAPI 설치
(myapi) baebae@baebaeui-MacBookPro bin % python -m pip install --upgrade pip
(myapi) baebae@baebaeui-MacBookPro bin % pip install fastapi


3. 환경변수 추가

  1. 파일열기
  vi ~/.zshrc

  2. 파일 내 입력
  alias myapi=&#39;cd /Users/baebae/Documents/practice/fastapi/projects/myapi;source /Users/baebae/Documents/practice/fastapi/venvs/myapi/bin/activate&#39;

  3. 적용여부 확인
  baebae@baebaeui-MacBookPro myapi % myapi
  (myapi) baebae@baebaeui-MacBookPro myapi %</code></pre>
<h2 id="✅-react-환경-세팅">✅ React 환경 세팅</h2>
<ul>
<li><p>Node.js 설치 : <a href="https://nodejs.org/">https://nodejs.org</a></p>
<pre><code class="language-shell">#설치된 버전 확인
baebae@baebaeui-MacBookPro myapi % node -v
v20.12.2</code></pre>
</li>
<li><p>React 설치</p>
<pre><code class="language-shell">
1. 가상환경 진입
baebae@baebaeui-MacBookPro myapi % myapi
(myapi) baebae@baebaeui-MacBookPro myapi %

</code></pre>
</li>
</ul>
<ol start="2">
<li>React application 생성
(myapi) baebae@baebaeui-MacBookPro myapi % npx create-react-app frontend</li>
</ol>
<ol start="3">
<li><p>React 설치</p>
<ol>
<li>npm 초기설정
(myapi) baebae@baebaeui-MacBookPro myapi % npm init -y
Wrote to /Users/baebae/Documents/practice/fastapi/projects/myapi/package.json:</li>
</ol>
<p>{
&quot;name&quot;: &quot;myapi&quot;,
&quot;version&quot;: &quot;1.0.0&quot;,
&quot;main&quot;: &quot;index.js&quot;,
&quot;scripts&quot;: {
 &quot;test&quot;: &quot;echo &quot;Error: no test specified&quot; &amp;&amp; exit 1&quot;
},
&quot;author&quot;: &quot;&quot;,
&quot;license&quot;: &quot;ISC&quot;,
&quot;dependencies&quot;: {
 &quot;react&quot;: &quot;^18.2.0&quot;,
 &quot;react-dom&quot;: &quot;^18.2.0&quot;
},
&quot;devDependencies&quot;: {},
&quot;keywords&quot;: [],
&quot;description&quot;: &quot;&quot;
}</p>
<ol start="2">
<li>React 설치
(myapi) baebae@baebaeui-MacBookPro myapi % npm install --save react react-dom</li>
</ol>
</li>
</ol>
<ol start="4">
<li><p>React 서버 실행</p>
<p>baebae@baebaeui-MacBookPro frontend % npm start</p>
<p>Compiled successfully!</p>
<p>You can now view frontend in the browser.</p>
<p>Local:            <a href="http://localhost:3000">http://localhost:3000</a>
On Your Network:  <a href="http://xxx.xxx.x.xx:3000">http://xxx.xxx.x.xx:3000</a></p>
<p>Note that the development build is not optimized.
To create a production build, use npm run build.</p>
<p>webpack compiled successfully</p>
<pre><code></code></pre></li>
</ol>
<ul>
<li><p>브라우저를 열고 <span style="color:indianred"><code>http://localhost:3000/</code></span>로 접속하면 아래 화면이 나타난다.</p>
<p><img src="https://velog.velcdn.com/images/baebae_dev/post/187c5ce9-7828-4dcf-8a5b-913fbf32a214/image.png" alt=""></p>
</li>
</ul>
<h2 id="✅-hello-api-만들기">✅ Hello API 만들기</h2>
<ol>
<li><p><span style="color:indianred"><code>main.py</code></span> 작성 [파일명: projects/myapi/main.py]</p>
<pre><code class="language-python">
from fastapi import FastAPI

app = FastAPI()

@app.get(&quot;/hello&quot;)
def hello():
   return {&quot;message&quot;: &quot;hello world&quot;}</code></pre>
</li>
<li><p>유비콘(Uvicorn)설치 : 비동기 호출을 지원하는 파이썬용 웹 서버</p>
<pre><code class="language-shell">
(myapi) baebae@baebaeui-MacBookPro myapi % pip install &quot;uvicorn[stadndard]&quot;</code></pre>
</li>
<li><p>FastAPI 서버 실행</p>
<pre><code class="language-shell">
(myapi) baebae@baebaeui-MacBookPro myapi % uvicorn main:app --reload
INFO:     Will watch for changes in these directories: [&#39;/Users/baebae/Documents/practice/fastapi/projects/myapi&#39;]
INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [90154] using StatReload
INFO:     Started server process [90156]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     127.0.0.1:60303 - &quot;GET /docs HTTP/1.1&quot; 200 OK
INFO:     127.0.0.1:60303 - &quot;GET /openapi.json HTTP/1.1&quot; 200 OK</code></pre>
</li>
<li><p>Hello API 테스트</p>
<ol>
<li><p>웹 브라우저에서 <a href="http://127.0.0.1:8000/docs">http://127.0.0.1:8000/docs</a> 로 이동
<img src="https://velog.velcdn.com/images/baebae_dev/post/bb33dc81-9334-4ce0-b419-f4d799f2f994/image.png" alt=""></p>
</li>
<li><p>Try it out 누르고 Execute 누르면
<img src="https://velog.velcdn.com/images/baebae_dev/post/783b9a3a-c7b7-4adf-9a4e-2d97c022382f/image.png" alt=""></p>
</li>
</ol>
</li>
<li><p>React 웹페이지 만들기</p>
<ol>
<li><p><span style="color:indianred"><code>App.js</code></span> 수정 [파일명: projects/myapi/frontend/src/App.js]</p>
<pre><code class="language-javascript">
import React, {useState} from &quot;react&quot;;

function App() {
const [message, setMessage] = useState([]); 
fetch(&quot;http://127.0.0.1:8000/hello&quot;)
 .then((response) =&gt; response.json())
 .then((json) =&gt; {
 console.log(&quot;json.message: &quot;, json.message);     
 setMessage(json.message)
 console.log(&quot;message: &quot;, message);
})

return (
 &lt;h1&gt;{message}&lt;/h1&gt;
);
}

export default App;</code></pre>
</li>
<li><p><span style="color:indianred"><code>main.py</code></span> 수정 [파일명: projects/myapi/main.py]</p>
<pre><code class="language-python">
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

app = FastAPI()

origins = [
 # &quot;http://localhost:3000&quot;
 &quot;*&quot;
]

app.add_middleware(
 CORSMiddleware,
 allow_origins=origins,
 allow_credentials=True,
 allow_methods=[&quot;*&quot;],
 allow_headers=[&quot;*&quot;],
)

@app.get(&quot;/hello&quot;)
def hello():
 return {&quot;message&quot;: &quot;hello world&quot;}</code></pre>
</li>
<li><p>웹 브라우저에서 <a href="http://localhost:3000/%EB%A1%9C">http://localhost:3000/로</a> 이동
<img src="https://velog.velcdn.com/images/baebae_dev/post/82f07970-a362-4b25-a9d3-f1368a2a3d00/image.png" alt=""></p>
</li>
</ol>
</li>
</ol>
<h4 id="🌟-ref">🌟 REF</h4>
<ul>
<li><a href="https://wikidocs.net/book/8531">점프 투 FastAPI wikidocs</a></li>
<li><a href="https://reactjs-kr.firebaseapp.com/docs/installation.html#trying-out-react">https://reactjs-kr.firebaseapp.com/docs/installation.html#trying-out-react</a></li>
<li><a href="https://react.dev/learn/start-a-new-react-project">https://react.dev/learn/start-a-new-react-project</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] 자주 쓰는 query]]></title>
            <link>https://velog.io/@baebae_dev/PostgreSQL-%EC%9E%90%EC%A3%BC-%EC%93%B0%EB%8A%94-query</link>
            <guid>https://velog.io/@baebae_dev/PostgreSQL-%EC%9E%90%EC%A3%BC-%EC%93%B0%EB%8A%94-query</guid>
            <pubDate>Tue, 23 Apr 2024 01:51:26 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-postgresql-자주-쓰는-query-정리">📌 PostgreSQL 자주 쓰는 Query 정리</h1>
<hr/>
<br/>

<pre><code class="language-sql">-- schema 별 relation (table, view 등) 조회
SELECT relnamespace::regnamespace, relname, relkind 
  FROM pg_class 
 WHERE relnamespace::regnamespace::text like &#39;%_%&#39; ;

-- 실행중인 쿼리 확인
SELECT pid, query_start, query, state 
  FROM pg_catalog.pg_stat_activity 
 WHERE current_timestamp - query_start &gt; &#39;1 sec&#39; and state &lt;&gt; &#39;idle&#39;;

-- 실행중인 쿼리 중단
SELECT pg_cancel_backend(pid);
SELECT pg_terminate_backend(pid);

-- user login password 생성
CREATE USER username WITH login password &#39;loginpassword&#39;;

-- schema 별 용량 조회
SELECT schema_name,
    pg_size_pretty(sum(table_size)::bigint) AS &quot;disk space&quot;,
    pg_size_pretty(pg_database_size(current_database())) AS &quot;DB_size&quot;,
    (sum(table_size) / pg_database_size(current_database())) * 100
        AS &quot;percent (%)&quot;
FROM (
     SELECT pg_catalog.pg_namespace.nspname AS schema_name,
         pg_relation_size(pg_catalog.pg_class.oid) AS table_size
       FROM   pg_catalog.pg_class
       JOIN pg_catalog.pg_namespace
         ON relnamespace = pg_catalog.pg_namespace.oid
) t
GROUP BY schema_name
ORDER BY schema_name;

-- table 목록 조회
SELECT RELNAME AS TABLE_NAME
  FROM PG_STAT_USER_TABLES;

-- column 목록 조회
SELECT *
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE TABLE_CATALOG = &#39;데이터베이스명&#39;
   AND TABLE_NAME    = &#39;테이블명&#39;
 ORDER BY ORDINAL_POSITION;

-- 기본키 조회
SELECT CC.COLUMN_NAME AS COLUMN_NAME
  FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS       TC
      ,INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE CC
 WHERE TC.TABLE_CATALOG   = &#39;데이터베이스명&#39;
   AND TC.TABLE_NAME      = &#39;테이블명&#39;
   AND TC.CONSTRAINT_TYPE = &#39;PRIMARY KEY&#39;
   AND TC.TABLE_CATALOG   = CC.TABLE_CATALOG
   AND TC.TABLE_SCHEMA    = CC.TABLE_SCHEMA
   AND TC.TABLE_NAME      = CC.TABLE_NAME
   AND TC.CONSTRAINT_NAME = CC.CONSTRAINT_NAME;

 -- table comment 조회
 SELECT PS.RELNAME    AS TABLE_NAME
      ,PD.DESCRIPTION AS TABLE_COMMENT
  FROM PG_STAT_USER_TABLES PS
      ,PG_DESCRIPTION      PD
 WHERE PS.RELNAME  = &#39;테이블명&#39;
   AND PS.RELID   = PD.OBJOID
   AND PD.OBJSUBID  = 0;

-- column comment 조회
SELECT PS.RELNAME    AS TABLE_NAME
      ,PA.ATTNAME     AS COLUMN_NAME
      ,PD.DESCRIPTION AS COLUMN_COMMENT
  FROM PG_STAT_ALL_TABLES PS
      ,PG_DESCRIPTION     PD
      ,PG_ATTRIBUTE       PA
 WHERE PS.SCHEMANAME = (SELECT SCHEMANAME
                            FROM PG_STAT_USER_TABLES
                           WHERE RELNAME = &#39;테이블명&#39;)
   AND PS.RELNAME  = &#39;테이블명&#39;
   AND PS.RELID   = PD.OBJOID
   AND PD.OBJSUBID &lt;&gt; 0
   AND PD.OBJOID    = PA.ATTRELID
   AND PD.OBJSUBID  = PA.ATTNUM
 ORDER BY PS.RELNAME, PD.OBJSUBID;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] psql 명령어]]></title>
            <link>https://velog.io/@baebae_dev/PostgreSQL-psql-%EB%AA%85%EB%A0%B9%EC%96%B4</link>
            <guid>https://velog.io/@baebae_dev/PostgreSQL-psql-%EB%AA%85%EB%A0%B9%EC%96%B4</guid>
            <pubDate>Mon, 22 Apr 2024 05:29:03 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-postgresql-명령어">📌 PostgreSQL 명령어</h1>
<hr/>
<br/>

<h2 id="🔍-psql-옵션os-level">🔍 PSQL 옵션(OS Level)</h2>
<br/>

<h3 id="접속-옵션">접속 옵션</h3>
<ul>
<li><p>-d: 데이터베이스명 </p>
</li>
<li><p>-h: 호스트 또는 IP </p>
</li>
<li><p>-p: 포트 </p>
</li>
<li><p>-U: 사용자계정 </p>
</li>
<li><p>-w: 패스워드 없이 접속 </p>
</li>
<li><p>-W: 패스워드 확인</p>
</li>
<li><p>예시</p>
</li>
</ul>
<pre><code class="language-shell"> --DB접속
 psql -h localhost -p 5432 -U dbadmin -d testdb

 --패스워드 확인
 psql -d testdb -U dbadmin -W

 --스크립트수행
 psql -h localhost -p 5432 -U dbadmin -d testdb -f /work_dir/psqltest/test_script/insert_test.sql -X -b &amp;&gt;&gt; /work_dir/psqltest/test_script/log/test_result.log

 --스크립트 여러개
 find /home/testuser/work_dir/psqltest/ -name &quot;*.sql&quot; -print0 | xargs --null -P 1 -I {} psql -U dbadmin -d testdb -h localhost -f {} &gt;&gt; complie.log</code></pre>
<br/>

<h3 id="입출력-옵션">입출력 옵션</h3>
<ul>
<li>-a : 스크립트의 모든 입력 표시 (echo all)</li>
<li>-b : 실패한 명령들 출력 (echo error)- -e : 서버로 보낸 명령 표시 (echo-queries)</li>
<li>-E : 내부 명령이 생성하는 쿼리 표시 (echo-hidden)</li>
<li>-L, --log-file=FILENAME  : 세션 로그를 파일로 보냄</li>
<li>-n : 확장된 명령행 편집 기능을 사용중지함(no readline)</li>
<li>-o, --output=FILENAME : 쿼리 결과를 파일(또는 |파이프)로 보냄</li>
<li>-q : 자동 실행(메시지 없이 쿼리 결과만 표시) (quiet)</li>
<li>-s : 단독 순차 모드(각 쿼리 확인) (single-step)</li>
<li>-S : 한 줄 모드 (줄 끝에서 SQL 명령이 종료됨) (single-line)</li>
<li>-t : row만 출력 (tuples-only)</li>
</ul>
<p>기타 옵션</p>
<ul>
<li><p>-X : psql구성 파일(사용자 ~/.psqlrc파일과 시스템 전체 psqlrc파일 모두) 을 읽지 않도록 강제함 (--no-psqlrc)</p>
</li>
<li><p>참고사항</p>
<ul>
<li>.psqlrc : psql의 사용자 기본 구성 파일</li>
<li>bashrc와 비슷하게 psql 사용 시 환경을 셋팅함</li>
</ul>
</li>
</ul>
<pre><code class="language-sql">
  \set QUIET 1
  \timing
  \set ON_ERROR_ROLLBACK interactive
  \set VERBOSITY verbose
  \set HISTFILE ~/.psql_history- :DBNAME
  \set HISTCONTROL ignoredups
  \set COMP_KEYWORD_CASE upper
  \pset null [null]
  \unset QUIET
  \setenv PAGER &#39;more&#39;</code></pre>
<br/>
<hr/>
<br/>

<h2 id="🔍-psql-명령어">🔍 PSQL 명령어</h2>
<h3 id="db-메타정보">DB 메타정보</h3>
<ul>
<li>명령어 뒤에 (+)로 더 많은 정보를 볼 수 있음. 예시)\dt+ it_uitem_m</li>
<li>\l : 데이터베이스 정보</li>
<li>\c : 접속정보</li>
<li>\dn : 스키마 정보</li>
<li>\du : 유저 정보</li>
<li>\d(+) {table} : 테이블, 인덱스, 시퀀스, 뷰 정보</li>
<li>\dt : 테이블 정보</li>
<li>\di : 인덱스 정보</li>
<li>\ds : 시퀀스 정보</li>
<li>\dv : 뷰 테이블 정보</li>
<li>\dS : 시스템 테이블 정보 포함</li>
<li>\db : Tablespace 정보</li>
<li>\dx : 데이터베이스에 설치된 모든 extention 정보</li>
<li>\dp(+) : 오브젝트 권한 정보</li>
<li>\ddp(+) : 오브젝트 default 권한 정보</li>
<li>\det(+) : foreign 테이블 정보</li>
<li>\des(+) : foreign server 정보</li>
<li>\deu(+) : foreign server mapping 정보</li>
<li>\dew(+) : foreign data wrapper</li>
<li>\drds : 유저 setting 값 (search)</li>
</ul>
<h3 id="set-명령어">SET 명령어</h3>
<ul>
<li>\set AUTOCOMMIT [on, off] : AUTOCOMMIT 설정 </li>
<li>\pset pager [on, off, more]: 페이지 설정</li>
</ul>
<h3 id="기타-명령어">기타 명령어</h3>
<ul>
<li>show search_path; : 현재 접속 user의 search_path 출력</li>
<li>show {parameter}; : 파라미터 값 출력</li>
<li>\watch 1 : 쿼리 하단에 추가하여 1초마다 해당 쿼리를 수행</li>
<li>\c {database} {user} : 다른 데이터베이스에 지정한 유저로 접속</li>
<li>\o test.log : test.log에 결과 값을 전송 (spool test.log와 동일) , 결과값만 표시</li>
<li>\o : 결과값 전송을 중지 (spool off)</li>
<li>\echo :AUTOCOMMIT  : 출력</li>
<li>\timing [on, off] : 수행시간 출력</li>
<li>\t [on, off] : 결과 row만 출력</li>
<li>\s: 실행한 명령어 히스토리 </li>
<li>\s filename: 실행한 명령어 히스토리를 특정 파일로 저장 </li>
<li>\e: 쿼리를 편집 한 후 실행 </li>
<li>\e filename: 특정 파일에 쿼리를 저장 후 실행 </li>
<li>\w filename: 특정 파일에 쿼리 저장 </li>
<li>\o filename: 특정 파일에 실행 결과 저장 </li>
<li>\i filename: 파일 실행</li>
<li>\g : 이전 쿼리 실행</li>
<li>\s : 쿼리 history</li>
<li>\q: 종료하기</li>
<li>\copy TABLE_NAME to &#39;location/file_name&#39; delimiter &#39;|&#39; csv header; : 테이블 csv로 export</li>
</ul>
<br/>
<hr/>
<br/>

<h4 id="🌟-ref">🌟 REF</h4>
<ul>
<li><a href="https://www.postgresql.org/docs/current/app-psql.html">https://www.postgresql.org/docs/current/app-psql.html</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] docker-compose로 PostgreSQL 컨테이너 생성하기]]></title>
            <link>https://velog.io/@baebae_dev/PostgreSQL-docker-compose%EB%A1%9C-PostgreSQL-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@baebae_dev/PostgreSQL-docker-compose%EB%A1%9C-PostgreSQL-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EC%83%9D%EC%84%B1%ED%95%98%EA%B8%B0</guid>
            <pubDate>Thu, 18 Apr 2024 09:53:50 GMT</pubDate>
            <description><![CDATA[<hr/>

<h1 id="📌-docker-compose로-postgresql-컨테이너-생성하기">📌 docker-compose로 PostgreSQL 컨테이너 생성하기</h1>
<hr/>
<br/>
<br/>

<h2 id="✅-postgresql-image-가져오기">✅ PostgreSQL image 가져오기</h2>
<ul>
<li><p>PostgreSQL 컨테이너를 생성할 이미지를 가져온다. 이미지를 가져올 때 태그를 지정하지 않으면 최신 버전(latest)를 가져오게 된다.</p>
<pre><code class="language-Bash">% docker pull postgres</code></pre>
<p><img src="https://velog.velcdn.com/images/baebae_dev/post/cd0e19ef-5b4f-4d7e-90a6-4deae1bcc98a/image.png" alt=""></p>
</li>
<li><p>이미지를 잘 가져왔는지 확인한다.</p>
<pre><code class="language-shell">
% docker images</code></pre>
<p><img src="https://velog.velcdn.com/images/baebae_dev/post/94938c6d-0e35-4a1e-8f2e-31857b248446/image.png" alt=""></p>
</li>
</ul>
<br/>
<hr/>
<br/>


<h2 id="✅-docker-composeyml-작성">✅ docker-compose.yml 작성</h2>
<ul>
<li><p><span style="color:indianred"><code>docker-compose.yml</code></span> 파일을 생성하고 편집기로 아래처럼 작성한다.</p>
<pre><code class="language-shell">
% touch docker-compose.yml
% vi docker-compose.yml</code></pre>
<pre><code class="language-shell">
version: &#39;3.9&#39;

services:

  db:
    image: postgres
    restart: always
    container_name: psql
    ports:
      - &quot;5432:5432&quot;
    shm_size: 128mb
    environment:
      POSTGRES_USER: exampleuser
      POSTGRES_PASSWORD: examplepw
      POSTGRES_DB: exampledb</code></pre>
<ul>
<li>version : 작성하는 compose file format의 버전 </li>
<li>image : 생성할 컨테이너의 이미지명</li>
<li>restart : 컨테이너 실행 시 재시작</li>
<li>container_name : 생성할 컨테이너 명</li>
<li>ports : 접근 포트 (컨테이너 외부:컨테이너 내부)</li>
<li>shm_size : shared_memory 크기</li>
<li>POSTGRES_USER : PostgreSQL 계정</li>
<li>POSTGRES_PASSWORD : PostgreSQL 비밀번호</li>
<li>POSTGRES_DB : PostgreSQL DB 명</li>
</ul>
</li>
</ul>
<br/>
<hr/>
<br/>

<h2 id="✅-docker-compose-실행">✅ docker-compose 실행</h2>
<p>docker-compose.yml 파일을 생성한 위치에서 아래 명령어를 입력해 실행하고 컨테이너가 생성되었는지 확인한다.</p>
<pre><code class="language-shell">
% docker-compose up -d
% docker ps</code></pre>
<p><img src="https://velog.velcdn.com/images/baebae_dev/post/a4d98035-0ada-4ee6-be54-97acbed52269/image.png" alt="">
<img src="https://velog.velcdn.com/images/baebae_dev/post/1cfbd715-8440-4af9-8dd4-6dcfa2ceda8b/image.png" alt=""></p>
<br/>
<hr/>
<br/>

<h2 id="✅-postgresql-접속">✅ PostgreSQL 접속</h2>
<ul>
<li><p>생성한 PostgreSQL 컨테이너에 진입한다.</p>
<pre><code class="language-shell">% docker exec -it psql /bin/bash</code></pre>
</li>
<li><p>PostgreSQL DB에 접속한다.</p>
<pre><code class="language-shell">% psql -U exampleuser -d exampledb</code></pre>
<p><img src="https://velog.velcdn.com/images/baebae_dev/post/613d7403-8ac3-46ba-adea-52c8f7875f4b/image.png" alt="">
성공적으로 DB에 접속한 것을 확인할 수 있다.</p>
</li>
</ul>
<br/>
<hr/>
<br/>

<h4 id="🌟-ref">🌟 REF</h4>
<ul>
<li><a href="https://hub.docker.com/_/postgres">https://hub.docker.com/_/postgres</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PostgreSQL] PostgreSQL 을 쓰는 이유]]></title>
            <link>https://velog.io/@baebae_dev/PostgreSQL</link>
            <guid>https://velog.io/@baebae_dev/PostgreSQL</guid>
            <pubDate>Wed, 17 Apr 2024 08:55:20 GMT</pubDate>
            <description><![CDATA[<br/>
<hr/>

<h1 id="📌-postgresql은">📌 PostgreSQL은?</h1>
<blockquote>
<p><span style="color:indianred"><code>PostgreSQL</code></span>은 확장 가능성 및 표준 준수를 강조하는 객체-관계형 데이터베이스 관리 시스템의 하나이다. BSD 허가권으로 배포되며 오픈소스 개발자 및 관련 회사들이 개발에 참여하고 있다.</p>
</blockquote>
<p>Website : <a href="https://www.postgresql.org/">www.postgresql.org</a>
Technical documentation : <a href="https://www.postgresql.org/docs/">www.postgresql.org/docs</a></p>
<hr/>
<br/>

<h2 id="📈-db-trend-popularity">📈 DB Trend Popularity</h2>
<p><img src="https://velog.velcdn.com/images/baebae_dev/post/adbc74cb-e5cc-4e01-9683-85d6455e645b/image.png" alt="">
DB-Engines의 Trend Popularity에 따르면 PostgreSQL의 인기는 꾸준히 상승하여 상위 3개 DB(Oracle, MySQL, MsSQL)와의 격차를 줄이고 있다. 
출처 : <a href="https://db-engines.com/en/ranking_trend">https://db-engines.com/en/ranking_trend</a></p>
<br/>
<hr/>
<br/>

<h2 id="🔍-장점">🔍 장점</h2>
<h3 id="open-source">Open Source</h3>
<ul>
<li>PostgreSQL은 오픈 소스 프로젝트로써 높은 라이센스 비용이 요구되는 상용 DBMS인 Oracle 등과 달리 무료 이용이 가능하다.</li>
<li>커뮤니티의 활성화에 따른 빠른 문제 해결 및 기술발전이 가능하다.</li>
</ul>
<h3 id="최다-sql-기능-지원">최다 SQL 기능 지원</h3>
<ul>
<li>SQL 표준 최다 준수<ul>
<li>2023년 9월 릴리즈 된 16버전 부터 SQL : 2023 Core 적합성을 위한 179개 필수 기능 중 최소 170개를 준수한다. </li>
</ul>
</li>
<li>다양한 운영체제 지원<ul>
<li>Microsoft Windows, MacOS, Linux(General/Generic), Linux(Ubuntu), Linux(Debian), Linux(SUSE Linux Enterprise Server &amp; OpenSuSE), Linux(Red Hat Enterprises, CentOS, Fedora, Scientific, Oracle), Oracle Solaris, Fedora, BSD (FreeBSD, OpenBSD), Open Source Build</li>
</ul>
</li>
<li>다양한 데이터 유형<ul>
<li>기본 요소 : Integer, Numeric, String, Boolean</li>
<li>구조화 : Date/time, Array, Range / Multirange, UUID</li>
<li>문서 : JSON/JSONB, XML, Key-value (Hstore)</li>
<li>기하학 : Point, Line, Circle, Polygon</li>
<li>사용자 정의 : Composite, Custom Types<h3 id="데이터-무결성">데이터 무결성</h3>
</li>
</ul>
</li>
<li>UNIQUE, NOT NULL</li>
<li>Primary Keys</li>
<li>Foreign Keys</li>
<li>Exclusion Constraints</li>
<li>Explicit Locks, Advisory Locks<h3 id="동시성-성능">동시성, 성능</h3>
</li>
<li>인덱싱 : B-tree, Multicolumn, Expressions, Partial</li>
<li>고급 인덱싱 : GIST, SP-Gist, KNN Gist, GIN, BRIN, Covering indexes, Bloom filters</li>
<li>Sophisticated query planner / optimizer, index-only scans, multicolumn statistics</li>
<li>Transactions, Nested Transactions</li>
<li>Multi-Version concurrency Control (MVCC)</li>
<li>Parallelization of read queries and building B-tree indexes</li>
<li>Table paritioning</li>
<li>All transaction isolation levels defined in the SQL standard, including Serializable</li>
<li>Just-In-Time (JIT) compilation of expressions<h3 id="신뢰성">신뢰성</h3>
</li>
<li>Write-ahead Logging (WAL)</li>
<li>Replication : Asynchronous, Synchronous, Logical</li>
<li>Point-In-Time-Recovery(PITR), active standbys</li>
<li>Tablespaces<h3 id="보안">보안</h3>
</li>
<li>인증 : GSSAPI, SSPI, LDAP, SCRAM-SHA-256, Certificate, ...</li>
<li>견고한 접근통제 시스템</li>
<li>행/열 수준 보안</li>
<li>인증서 및 추가 방법을 통한 다단계 인증<h3 id="extension">Extension</h3>
</li>
<li>저장 함수 및 프로시저</li>
<li>절차적 언어 : PL/pgSQL, Perl, Python, ...</li>
<li>SQL/JSON 생성자 및 경로 표현식</li>
<li>외부 데이터 래퍼 : 표준 SQL 인터페이스를 사용하여 다른 데이터베이스 또는 스트림에 연결</li>
<li>테이블을 위한 맞춤형 스토리지 인터페이스</li>
<li>PostGIS를 포함하여 추가기능을 제공하는 많은 Extension</li>
</ul>
<br/>
<hr/>
<br/>

<h2 id="🔍-단점">🔍 단점</h2>
<ul>
<li>CRUD 성능이 상대적으로 좋지 않은 편으로 알려져 있다.</li>
<li>읽기 전용의 속도와 안정성이 필요한 경우 특정 SQL 기능을 포함하지 않은 MySQL이 더 가벼운 상태를 유지한다. 그러나, 부하가 많은 상황에서 복잡한 쿼리를 많이 실행할 경우는 PostgreSQl이 더 나은 선택일 수 있다.</li>
</ul>
<br/>
<hr/>
<br/>

<h4 id="🌟-ref">🌟 REF</h4>
<ul>
<li><a href="https://www.postgresql.org/">www.postgresql.org</a></li>
<li><a href="https://www.postgresql.org/docs/">www.postgresql.org/docs</a></li>
<li><a href="https://www.integrate.io/ko/blog/postgresql-vs-mysql-which-one-is-better-for-your-use-case-ko/">www.integrate.io</a></li>
<li><a href="https://db-engines.com/en/system/PostgreSQL">https://db-engines.com/en/system/PostgreSQL</a></li>
</ul>
]]></description>
        </item>
    </channel>
</rss>