반응형

라이브 서버의 백업 데이터 파일을 테스트 서버로 이동후 테스트 서버를 구축 하고자함.

replicement로 5.5->10.2 로 업그레이드를 하는 작업중 mysql을 시작할때 mysqld에 다음과 같은 warning이 보인다

[Warning] 'proxies_priv' entry '@% root@master8-M' ignored in --skip-name-resolve mode.

 

select Host, User from mysql.proxies_priv;

Host User
localhost root
master8-M root

 

master8-M 이라는 것은 기존 서버의 호스트명이다.

이부분을 삭제해 주었더니 경고문이 사라졌다.

 

delete from mysql.proxies_priv where Host = 'master8-M';

 

반응형
반응형

mariaDB 10.2.44 에서 블랙홀 엔진을 default를 하고자 cnf 파일에 다음과 같이 넣어주었다.

default-storage-engine=BALCKHOLE

 

그러나 mysqld.err 에서 다음과 같은 에러를 만났다면

[ERROR] Unknown/unsupported storage engine: BLACKHOLE

 

cnf파일에 아래 내용을 추가해주자.

plugin_load_add = ha_blackhole

 

https://mariadb.com/kb/en/blackhole/

 

BLACKHOLE

Storage engine that accepts data without storing it.

mariadb.com

 

반응형

'MySQL' 카테고리의 다른 글

proxies_priv entry  (0) 2023.11.06
check table & repair table  (0) 2023.09.14
ERROR 1201  (0) 2023.09.01
[iptables] 2003, error connecting to master 'replicator@'  (0) 2023.08.24
컬럼명을 명령어 또는 공통변수(?)로 사용하게 된다면  (0) 2023.04.17
반응형

mysql> check table mysql.proxies_priv;
+--------------------+-------+----------+-------------------------------------------------------------------------------------------+
| Table              | Op    | Msg_type | Msg_text                                                                                  |
+--------------------+-------+----------+-------------------------------------------------------------------------------------------+
| mysql.proxies_priv | check | error    | Table upgrade required. Please do "REPAIR TABLE `proxies_priv`" or dump/reload to fix it! |
+--------------------+-------+----------+-------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> repair table mysql.proxies_priv;
+--------------------+--------+----------+-------------------------------------------------------------------------------------+
| Table              | Op     | Msg_type | Msg_text                                                                            |
+--------------------+--------+----------+-------------------------------------------------------------------------------------+
| mysql.proxies_priv | repair | Note     | TIME/TIMESTAMP/DATETIME columns of old format have been upgraded to the new format. |
| mysql.proxies_priv | repair | status   | OK                                                                                  |
+--------------------+--------+----------+-------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> check table mysql.proxies_priv;
+--------------------+-------+----------+----------+
| Table              | Op    | Msg_type | Msg_text |
+--------------------+-------+----------+----------+
| mysql.proxies_priv | check | status   | OK       |
+--------------------+-------+----------+----------+
1 row in set (0.00 sec)

반응형
반응형

mysql 5.5 를 사용하고 있는 DB에서

replication 연결된 slave(replica) 서버를 5.6 으로 올렸다.

 

다시 5.5를 실행시켜서 슬레이브로 연결하려면 연결이 되는지 의문이 생겨서 시도를 해보았다.

결과는 에러가 발생하였다.

mysql> start slave;
ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log

 

반응형
반응형

replication연결 중 아래와 같은 에러가 발생하였다.
해당에러는 패스워드가 다르다거나 연결에 있어서 다양한 문제가 생겼을 경우 나오는 에러이다.

Last_IO_Errno: 2003
Last_IO_Error: error connecting to master 'replicator@100.10.12.15:3306' - retry-time: 10  retries: 86400


그중 하나가 소스(마스터)에서 3306 포트를 열어주지 않아서 생겼던 문제로 보인다.

telnet ip 3306

연결이 되지 않는다고 나온다면 소스(마스터)의 방화벽에서 해당 포트를 열어주자.

방화벽 포트 추가

iptables -I INPUT -p tcp --dport 3306 -j ACCEPT





반응형

'MySQL' 카테고리의 다른 글

check table & repair table  (0) 2023.09.14
ERROR 1201  (0) 2023.09.01
컬럼명을 명령어 또는 공통변수(?)로 사용하게 된다면  (0) 2023.04.17
스토리지 엔진  (0) 2022.10.21
my.cnf  (0) 2022.09.28
반응형

2. schema 컬럼, 명령어 또는 공통 변수(?) 로 사용되는 이름이 컬럼으로 쓰일때

mysql> create table tb_test1(`schema` varchar(30));

Query OK, 0 rows affected (0.02 sec)

 

mysql> desc tb_test1;

+--------+-------------+------+-----+---------+-------+

