AD JB Toolbox 01

MariaDB 강좌 / 로컬·원격 접속과 연결 오류 해결하기

MariaDB 연결 오류는 서버 도달 여부, 포트·프로토콜, 계정 매칭, 인증과 DB 권한을 순서대로 나누어 확인하면 원인을 좁힐 수 있습니다. 원격 연결은 서버의 수신 주소·방화벽·계정 출발지 조건과 암호화가 모두 맞아야 하며, 먼저 로컬 TCP 연결부터 검증하는 편이 좋습니다.

클라이언트·서버·접속 경로를 분리해 확인하기

클라이언트가 설치되었다는 사실과 MariaDB 서버가 실행 중이라는 사실은 다릅니다. ODBC 드라이버만 설치한 경우에도 서버는 없을 수 있습니다. 설치 환경·서비스 이름·실행 파일 경로는 시스템마다 다르므로 Windows 설치와 서비스 확인 또는 Ubuntu 설치와 서버 실행 절차에서 실제 값을 확인합니다. 서버 자체의 설치·서비스 상태는 Windows에 MariaDB 설치하고 서버 실행하기 또는 Ubuntu에 MariaDB 설치하고 서버 실행하기으로 확인하고, 도달한 뒤 허용 작업은 사용자 계정 만들고 필요한 권한만 부여하기의 권한 검사로 분리합니다.

증상 우선 확인 바로 결론 내리지 않을 것
명령을 찾을 수 없음 클라이언트 경로·PATH DB 암호 오류가 아님
연결 거절·시간 초과 서버·주소·포트·경로 GRANT만 바꾸어 해결되지 않음
Access denied 사용자·호스트·인증 방식 무조건 암호만 문제인 것은 아님
Unknown database 서버와 DB 이름 테이블 오류와 구분
TLS 검증 오류 호스트 이름·CA·인증서 검증 해제를 기본 해결책으로 삼지 않음

로컬 TCP 경로를 명시해 재현하기

클라이언트와 서버가 같은 PC에 있고 서버가 3306에서 실행 중이라는 전제입니다. 실제 포트가 다르면 해당 값으로 바꿉니다. --password 뒤에 암호를 적지 않고 프롬프트로 입력합니다.

mariadb --protocol=tcp --host=127.0.0.1 --port=3306 --user=course_user --password --default-character-set=utf8mb4 shopcourse
SELECT VERSION(),@@hostname,@@port,DATABASE();
SELECT USER(),CURRENT_USER();
SHOW GRANTS;

버전·호스트·포트가 예상 서버인지, DATABASE()가 shopcourse인지, CURRENT_USER()가 의도한 권한 계정인지 확인합니다. localhost는 환경에 따라 소켓·이름 있는 파이프·TCP가 달라질 수 있으므로 이 예제는 --protocol=tcp와 127.0.0.1로 경로를 고정합니다. 명령줄 클라이언트의 연결 옵션을 참고하세요.

정상 조회로 연결과 데이터 권한 구분하기

학습용 MariaDB 서버의 shopcourse에 course_user로 접속합니다. 명령줄 클라이언트와 UTF-8 SQL 파일 실행 방법대로 코드를 UTF-8 파일에 저장하고 SOURCE C:/mariadb-lab/lesson.sql;처럼 실제 파일 경로로 실행할 수 있습니다. SQL 문은 운영체제 터미널이 아닌 MariaDB 연결 안에서 실행합니다.

먼저 SELECT VERSION(), DATABASE();와 SHOW TABLES;로 대상 서버·DB·이름 중복을 확인합니다. 아래 products_44_lab는 이 글의 독립된 연습용 이름입니다. 이미 존재하면 정의와 행을 확인하고, 보관할 자료가 없는 이 글의 실습 테이블임이 확실할 때만 마지막 절의 정리 순서로 지운 뒤 다시 만듭니다. 기존 강좌의 동명 없는 테이블이나 운영 데이터는 삭제하지 않습니다.

