DB 포트 변경

기본 DB 포트가 아닌, 다른 포트로 변경하는게 보안상 더 안전하다.

(포트 변경 후, 외부에서 포트로 접속 하려면 해당 포트 방화벽에서 열어주어야 함)

 

1. 서버 접속 후 db 설정파일 열기

vi /etc/my.cnf.d/server.cnf

 

2. 다음 설정 파일에서 [mysql] 섹션 바로 아래에 port 변경

[mysqld]

port=바꿀 포트 번호

 

3. 포트번호 변경 후 저장하고 mariadb 재기동

systemctl restart mariadb

 

4. mariadb 실행중 포트 확인

netstat -tnlp

 

DB 루트 패스워드 변경

기본 루트 패스워드 쓰지 말고, 복잡한 패스워드로 바꾼다.

 

1. DB 접속

mysql -u root -p

 

2. 패스워드 업데이트

SET PASSWORD FOR 'root'@'localhost' = PASSWORD('new_secure_password');

 

3. 권한 flush

FLUSH PRIVILEGES;

 

4. 패스워드 포맷 확인

USE mysql; SELECT Host, User, Password FROM user WHERE User = 'root';

 

사용자 계정 생성 & 권한 설정

root계정은 외부 접속 못하게 한다. 사용자 계정도 가급적 내부 접속만 허용하게 한다.

 

1. 사용자 생성

# create user '계정'@'접속위치' identified by '패스워드';

ex) create user 'test'@'127.0.0.1' identified by 'Password'; -- 내부접속만 허용

ex) create user 'test2'@'%' identified by 'Password'; -- 외부접속 허용

 

2. 권한 주기

전체 권한 부여 (접속 위치에 %는 쓰지 말도록 하자. 가급적 localhost만 쓰거나, ip를 특정하는 것이 좋다.)

grant all privileges on DB이름.테이블 to '계정'@'접속위치';

ex) grant all privileges on testDB.* to 'test2'@'%';

ex) grant all privileges on testDB.* to 'test2'@'localhost';

 

usage (삭제하면 로그인조차 안됨) 권한 부여, 삭제

usage 권한 부여

mysql> GRANT USAGE ON *.* TO USER_NAME@HOST IDENTIFIED BY 'USER_NAME';

 

usage 권한 삭제

mysql> REVOKE USAGE ON *.* FROM USER_NAME@HOST;

 

3. 권한 적용

flush privileges;

 

4. 권한 확인

show grants for '계정'@'접속위치';

 

외부접속 허용제거

가급적 모든 아이디의 외부 접속을 막고, 꼭 필요하다면 아이피를 특정하여 외부 접속을 허용한다.

 

% 모든아이피 허용제거
mysql> DELETE FROM mysql.user WHERE Host=’%’ AND User=’아이디’;

 

특정ip허용 제거
mysql> DELETE FROM mysql.user WHERE Host=’111.111.111.111′ AND User=’아이디’;

 

설정적용
mysql> FLUSH privileges;

 

사용자 확인

select host, user, password from mysql.user;

 

DB 백업/복구, 자동백업(crontab)

해킹을 대비하여, 매일 DB 백업을 하도록 설정한다.

- crontab에 db 백업 스크립트 등록하여, 자동으로 백업하도록 설정

- 백업 파일이 쌓이면 디스크 full 날 수 있으므로, 특정 주기로 예전 백업은 삭제하도록 설정

https://foxydog.tistory.com/94

 

 

 

 

참고

https://tipland.tistory.com/47 

https://da-new.tistory.com/237

https://blog.servis.co.kr/index.php/2019/06/28/mysql-not-allowed-to-connect/

https://grmn.tistory.com/7

 

 

데이터베이스에 접속하려고 하는데, root 패스워드를 잊어버렸을 경우가 있다.

이런 경우 패스워드를 리셋하는 방법이다. (MariaDB 기준)

 

1. MariaDB서비스 중지

sudo systemctl stop mariadb

 

2. MariaDB를 --skip-grant-tables 옵션을 주어 실행함 (MariaDB service unit file을 수정하여 실행)

- 아래 명령을 실행하면, MariaDB service unit file 이 텍스트 에디터로 열림

sudo systemctl edit --full mariadb

- 해당 파일에서 ExecStart 부분을 찾아 아래와 같이 --skip-grant-tables 옵션을 추가함