| Field  | Type        | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| schema | varchar(30) | YES  |     | NULL    |       |

+--------+-------------+------+-----+---------+-------+

1 row in set (0.01 sec)

 

mysql> select * from tb_test1 where schema = '11';

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= '11'' at line 1

mysql> select * from tb_test1 where `schema` = '11';

Empty set (0.00 sec)

 

schema 는 mysql에서 공통으로 사용되고 있기때문에 에러가 발생되는 것 같다.

그래서 "``" 를 붙여주니 잘 작동하였음.

반응형

'MySQL' 카테고리의 다른 글

ERROR 1201  (0) 2023.09.01
[iptables] 2003, error connecting to master 'replicator@'  (0) 2023.08.24
스토리지 엔진  (0) 2022.10.21
my.cnf  (0) 2022.09.28
1406, Data too long for column 과 STRICT_TRANS_TABLES  (0) 2022.09.28
반응형

innodb : 일반적인 엔진이며, insert등 dml 을 하는데 유리하다. 작업시 로우 단위로 락이 걸린다.

myISAM : select 가 위주일 때 많이 쓰인다. 만약 dml작업을 한다면 테이블 락이 걸린다.

memory : ????

반응형
반응형

오라클의 pfile과 같다고 생각하였다.

 

1. my.cnf 파일 없다면 데이터 베이스는 올라올까?

테스트 결과 my.cnf가 없어도 디비는 올라왔다.

오라클에서는 pfile 또는 spfile이 반드시 존재해야하는 반면에 mysql에는 my.cnf이 없어도 작동 되는 것을 확인하였다.

다만 my.cnf에서 설정된 시스템 변경 값이 디폴트로 바뀌는 것도 함께 확인을 하였다.

그런데 테스트로는 올라온것을 확인하였으나, 무조건 my.cnf 파일이 있어야 된다는 의견도 있어서 다소 헷갈리는 부분이다.

 

2. my.cnf 파일은 어디에 존재하는가?

my.cnf가 찾을수 없을 때 아래 명령어로 파일을 찾아 나갈수 있다.

find / -name 'my.cnf' 로 파일의 위치를 찾을수가 있다.

 

다만 여기서 실제 적용되고 있는 파일인지 그게 좀 헷갈린다. 파일 내용을 변경하고 적용해보지 않는 이상은 모르는게 아닌가?

데이터베이스 안에서 찾을 수 있는 방법이 있지 않을까 했지만, 없는 것 같다.

 

그래서 최선의 방법으로 아래 명령어로 따라가서 찾아봐야할 것 같다.

$ mysql --help | grep -A 1 'Default options'

결과값을 보면 여러 경로가 나오는데 이것은 우선순위로 my.cnf 를 참조한다고 한다.

Default options are read from the following files in the given order:

/etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf 

필자의 my.cnf 경로는 /usr/local/etc/my.cnf 에 존재하였다.

 

3. my.cnf 경로를 변경해 줄 수는 없는 것인가?

그리고 궁금한 것 중 또 하나는 my.cnf 값을 우선순위 경로로 읽고 있다면, 이 우선순위 경로외에 다른 경로에서 불러 올 수 있는 방법은 있지 않을까 라는 의문이 생겼다.

이것은 아래와 같이 설정에서 바꿔줄 수 있다고 한다. 

우선 우리가 mysql을 실행시킬때 사용하는 mysql.server 을 vi 열어 보면 된다.

$ which mysql.server
/usr/local/bin/mysql.server

 

$ vi /usr/local/bin/mysql.server

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &
$bindir/mysqld_safe --defaults-extra-file=/usr/local/etc/my.cnf --datadir="$datadir" --pid-file="$mysqld_pid_file_path" $other_args >/dev/null &

mysqld_safe 바로 뒤에 위치에 해야한다

이렇게 설정하면 저 파일외에 다른 쪽 my.cnf 파일은 읽어 올수가 없다고 한다. 라고 알고있었지만,

default경로에 my.cnf 파일이 있다면 이 파일부터 읽게 된다.

반응형
반응형

 

set @@global.sql_mode = "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";

 

set @@global.sql_mode = 

"ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"

 

 

python에서 mariadb에 인서트를 하는중에 아래와 같은 에러가 출력되었다.

pymysql.err.DataError: (1406, "Data too long for column 'name' at row 1")

 

넣을려는 값이 더 커서 그런가보다 했지만, 다른 쪽에서는 길었음에도 불구하고 데이터가 잘려서 인서트 되는 경우를 보게 되었다.

이상하게 생각되어 찾아보던 중 이런 설정이 있었다.

 

select @@global.sql_mode;
+--------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+--------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+--------------------------------------------------------------------------------------------------------------------+

 