USE shopcourse;
CREATE TABLE products_44_lab (
  product_id INT NOT NULL AUTO_INCREMENT,
  product_name VARCHAR(100) NOT NULL,
  category VARCHAR(30) NOT NULL,
  price DECIMAL(10,2) NOT NULL,
  stock INT NOT NULL DEFAULT 0,
  note VARCHAR(100) NULL DEFAULT NULL,
  PRIMARY KEY (product_id),
  CONSTRAINT ck_p44_price CHECK (price >= 0),
  CONSTRAINT ck_p44_stock CHECK (stock >= 0)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO products_44_lab (product_id,product_name,category,price,stock,note) VALUES (1, '노트', '문구', 3500.00, 20, NULL),
  (2, '볼펜', '문구', 1500.00, 0, ''),
  (3, '머그컵', '생활', 8000.00, 12, '선물 포장'),
  (4, '스탠드', '생활', 25000.00, 5, NULL),
  (5, '파일', '문구', 1500.00, 50, ''),
  (6, '케이블', '전자', 8000.00, 0, '호환 확인');
SELECT COUNT(*) FROM products_44_lab;

결과는 6입니다. SELECT 1이 성공했다고 모든 DB·테이블에 접근할 수 있는 것은 아닙니다. 실제 사용할 DB와 테이블에서 허용 작업을 확인합니다. 연결 암호를 로그·스크린샷·공개 원고에 넣지 않고 오류 코드와 비밀값을 제거한 메시지를 기록합니다.

원격 접속은 필요한 수신 주소와 출발지만 허용하기

먼저 원격 서버의 관리자에게 사용할 사설 주소·포트·허용할 클라이언트 주소·TLS 정책을 확인합니다. Ubuntu 패키지 환경에서는 /etc/mysql/mariadb.conf.d/50-server.cnf 같은 실제 설정 파일의 [mariadbd] 또는 [mysqld] 구역을 확인할 수 있지만, 파일 위치는 설치 방식에 따라 다릅니다. 변경 전 설정을 백업하고 적용 파일이 맞는지 확인합니다.

[mariadbd]
bind-address = 10.0.0.10
port = 3306

10.0.0.10은 설명용 사설 주소이므로 실제 서버에 존재하는 주소로 바꿉니다. 해당 주소에서 수신하도록 설정하고 정책에 맞는 방화벽에서 특정 클라이언트 출발지만 허용합니다. 서버 재시작은 연결 중단을 동반할 수 있으므로 영향과 복구 경로를 확인한 뒤 수행합니다. 계정도 정확한 클라이언트 호스트 조건으로 별도 구성해야 합니다. MariaDB 원격 접속 구성 안내를 확인하세요.

원격 TCP에서 인증서와 계정 매칭 확인하기

아래 명령은 이름이 해석되는 실제 서버와 신뢰할 CA 파일이 준비된 경우의 예입니다. db.example.internal과 파일 경로를 실제 값으로 바꾸며, 이름이 인증서와 일치해야 합니다. 로컬 실습 서버의 성공을 원격 네트워크·TLS 검증까지 완료한 것으로 해석하지 않습니다.

mariadb --protocol=tcp --host=db.example.internal --port=3306 --user=app_user --password --ssl --ssl-verify-server-cert --ssl-ca=C:/mariadb-lab/ca.pem

허용된 SSH 터널이나 VPN을 사용할 수도 있지만, 터널을 통과한 서버 측 출발지와 MariaDB 계정의 Host 매칭은 실제 경로로 확인해야 합니다. 0.0.0.0 수신·모든 주소 허용·인증서 검증 해제를 연결 오류의 관례적인 해결책으로 사용하지 않습니다.

오류를 재현하고 원상복구할 항목 기록하기

서버까지 도달하지 못하면 클라이언트 주소·DNS·수신 포트·방화벽을, 도달 후 Access denied면 실제 계정·Host·플러그인·암호를 점검합니다. Unknown database나 테이블 권한 오류는 접속 이후의 별도 단계입니다. 설정을 바꿨다면 변경 항목과 원래 값, 재시작 여부를 기록하고 원래 파일·정책으로 되돌리는 방법을 확인합니다.

반복하기 전 현재 DB와 실제 정의·행을 확인하고 필요한 자료를 백업합니다. 보관할 데이터가 없는 이 글의 전용 실습 객체만 아래 순서로 정리합니다. 외래키가 있으면 자식부터 지웁니다. DROP TABLE은 구조와 데이터를 모두 없애며 일반적인 ROLLBACK으로 복원되지 않으므로 취소 가능한 DML 실습과 분리합니다.

DROP TABLE shopcourse.products_44_lab;
같은 카테고리의 다른 글
MariaDB / 연산자 / 논리 연산자

MariaDB / 연산자 / 논리 연산자

MariaDB의 논리 연산자에 대하여 알아보겠습니다. 예제로 사용하는 테이블은 아래의 데이터를 가진 T_2이라는 테이블입니다. 각 열의 데이터 형식은 다음과 같습니다. C_1 : 정수 C_2 : 문자 +----+------+------+ | ID | C_1 | C_2 | +----+------+------+ | 1 | 1 | A | | 2 | ...

MariaDB 강좌 / CASE로 조건별 값과 집계 만들기

MariaDB 강좌 / CASE로 조건별 값과 집계 만들기

CASE 조건의 순서와 ELSE를 상품 재고 상태로 실습합니다. SUM·COUNT 안의 조건부 집계, 0과 NULL의 차이, WHERE로 그룹을 없애는 경우와 0을 표시하는 경우를 설명합니다.

MariaDB 강좌 / 사용자 계정 만들고 필요한 권한만 부여하기

MariaDB 강좌 / 사용자 계정 만들고 필요한 권한만 부여하기

사용자·호스트 조합을 확인하고 상품 한 테이블의 SELECT만 허용하는 계정을 만듭니다. 새 연결의 허용·거절 시험, 권한 회수와 기존 계정을 덮어쓰지 않는 정리 절차를 설명합니다.

MariaDB 강좌 / 윈도 함수로 순번과 순위 계산하기

MariaDB 강좌 / 윈도 함수로 순번과 순위 계산하기

고객별 금액의 ROW_NUMBER·RANK·DENSE_RANK를 비교하고 지역별 순위와 바깥 조회의 상위 N개 필터를 실습합니다. 공동 순위와 행 개수 제한의 차이를 결과로 확인합니다.

MariaDB 강좌 / WHERE로 조건 지정하기: 비교·AND·OR·IN·BETWEEN·LIKE

MariaDB 강좌 / WHERE로 조건 지정하기: 비교·AND·OR·IN·BETWEEN·LIKE

상품 가격·분류·재고·이름으로 WHERE 조건을 실습합니다. AND·OR 괄호 차이, IN 목록, BETWEEN 경계, LIKE 와일드카드와 실제 퍼센트 검색을 예상 행 번호로 확인합니다.

MariaDB 강좌 / CSV 가져오기·내보내기: 경로·권한·문자 인코딩

MariaDB 강좌 / CSV 가져오기·내보내기: 경로·권한·문자 인코딩

CSV를 문자형 stage에 적재해 형식·중복·경고를 확인한 뒤 실제 타입으로 옮깁니다. LOCAL의 클라이언트 경로, 서버 OUTFILE의 권한·경로, 쉼표·한글·줄바꿈과 왕복 검증을 설명합니다.

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

MariaDB 강좌 / SELECT로 열 선택하기: 별칭·계산식·DISTINCT

SELECT의 열 선택과 AS 별칭, 행별 계산식, DISTINCT의 열 조합 기준을 실습합니다. 원본 데이터와 출력 결과를 구분하고 WHERE에서 별칭을 사용할 때의 주의점을 설명합니다.

MariaDB 강좌 / 재귀 CTE로 계층 데이터 조회하고 순환 막기

MariaDB 강좌 / 재귀 CTE로 계층 데이터 조회하고 순환 막기

부모·자식 분류 데이터로 재귀 CTE의 앵커, 재귀 단계, 깊이와 경로를 실습합니다. 종료 조건 변경과 순환 데이터 테스트를 통해 잘린 결과와 무한 반복 위험을 구분합니다.

MariaDB 강좌 / 최종 실습: 주문 데이터베이스 구축부터 권한·백업·복원까지

MariaDB 강좌 / 최종 실습: 주문 데이터베이스 구축부터 권한·백업·복원까지

주문 DB 구축·제한 계정·재고와 주문의 트랜잭션을 한 흐름으로 실습합니다. 확정 상태를 덤프해 별도 DB로 복원하고 행·금액·재고·키·권한 실패 조건으로 완성 여부를 검증합니다.

MariaDB 강좌 / INSERT로 한 행과 여러 행 추가하기

MariaDB 강좌 / INSERT로 한 행과 여러 행 추가하기

INSERT의 열·값 대응, 한 행과 다중 행 입력, 자동 번호와 기본값을 상품 데이터로 실습합니다. 저장 결과와 오류 뒤 행 수를 확인하고 기존 데이터와 분리해 반복하는 방법을 설명합니다.