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 강좌 / LEFT JOIN으로 연결되지 않은 행도 조회하기

MariaDB 강좌 / LEFT JOIN으로 연결되지 않은 행도 조회하기

LEFT JOIN으로 주문 없는 고객을 유지하고 paid 주문 수를 0까지 표시합니다. ON·WHERE의 필터 위치, COUNT(*)의 함정, NULL 기본키로 미일치 행을 찾는 기준을 실습합니다.

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

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

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

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

MariaDB 강좌 / NULL을 올바르게 비교하기: IS NULL·COALESCE

NULL·빈 문자열·0을 구분하고 IS NULL·IS NOT NULL과 COALESCE의 역할을 실습합니다. 일반 비교에서 빠지는 NULL 행, NULL-safe 비교와 NOT IN 목록의 함정을 설명합니다.

MariaDB / VIEW

MariaDB / VIEW

VIEW는 가상의 테이블입니다. 실제로 데이터를 저장하지 않고, 기존의 하나 이상의 테이블을 기반으로 한 쿼리 결과를 테이블처럼 사용할 수 있게 해줍니다. 뷰는 복잡한 쿼리를 단순화하고, 보안 및 데이터 관리에 유용하게 사용됩니다.

MariaDB 강좌 / 인덱스 만들기: 단일·복합 인덱스와 열 순서

MariaDB 강좌 / 인덱스 만들기: 단일·복합 인덱스와 열 순서

기존 키를 조회한 뒤 고객·날짜 복합 인덱스를 만들고 같은 조회 결과를 확인합니다. 열 순서·범위·커버링, 쓰기 비용·중복 키·외래키 지원 인덱스의 주의점을 설명합니다.

MariaDB 강좌 / 기본키·AUTO_INCREMENT·UNIQUE로 행 식별하기

MariaDB 강좌 / 기본키·AUTO_INCREMENT·UNIQUE로 행 식별하기

기본키·자동 증가·고유 제약을 고객 데이터로 구분하고 중복 입력을 확인합니다. nullable UNIQUE, 복합 기본키와 트랜잭션 취소 후 자동 번호가 빠지는 경우를 실습합니다.

MariaDB 강좌 / CREATE TABLE로 테이블 구조 정의하기

MariaDB 강좌 / CREATE TABLE로 테이블 구조 정의하기

상품 테이블을 예로 열·타입·기본값·기본키·저장 엔진을 정의하고 실제 생성 결과를 확인합니다. 기존 테이블 처리, IF NOT EXISTS의 한계와 안전한 반복 실습 방법도 설명합니다.

MariaDB 강좌 / mariadb-dump로 데이터베이스 백업하기

MariaDB 강좌 / mariadb-dump로 데이터베이스 백업하기

별도 주문 실습 DB를 준비해 mariadb-dump로 새 SQL 백업 파일을 만듭니다. 종료 코드·해시·문자 인코딩, InnoDB 스냅샷과 동시 DDL의 한계, 객체·권한·별도 복원 검증 기준을 설명합니다.

MariaDB 강좌 / Docker로 MariaDB 실습 환경 만들기

MariaDB 강좌 / Docker로 MariaDB 실습 환경 만들기

Compose 파일로 MariaDB 포트·암호 파일·데이터 볼륨·헬스체크를 구성합니다. 연결 확인과 컨테이너 교체 실습을 통해 데이터 유지, 초기화와 접속 오류의 차이를 이해합니다.

MariaDB 강좌 / 명령줄 클라이언트로 접속하고 SQL 파일 실행하기

MariaDB 강좌 / 명령줄 클라이언트로 접속하고 SQL 파일 실행하기

터미널 명령과 SQL 입력 위치를 구분하고 학습 계정으로 접속합니다. UTF-8 SQL 파일의 SOURCE 실행, 예상 결과, 오류 중단·한글 표시·경로 문제를 함께 확인합니다.