strict_trans_tables 의 값이 있다면 데이터가 안들어가고 에러를 내뱉고, 없다면 자동으로 알아서 데이터를 잘라서 넣어주는 것이였다.

이것을 설정을 바꾼다면 insert가 가능하다.

set @@global.sql_mode = "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";

설정이 되었다고 바로 적용되는 것은 아니고 해당세션을 새로 접속하면 적용된 것을 볼 수 있다.

 

 

아래는 테스트한 결과 입니다.

mysql> use prod

Database changed

mysql> create table strict_table_test 
    -> (name varchar(10))
    -> ;
Query OK, 0 rows affected (0.01 sec)

-- 10자리 입력
mysql> insert into strict_table_test values('1111111111');
Query OK, 1 row affected (0.01 sec)

-- 11자리 입력
mysql> insert into strict_table_test values('11111111145');
ERROR 1406 (22001): Data too long for column 'name' at row 1

mysql> select @@global.sql_mode;
+-----------------------------------------------------------------------------------------------------------------------+
| @@global.sql_mode                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------+
| ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION |
+-----------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> set @@global.sql_mode = 
    -> "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION";
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye
user@macos mysql % mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 12
Server version: 8.0.22 Homebrew
Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use prod
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

-- 11자리 입력
mysql> insert into strict_table_test values('11111111145');
Query OK, 1 row affected, 1 warning (0.01 sec)

mysql> select * from strict_table_test;
+------------+
| name       |
+------------+
| 1111111111 |
| 1111111114 |  => 마지막 1자리를 제외하고 인서트 된 것을 확인할 수 있다.
+------------+
2 rows in set (0.00 sec)

 

반응형

'MySQL' 카테고리의 다른 글

스토리지 엔진  (0) 2022.10.21
my.cnf  (0) 2022.09.28
transaction이 완벽하지 않은듯하다?  (0) 2022.09.28
시스템 환경설정 확인 방법의 차이?  (0) 2022.09.28
파일에 쓰기  (0) 2022.07.28
반응형

내가 트랙잭션을 걸고 작업을 한다면 문제가 없을것같지만, 다른 세션에서 dml 작업이 들어간다면 혼선이 올수 있을 것 같다.

다른 세션이 dml이 하였을 때 트랜잭션을 건 내 세션에서는 반영이 되는 경우가 있고 안되는 경우가 있는데 왜 그런지 알수가 없었다.

 

start transaction을 하였을 경우 rollback이나 commit이 오기전 까지는 transaction이 계속 활성화 상태로 되어있다고 생각하였다.

그러나 여기서 이상한점은 다른 세션에서 insert를 하였을 경우 transaction 을 건 세션은 select문을 초기 실행 했느냐안했느냐에 따라서 반영이되고안되고를 오락가락 하는것같은데 관련 정리가 필요해 보인다고 생각하였다.

 

이런 의문을 품던중 아래 링크 설명을 보았다. 해당 글을 자세하게 읽어보면 이해를 할 수 있다.

https://zzang9ha.tistory.com/381

 

[MySQL] - 트랜잭션의 격리 수준(Isolation level)