ExecStart=/usr/sbin/mysqld --skip-grant-tables $MYSQLD_OPTS

- 파일을 저장하고 텍스트 에디터를 종료함

 

3. MariaDB를 수정된 unit file을 이용하여 실행함

sudo systemctl start mariadb

 

4. 이제 권한체크 없이 어드민 태스크를 실행할 수 있게 됨. 아래와 같이 패스워드 없이 DB 접속 가능해짐

mysql -u root

 

5. MariaDB 서버에 접속하면, 'mysql' 데이터베이스로 스위치함

use mysql;

 

6. root 패스워드를 새로운 패스워드로 설정함

update user set authentication_string=password('new_password') where user='root';

 

7. flush privileges를 하여 변경 사항을 반영시킴

flush privileges;

 

8. MariaDB 서버 접속을 종료함

exit;

 

9. MariaDB 서비스를 중지

sudo systemctl stop mariadb

 

10. MariaDB service unit file 에서, --skip-grant-tables 옵션을 삭제함

- 아래 명령을 실행하면, MariaDB service unit file 이 텍스트 에디터로 열림

sudo systemctl edit --full mariadb

- 해당 파일에서 ExecStart 부분을 찾아, 추가했던 --skip-grant-tables 옵션 삭제함

ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS

- 파일을 저장하고 텍스트 에디터를 종료함

 

11. MariaDB를 재실행함

sudo systemctl start mariadb

 

12. 이제 변경된 패스워드로 root 계정 접속이 가능하다.

mysql -u root -p

MariaDB 기본 Charset 확인하기

MariaDB [(none)]> show variables like 'c%';
+----------------------------------+----------------------------+
| Variable_name                    | Value                      |
+----------------------------------+----------------------------+
| character_set_client             | utf8mb4                    |
| character_set_connection         | utf8mb4                    |
| character_set_database           | utf8mb4                    |
| character_set_filesystem         | binary                     |
| character_set_results            | utf8mb4                    |
| character_set_server             | utf8mb4                    |
| character_set_system             | utf8mb3                    |
| character_sets_dir               | /usr/share/mysql/charsets/ |
| check_constraint_checks          | ON                         |
| collation_connection             | utf8mb4_general_ci         |
| collation_database               | utf8mb4_general_ci         |
| collation_server                 | utf8mb4_general_ci         |
| column_compression_threshold     | 100                        |
| column_compression_zlib_level    | 6                          |
| column_compression_zlib_strategy | DEFAULT_STRATEGY           |
| column_compression_zlib_wrap     | OFF                        |
| completion_type                  | NO_CHAIN                   |
| concurrent_insert                | AUTO                       |
| connect_timeout                  | 10                         |
| core_file                        | OFF                        |
+----------------------------------+----------------------------+

 

 

데이터베이스의 인코딩 확인하기

MariaDB [(none)]> SELECT default_character_set_name, DEFAULT_COLLATION_NAME FROM information_schema.SCHEMATA WHERE schema_name = "wordpress";
+----------------------------+------------------------+
| default_character_set_name | DEFAULT_COLLATION_NAME |
+----------------------------+------------------------+
| utf8mb4                    | utf8mb4_general_ci     |
+----------------------------+------------------------+

 

테이블의 인코딩 확인하기

결과 중에 Collation 컬럼 확인해보면 된다.