📎 글또 6기 포스팅 1. 미치도록 더웠던 7월의 회고 2. 사용자가 게시물을 작성할 때의 트랜잭션 처리 3. Spring AOP - (1) 프록시 패턴, 데코레이터 패턴 4. [MySQL] - 트랜잭션의 격리 수준(Isolati

zzang9ha.tistory.com

 

show variables like '%isolation%'; 의 격리 수준에 따라 transaction 의 조회하는 상황이 바뀌는 것이였다.

이것은 트랜잭션을 상황에 따라서 변경을 할 수 있다고 하지만, 어떤 케이스에 사용을 해야할지는 의문이다.

 

# tx_isolation 또는 transaction_isolation

tx_isolation으로 사용되오다가 5.7.20부터 transaction_isolation 이  alias 로 추가가 되었다.

그리고 8.0부터는 tx_isolation이 사라졌다.

 

5.7.37 에 2개가 동시에 존재하는 이유는 이때까지는 alias로 사용되어져 왔기때문이라 생각된다.

설정값에는

1. read-uncommitted

2. read-committed

3. repeatable-read

4. serializable

 

1. read-uncommitted

dml 작업이 이루어졌다면 다른 세션에서는  타세션에서 작업한 내용들이 commit 유무를 떠나서 그대로 반영되어 보여진다.

트랜잭션에서 처리가 완료되지 않았음에도 불구하고 다른세션에서 보였다 안보였다 할수있는 것을 더티리드라고 한다.

이런 더티리드가 사용자에게서 혼란을 줄수있기때문에 비권장하는 설정값이다.

 

2. read-committed

dml 작업이 이루어지고, commit을 하였다면 다른 세션에서는 commit된 데이터만 반영되어져서 보여진다.

이것은 오라클에서 적용하는 방법과 가장 유사하다고 생각한다. 보통 이것으로 설정하는 것을 기본으로 한다.

그러나 mysql에서는 이런 방식도 문제가 될수잇다고 한다. 왜냐하면 초반에 select를 하였을때 보여지지 않았던 데이터가 나중에 보여질수 있는 문제가 있다는 것이다. 이것은 입출금 처리가계속 진행중에 다른쪽에서 조회를 한다면 문제가 될수있다고 한다. 조회결과가 들쑥날쑥 변화할수 있다는 것이다.

 

3. repeatable-read

dml 작업이 이루어지고 commit도 이루워졌지만, 다른 세션에서 dml 작업이 이루어지기전에 transaction을 걸었다면 계속 변경되지 않은 값으로 보여진다.

이것은 언두에서 계속 저장해뒀다가 보여주게 되는 것인데, 만약 세션이 닫히지 않았다면 언두는 계속 쌓여져서 불필요한데이터가 남아 있을 수가 있다. mysql을 설치하면 default 값이다.

 

4. serializable

start transaction이 이루어진 세션이 있다면 다른 세션에서는 접근을 할 수가 없다.읽기작업도 할수가 없다.

반응형

'MySQL' 카테고리의 다른 글

my.cnf  (0) 2022.09.28
1406, Data too long for column 과 STRICT_TRANS_TABLES  (0) 2022.09.28
시스템 환경설정 확인 방법의 차이?  (0) 2022.09.28
파일에 쓰기  (0) 2022.07.28
root 패스워드 변경  (0) 2017.08.21
반응형

show variables like '%datadir%' 와 select @@datadir 의 차이가 뭔가 싶었다.

똑같은 값을 내뱉는데 왜 이렇게 다르게 명령어를 줄까 싶었는데

눈으로 봤을때 차이점은 select @@datadir 로 하였을때는 해당 변수값만 보여주고 variable은 보여지지 않는다는 것이다.

 

mysql> show variables like 'datadir';

+---------------+-----------------------+

| Variable_name | Value                 |

+---------------+-----------------------+

| datadir       | /usr/local/var/mysql/ |

+---------------+-----------------------+

1 row in set (0.00 sec)

 

mysql> select @@datadir;

+-----------------------+

| @@datadir             |

+-----------------------+

| /usr/local/var/mysql/ |

+-----------------------+

1 row in set (0.00 sec)

 

그리고 또하나는 select 했을 경우 like처리가 안된다는 것이다.

mysql> select @@transaction_isolation;

+-------------------------+

| @@transaction_isolation |

+-------------------------+

| REPEATABLE-READ         |

+-------------------------+

1 row in set (0.00 sec)

 

mysql> show variables like '%isolation%';

+-----------------------+-----------------+

| Variable_name         | Value           |

+-----------------------+-----------------+

| transaction_isolation | REPEATABLE-READ |

+-----------------------+-----------------+

1 row in set (0.01 sec)

반응형

'MySQL' 카테고리의 다른 글

my.cnf  (0) 2022.09.28
1406, Data too long for column 과 STRICT_TRANS_TABLES  (0) 2022.09.28
transaction이 완벽하지 않은듯하다?  (0) 2022.09.28
파일에 쓰기  (0) 2022.07.28
root 패스워드 변경  (0) 2017.08.21
반응형

#!/bin/sh

today=`date +%Y%m%d`

before=~date +%Y%m%d -d "-1 year"`

connect='/mysql/local/mysql/bin/mysql -uroot -p123456 DBNAME -S /tmp/mysql.sock -N '

$connect -e "select * from dept where reg_date > ${before} " > /data/dept_${today}.txt

 

반응형

'MySQL' 카테고리의 다른 글

my.cnf  (0) 2022.09.28
1406, Data too long for column 과 STRICT_TRANS_TABLES  (0) 2022.09.28
transaction이 완벽하지 않은듯하다?  (0) 2022.09.28
시스템 환경설정 확인 방법의 차이?  (0) 2022.09.28
root 패스워드 변경  (0) 2017.08.21
반응형

mysql> select * from user where user = 'root';

mysql> update user set password = password('1234') where user = 'root';

mysql>  flush privileges;


재로그인 하면 변경 된 것을 알 수 있다.

flush privileges 를 반드시 해야지 변경된다.

반응형

'MySQL' 카테고리의 다른 글

my.cnf  (0) 2022.09.28
1406, Data too long for column 과 STRICT_TRANS_TABLES  (0) 2022.09.28
transaction이 완벽하지 않은듯하다?  (0) 2022.09.28
시스템 환경설정 확인 방법의 차이?  (0) 2022.09.28
파일에 쓰기  (0) 2022.07.28

+ Recent posts