MariaDB [wordpress]> SHOW FULL COLUMNS FROM wp_posts;
+-----------------------+---------------------+--------------------+------+-----+---------------------+----------------+---------------------------------+---------+
| Field                 | Type                | Collation          | Null | Key | Default             | Extra          | Privileges                      | Comment |
+-----------------------+---------------------+--------------------+------+-----+---------------------+----------------+---------------------------------+---------+
| ID                    | bigint(20) unsigned | NULL               | NO   | PRI | NULL                | auto_increment | select,insert,update,references |         |
| post_author           | bigint(20) unsigned | NULL               | NO   | MUL | 0                   |                | select,insert,update,references |         |
| post_date             | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_date_gmt         | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_content          | longtext            | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_title            | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_excerpt          | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_status           | varchar(20)         | utf8mb4_unicode_ci | NO   |     | publish             |                | select,insert,update,references |         |
| comment_status        | varchar(20)         | utf8mb4_unicode_ci | NO   |     | open                |                | select,insert,update,references |         |
| ping_status           | varchar(20)         | utf8mb4_unicode_ci | NO   |     | open                |                | select,insert,update,references |         |
| post_password         | varchar(255)        | utf8mb4_unicode_ci | NO   |     |                     |                | select,insert,update,references |         |
| post_name             | varchar(200)        | utf8mb4_unicode_ci | NO   | MUL |                     |                | select,insert,update,references |         |
| to_ping               | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| pinged                | text                | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_modified         | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_modified_gmt     | datetime            | NULL               | NO   |     | 0000-00-00 00:00:00 |                | select,insert,update,references |         |
| post_content_filtered | longtext            | utf8mb4_unicode_ci | NO   |     | NULL                |                | select,insert,update,references |         |
| post_parent           | bigint(20) unsigned | NULL               | NO   | MUL | 0                   |                | select,insert,update,references |         |
| guid                  | varchar(255)        | utf8mb4_unicode_ci | NO   |     |                     |                | select,insert,update,references |         |
| menu_order            | int(11)             | NULL               | NO   |     | 0                   |                | select,insert,update,references |         |
| post_type             | varchar(20)         | utf8mb4_unicode_ci | NO   | MUL | post                |                | select,insert,update,references |         |
| post_mime_type        | varchar(100)        | utf8mb4_unicode_ci | NO   |     |                     |                | select,insert,update,references |         |
| comment_count         | bigint(20)          | NULL               | NO   |     | 0                   |                | select,insert,update,references |         |
+-----------------------+---------------------+--------------------+------+-----+---------------------+----------------+---------------------------------+---------+

utf8과 utf8mb4의 차이

UTF-8 and UTFMB4 are character sets used in MySQL to store text data.

UTF-8 is a character encoding that can represent a wide range of characters and symbols, including most of the characters used in the world's written languages. UTF-8 is a variable-width encoding, which means that characters can take up anywhere from 1 to 4 bytes of storage space in a database.

UTFMB4 is an extension of UTF-8 that can store a wider range of characters, including emoji and other special symbols. UTFMB4 uses a maximum of 4 bytes to encode characters, which makes it more memory-intensive than UTF-8.

In general, if you need to store text data that includes a limited range of characters, UTF-8 is a good choice. However, if you need to store a wider range of characters, including emoji and special symbols, UTFMB4 is the better choice. It's important to note that using UTFMB4 requires a more powerful database setup and can lead to increased memory usage, so it may not be appropriate for all applications.

 

utf8bm4_general_ci  와 utf7mb4_unicode_ci의 차이

UTF8MB4_GENERAL_CI and UTF8MB4_UNICODE_CI are collation types for UTF8MB4 character sets in MySQL.

A collation determines how text data is compared and sorted in a database. The collation type you choose affects how text data is treated in comparison operations, such as equal to (==), not equal to (!=), greater than (>), and less than (<).

UTF8MB4_GENERAL_CI is a case-insensitive collation that sorts text data in a way that is suitable for most applications. It only considers the basic letter and number characters and ignores special characters and symbols.

UTF8MB4_UNICODE_CI, on the other hand, is a case-insensitive collation that takes into account the full range of Unicode characters, including special symbols and emoji. This collation type is more suitable for applications that need to handle a wide range of characters, such as multilingual websites.

In general, UTF8MB4_GENERAL_CI is faster and uses less memory than UTF8MB4_UNICODE_CI, but it provides less accurate comparison results for special characters and symbols. UTF8MB4_UNICODE_CI provides more accurate comparison results, but is slower and uses more memory.

The choice between UTF8MB4_GENERAL_CI and UTF8MB4_UNICODE_CI depends on the specific needs of your application and the text data that you need to store in your database.

SQLite는 경량 데이터베이스이다.

따라서 데이터베이스의 한계는 어디까지인지를 파악 해볼 필요성을 느끼게 된다.

테이블 설계 시 고려해야 하기 때문. 그런데 알아 보니 소규모 어플리케이션에서는 제한 모르고 써도 무방하다 싶기도 하다..

 

1. string이나 BLOB의 최대 길이

SQLITE_MAX_LENGTH

  • 기본값 = 1 billion (1,000,000,000)
  • 최대값 = 2147483647

기본값은 설정으로 낮추거나, 높일 수 있다.

(컴파일 시, 커맨드 라인 옵션으로 -DSQLITE_MAX_LENGTH=123456789 주면 변경 가능하다 함)

 

2. 최대 컬럼 개수 

SQLITE_MAX_COLUMN 

  • 기본값 = 2000
  • 최대값 = 32767

컴파일 타임에 SQLITE_MAX_COLUMN 설정을 바꿀 수 있다.

 

3. 최대 SQL Statement 길이

SQLITE_MAX_SQL_LENGTH 

  • 기본값 = 1,000,000,000

4. Join 가능한 최대 테이블 개수

  • 최대값 = 64개 테이블

5. Expression Tree의 최대 깊이(Depth)

SQLITE_MAX_EXPR_DEPTH 

  • 기본값 = 1000

(값이 0이면, 제한 없음)

 

6. 함수의 최대 인자 수

SQLITE_MAX_FUNCTION_ARG 

  • 기본값 = 100
  • 최대값 = 127

7. Compound SELECT Statement에서 최대 Term 수

SQLITE_MAX_COMPOUND_SELECT

Compound SELECT Statement 란, 두개 이상의 SELECT 문이 UNION, UNION ALL, EXCEPT, or INTERSECT로 연결된 것을 말한다.

여기서 각각의 SELECT 문을 Term이라고 부른다(SQLite의 용어).

  • 기본값 = 500

8. LIKE나 GLOB 패턴의 최대 길이

SQLITE_MAX_LIKE_PATTERN_LENGTH

  • 기본값 = 50000

9. 단일 SQL문에서 Host Parameter의 최대 개수

SQLITE_MAX_VARIABLE_NUMBER

Host Parameter란, SQL문에서의 기호 (보통 ? 을 사용한다)를 말한다.

  • 기본값 = 999 (3.32.0 버전, 2020-5-22)
  • 기본값 = 32766 (3.32.0 이후 버전)

10.  Maximum Depth Of Trigger Recursion

  • 기본값 = 1000 (3.7.0 버전 부터, 2009-09-11)

그 이전 버전은 trigger가 재귀적이지 않아 의미 없다 함

 

11. Maximum Number Of Attached Databases

SQLITE_MAX_ATTACHED 

하나의 커넥션에 연결되 수 있는 최대 데이터베이스의 개수

  • 기본값 = 10
  • 최대값 = 125

12. 데이터베이스 파일에서 최대 Page 수

SQLITE_MAX_PAGE_COUNT 

  • 기본값 = 1073741823
  • 최대값 = 4294967294

13. 테이블의 최대 행 수

  • 이론상 최대값 = 2의 64승 (18446744073709551616 or about 1.8e+19)

14. 최대 데이터베이스 사이즈

  • 최대값 = 281 terabytes

(최대 페이지 수가 4294967294 이고, 각 페이지의 최대 크기가 65536 bytes 라고 했을 경우)

 

15. Schema의 최대 테이블 개수

  • 최대값 = 2147483646

 

참고 : https://www.sqlite.org/limits.html

성능 벤치마킹 : https://softint.eu/choosing-sqlite-as-a-database-3-3/

1. 문제 상황

mysql 이 자꾸 죽는다거나, 시작이 안되는 경우가 있다.

 

2. 원인 파악

로그파일을 분석했을 때, 아래와 같은 메시지가 있다면 메모리가 부족해서 실행을 못하는 것이다.

InnoDB 버퍼 풀 사이즈가 128M (디폴트 값)로 설정되어 있는데, 이를 수용할 만한 메모리가 부족해서 할당 못하고 fail된 것.

(물리적인 메모리 사이즈 자체가 작거나, 다른 프로그램들이 많이 돌아가고 있어 여유 메모리가 부족하거나, 이유는 다양할 수 있다.)

InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137756672 bytes) failed; errno 12
InnoDB: Completed initialization of buffer pool
InnoDB: Fatal error: cannot allocate memory for the buffer pool
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[Note] Plugin 'FEEDBACK' is disabled.
[ERROR] Unknown/unsupported storage engine: InnoDB
[ERROR] Aborting

3. 해결책

my.cnf 파일에 innodb_buffer_pool_size 를 낮춘 설정을 추가해 주면 된다. (아래 설정 추가)

64M도 메모리 부족으로 실행 안된다면, 32M, 16M.. 사이즈를 더 낮춰서 저장 후 mysql을 실행해보면 된다.

(메모리가 작아지면 DB 성능이 낮아질 우려는 있다.)

innodb_buffer_pool_size=64M

또는, 사용되지 않는 다른 프로그램이나 데몬들을 종료하거나, 물리적 메모리를 추가해주는 등 전체 메모리를 늘려주는 것도 방법이다.

'DB' 카테고리의 다른 글

[DB] MariaDB 보안 설정  (0) 2024.09.27
[MariaDB] root 패스워드 리셋 방법  (0) 2023.07.19
[DB] MariaDB 인코딩  (0) 2023.02.10
[SQLite] SQLite DB 한계  (0) 2022.04.03
데이터베이스(DB) vs. 데이터베이스 관리 시스템(DBMS)  (0) 2021.12.20

데이터베이스(DB; Database) 란?

여러 응용시스템들의 통합된 정보들을 저장하여 공유하고 운영할 수 있는 데이터의 집합체

특징

  • 통합성(Integrated Data) : 중복의 최소화 통합 데이터
  • 저장성(Stored Data) : 접근 가능한 형태의 시스템에 저장
  • 공유성(Shared Data) : 데이터의 여러 시스템 간 공유 가능
  • 운영성(Operational Data) : 조직 시스템의 기능 수행

데이터베이스 시스템(DBS; Database System) 이란?

데이터베이스를 관리하여 필요한 정보를 활용할 수 있도록 자동화한 시스템을 의미한다.
데이터베이스 시스템은 데이터베이스(DB), 데이터베이스 관리 시스템(DBMS), 사람과 시스템 간의 인터페이스를 제공하는 언어, 데이터를 사용하고 관리하는 사용자 및 관리자, 물리적인 하드웨어를 포함하는 개념이다.

데이터베이스 관리 시스템(DBMS; Database Management System) 이란?

응용프로그램과 데이터베이스의 중재자 역할을 통해, 응용 프로그램이 데이터를 공유할 수 있도록 데이터베이스를 관리해 주는 소프트웨어이다.

1. 데이터베이스 언어

데이터베이스 관리 시스템은 데이터베이스에 접근하여 원하는 정보를 얻고자 할 경우, 데이터 정의 언어(DDL), 데이터 조작 언어(DML), 데이터 제어 언어(DCL)을 통해서 처리한다.

1) 데이터 정의 언어(DDL; Data Definition Language)

DDL은 데이터베이스를 정의하거나 변경의 목적으로 사용된다. Create, Drop, Alter 등의 명령어가 있으며, 주로 DBA가 사용한다.

2) 데이터 조작 언어(DML; Data Manipulation Language)

DML은 사용자가 생성된 데이터베이스의 정보를 검색·삽입·삭제·수정 등의 처리를 수행할 목적으로 사용되며, 사용자와 데이터베이스의 인터페이스를 제공한다.

Select, Update, Delete, Insert 등의 명령어를 통해 데이터를 조작할 수 있는 언어이다.

3) 데이터 제어 언어(DCL; Data Control Language)

DCL은 데이터베이스를 제어관리하기 위한 목적으로 사용된다. 허가받지 않은 사용자로부터 데이터를 보호하기 위한 보안, 데이터 무결성, 시스템 장애 식 회복, 동시 접근 시 병행정 제어를 위한 명령어로 Grant, Revoke, Commit, Rollback, Set등이 있으며, 주로 DBA가 사용하는 언어이다.

2. 사용자

데이터베이스 시스템을 이용하는 사용자에는 일반 사용자(end user), 응용 프로그래머, 데이터베이스 관리자(DBA; Database Administrator)등이 있다.

1) 데이터베이스 관리자(DBA; DataBase Administrator)란?

데이터베이스의 원활한 기능을 수행하기 위해 데이터베이스 구성 및 관리운영 전반에 대한 책임을 지고 직무를 수행하는 사람을 말한다. DBA는 데이터베이스 설계 및 구축, 데이터베이스 운영관리, 데이터베이스 튜닝을 수행한다.

 

출처 : 데이터베이스 시스템 (장경애 저)

'DB' 카테고리의 다른 글

[DB] MariaDB 보안 설정  (0) 2024.09.27
[MariaDB] root 패스워드 리셋 방법  (0) 2023.07.19
[DB] MariaDB 인코딩  (0) 2023.02.10
[SQLite] SQLite DB 한계  (0) 2022.04.03
[InnoDB] cannot allocate memory for the buffer pool 에러  (0) 2022.03.22

+ Recent posts