생계/MySQL2024. 1. 16. 15:20

DBeaver 에서 information_schema, performance_schema 보이게 하기. 

디비버 설치 직후 디폴트 상태에서는 information/performance schema 가 아래처럼 보이지 않습니다. 

 

그것을 보려면 아래처럼 따라하면 됩니다. 

커넥션에서 우클릭 -> Connection view -> show system objects 선택

 

선택후 재접속하면 Databases 아래에 information/performance schema 가 보이게 됩니다. 

 

이상 끗

반응형
Posted by 돌고래트레이너
생계/MySQL2024. 1. 15. 14:36

 

mysql 접속시 유저/패스워드 입력안하고 로긴하는 방법을 알아보자 

 

lee@mysql-m:~$ 
lee@mysql-m:~$ mysql_config_editor print --all
lee@mysql-m:~$ 
lee@mysql-m:~$ mysql_config_editor set --login-path=rootconn --host=localhost --user=root --password
Enter password: 
lee@mysql-m:~$ 
lee@mysql-m:~$ 
lee@mysql-m:~$ ls -al
합계 48
drwxr-xr-x  6 lee  lee  4096  1월 16 21:43 .
drwxr-xr-x  3 root root 4096  1월 13 01:00 ..
-rw-------  1 lee  lee   106  1월 14 19:46 .Xauthority
-rw-------  1 lee  lee  1416  1월 16 17:57 .bash_history
-rw-r--r--  1 lee  lee   220  1월 13 01:00 .bash_logout
-rw-r--r--  1 lee  lee  3771  1월 13 01:00 .bashrc
drwx------ 11 lee  lee  4096  1월 13 01:29 .cache
drwx------ 11 lee  lee  4096  1월 14 18:21 .config
drwx------  3 lee  lee  4096  1월 13 01:14 .gnupg
drwxr-xr-x  3 lee  lee  4096  1월 13 01:14 .local
-rw-------  1 lee  lee   136  1월 16 21:44 .mylogin.cnf
lee@mysql-m:~$ mysql_config_editor print --all
[rootconn]
user = "root"
password = *****
host = "localhost"
lee@mysql-m:~$ 

mysql_config_editor 명령으로 credential 을 생성하면 유저 홈 디렉토리에 ".mylogin.cnf" 파일이 생성이 된다.

이후부터는 mysql 로긴시 패스워드를 입력할 필요없이 login-path 옵션을 붙여주면 된다.  

 

반응형
Posted by 돌고래트레이너
생계/MySQL2024. 1. 15. 00:30

virtual box 에 mysql master-slave replication 을 구성해보자  

가상머신은 oracle virtual box 을 사용하고 VM 에는 우분투를 설치하자. 

해당 작업은 이전에 작성한 내용을 참고하자

버추얼박스에 우분투 설치하기

1) 서버구성 

- mysql 설치 (master 역할) 

이것도 이전에 작성한 글을 참고해서 mysql 설치하자. 

버추얼박스에 mysql 설치하기

- vm 복제 (slave 역할)

vm 이 내려간 상태에서 vm 관리자 메뉴에서 대상vm을 복제하자

 

이름과 경로를 설정해준다.

 

같은 네트워크 대역을 사용하여 slave 에서 master 로 통신이 가능하게 설정해야한다. 
 vm 시작전 설정 -> 네트워크 -> 호스트전용어댑터


- hostname 변경 

복제한 vm의 hostname 이 그대로 사용중이니 mysql-s 로 변경해준다. 

@slave 

hostname
sudo hostnamectl set-hostname mysql-s

sudo reboot


2) Replication 설정
 2-1) 설정파일

@master
cd /etc/mysql
sudo vi my.cnf
[mysqld]
log-bin=mysql-bin
server-id=1

sudo service mysql restart

*선택적 설정 고려 
max_binlog_size
expire_log_days
binlog_format=statement|mixed|row


@slave
cd /etc/mysql
sudo vi my.cnf

[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only

sudo service mysql restart


 2-2) Replication 유저 생성
@master
sudo mysql -u root -p1111

-- slave ip 로 생성한다. 
CREATE USER 'REP_ADM'@'192.168.56.102' IDENTIFIED WITH mysql_native_password BY '1111';
GRANT REPLICATION SLAVE ON *.* TO 'REP_ADM'@' 192.168.56.102';
   
SHOW MASTER STATUS;  

File, Position 값을 확인 

@slave 
sudo mysql -u root -p1111

-- master IP 를 넣는다 
CHANGE MASTER TO
MASTER_HOST='192.168.56.101',  
MASTER_USER='REP_ADM',
MASTER_PASSWORD='1111',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.000004',
MASTER_LOG_POS=2391;

START SLAVE;

SHOW SLAVE STATUS \G
=> [ERROR] : equal MySQL server UUIDs

sudo rm -rf /var/lib/mysql/auto.cnf
sudo service mysql restart


START SLAVE;


3) Replicatin 연결 확인 

-- 복제확인
sudo mysql --login-path=rootconn -e 'show slave status \G'|egrep "Master_Host|Master_User|Master_Log_File|Master_Log_Pos|ReplicateIgnore_DB|Running|IO_Err|SQL_Err|Seconds_Behind_Master|SQL_Delay"

** 아래 메세지가 보여야 정상 복제중
Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates


-- 에러확인
show variables like '%log_error%';
=> tail -100f  /var/log/mysql/error.log



4) Replication 에러 메시지별 대응

[ERROR] [MY-013117] [Repl] Replica I/O for channel '': Fatal error: The replica I/O thread stops because source and replica have equal MySQL server UUIDs; these UUIDs must be different for replication to work. Error_code: MY-013117
=> VM 을 복제하면서 동일 uuid 문제 => auto.cnf 삭제 

[ERROR] [MY-013124] [Repl] Replica SQL for channel '': Replica failed to initialize applier metadata structure from the repository, Error_code: MY-013124
=> slave 를 리셋해준다. 
  stop slave; 
  reset slave;
  stop slave;
   
[ERROR] [MY-010584] [Repl] Replica I/O for channel '': Error connecting to source 'REP_ADM@192.17.7.5:3306'. This was attempt 1/86400, with a delay of 60 seconds between attempts. Message: Authentication plugin 'caching_sha2_password' reported error: Authentication requires secure connection. Error_code: MY-002061
=> rep user error : Authentication 확인 => mysql.user 의 plugin 확인 후 변경 => WITH mysql_native_password

[ERROR] [MY-010584] [Repl] Replica SQL for channel '': Worker 1 failed executing transaction 'ANONYMOUS' at source log mysql-bin.000003, end_log_pos 342; Error 'Can't create database 'test'; database exists' on query. Default database: 'test'. Query: 'create database test', Error_code: MY-001007
=> 트랜잭션 실패 : 대상 object 가 존재하지 않거나 실행할수 없어서 발생. skip 또는 object 동일하게 만들고 slave 재시작

** 트랜잭션 실패로 인한 에러메세지가 아는 내용이고 굳이 적용할 필요 없으면 아래명령으로 skip 한다. 
stop slave;
set global sql_slave_skip_counter=1;  -- skip 할 error 갯수
start slave;
show slave status\G

 

이상 끗.

도움되었다면 따봉줘!

반응형
Posted by 돌고래트레이너
생계/MySQL2024. 1. 13. 02:33

vm 재설치한 mysql 에 workbench 로 재접속시 에러 발생 

server public key 를 삭제

해당 파일을 날려준다. 

 

반응형

'생계 > MySQL' 카테고리의 다른 글

mysql login-path 로 로그인하기  (0) 2024.01.15
가상머신 virtualbox mysql replication 구성하기  (0) 2024.01.15
mysql 자주쓰는 함수  (0) 2023.11.06
mysql show 명령어 db정보 확인  (0) 2023.10.23
mysql select lock  (0) 2021.08.02
Posted by 돌고래트레이너
생계/MySQL2023. 11. 6. 17:50

mysql 자주쓰는 함수 정리해보자 

1) 문자열 

SELECT SUBSTR(STMT,2,3)                  -- 문자열 자르기
            , CHAR_LENGTH(STMT)            -- 문자열길이
            , LENGTH(STMT)                         -- 문자열길이 (byte)
            , REVERSE(STMT)                      -- 거꾸로 출력
            , CONCAT(STMT,'AAA','!@#')      -- 문자열 붙이기 ||
  FROM (
               SELECT 'ABC테스트123!@#' STMT FROM DUAL;
              )A;

2) 날짜 

- 현재시간 

select now()                  -- sysdate
 , curdate()                    -- trunc(sysdate)
 , date_add(now(), interval 1 second)   -- 기준시간 + 1초 
 , date_add(now(), interval 1 minute)    -- 기준시간 + 1분  
 , date_add(now(), interval 1 hour)        -- 기준시간 + 1시간  
 , date_add(now(), interval 1 day)        -- 기준시간 + 1일
 , date_add(now(), interval 1 month)    -- 기준시간 + 1달 
 , date_add(now(), interval 1 year)       -- 기준시간 + 1년
 , date_sub(now(), interval 1 second)
 , date_sub(now(), interval 1 minute)
 , date_sub(now(), interval 1 hour)
 , date_sub(now(), interval 1 day)
 , date_sub(now(), interval 1 month)
 , date_sub(now(), interval 1 year)
  from dual
;
  

반응형
Posted by 돌고래트레이너
생계/MySQL2023. 10. 23. 18:01

mysql 에서 DB정보들 확인하는 법 

1) TABLES  
- show tables from dbname like '%ABC' => 테이블 리스트 
- show create table TABLE_NAME; => DDL 확인
- show columns from TABLE_NAME; == desc TABLE_NAME
- show table status from dbname like '%ABC' => table info
 * 참조제약조건
 select constraint_name, table_name
   from information_schema.referential_constraints
  where constraint_schema='SCHEMA_NAME'
    and referenced_table_name='TABLE_NAME';


2) USER 
- select * from mysql.user => 유저리스트 
- show grants for 'user'@'ip'; => 권한 확인 

3) DB 
- show variables like '%server%'
- select database(); => 현재접속 DB
- select user();    => 현재접속 user 
- select version(); => 버전정보 == show variables like 'version'.
- show processlist => select * from performance_schema.processlist;

- show events => select * from information_schema.events;

 

반응형
Posted by 돌고래트레이너
생계/MySQL2021. 8. 2. 15:14

mysql 에서는 테이블 조회할때 마다 read lock 을 잡고,

이경우 다른 세션에서 ddl 을 진행할수가 없다. 

 

sudo mysql -uroot -p

create database testdb;

create user 'test'@'%' identified by '1111';
grant all on testdb.* to 'test'@'%';

FLUSH PRIVILEGES;

use testdb

create table aaa ( a int);

insert into aaa values(1);
commit;

 

 터미널 하나를 열고 test 유저로 testdb 에 접속하자.

-- session A (test) 

sudo mysql -utest -p1111

use testdb


select * from aaa;

터미널 하나를 더 열고 ddl 을 진행해보자. 

-- session B (test2)

drop table aaa;

=> drop 이 진행되지 않고 대기상태에 빠짐. 

이 경우에는 

1. A세션 에서 commit;
2. A세션 에서 exit;

하는 식으로 lock 을 해소.

 

mysql 은 오토커밋이 디폴트로 되어있다.

오토커밋 환경에서는 위와 같은 조회만으로 다른 세션에서 ddl 대기가 생길일이 없다.

그러나 실제 운영환경에서는 아마도 오토커밋 안되게 하는 것이 대부분일 것인데  

여기에 익숙치 않으면 종종 이런 일들이 발생할수 있을것 같다. 

오토커밋을 안쓴다면 interactive_timeout 은 필히 바꿀 필요가 있다. 

반응형
Posted by 돌고래트레이너
생계/MySQL2021. 7. 31. 13:44

mysql 을 설치 직후 디폴트로 세팅된 변수 값들 중 무엇을 바꾸는게 좋을지 알아보자. 

여기에 나온 예시는 내가 경험해보니 바꿔야 함을 느낀 것들이다. 

사이트 환경은 저마다 다르니 그냥 참고해서 취할건 취한고 아니면 패스 하시길..

 

1. time out

 - interactive_timeout
  : 콘솔에서 mysqld와 Client의 connection 후 다음요청을 기다리는 시간

 - wait_timeout
  : 플러그인, API 등을 이용해 (PHP, JDBC) connection 후 다음요청을 기다리는 시간

   디폴트가 28880 인데 시간으로 환산하면 8시간이 넘는다.

  보통 운영을 이렇게 길게 설정할 필요는 없다.

  lock 을 잡고 sleep 에 빠지는 세션을 줄이기 위해서라도 조정은 필요하다. 

 

2. auto commit

 디폴트는 오토커밋이다. 

 오라클의 디폴트는 오토커밋을 하지 않는것이다.

여기에 익숙해져서 mysql 도 오토커밋을 안하는 것으로 변경을 고려해볼수 있다. 

 다만 mysql 은 select 후에 commit 을 하지 않으면 다른 세션에서 해당 테이블에 DDL 을 날리면 대기에 빠질수있다. 

 

3. 테이블 대소문자 구분 

lower_case_table_names 이라는 변수로 테이블명을 소문자로 바꾸는 것을 세팅할수 있다.

리눅스, 유닉스의 디폴트는 0 이고, 테이블명의 대소문자를 구분 하겠다는 뜻이다. 

Create table Abc ( a int);

Create table abc ( a int);

이런식으로 테이블 생성시 중복 에러 없이 생성이 된다.   

mysql> show variables like 'lower%';
+------------------------+-------+
| Variable_name          | Value |
+------------------------+-------+
| lower_case_file_system | OFF   |
| lower_case_table_names | 0     |
+------------------------+-------+
2 rows in set (0.00 sec)

lower_case_table_names = 0  :  테이블 생성 및 조회 시 대·소문자 구분한다.
lower_case_table_names = 1  :  테이블명이 모두 소문자로 변경된다. 
lower_case_table_names = 2  :  윈도우에서 대·소문자를 구분해서 테이블생성

윈도우는 1, 맥킨토시는 2 가 디폴트

 

대소문자를 구별했을때의 문제는 쿼리에서 table 이름을 대소문자 그대로 똑같이 입력해야 한다. 

그리고 윈도우에서 파일 시스템이 대소문자를 구분하지 않아서 문제가 발생할수 있다. 

## 이 설정과 상관없이 쿼리에서 alias 를 줄 경우, mysql 은 대문자면 대문자, 소문자면 소문자 그대로 써야 한다. 

select *  from abc A where A.col1 = '1'  (O)

select *  from abc A where a.col1 = '1'   (X)

 

4. isolation level 

디폴트는 repeatable read 이다. 

트랜잭션의 안정성과 동시성은 양립할수 없다. (lock 매커니즘을 사용한다면)

각 사이트 환경에 따라 적절한 트랜잭션 고립 레벨을 고려해볼수 있겠으나

보통 oracle 환경이 READ COMMITTED 였기 때문에 변경을 고려해볼수 있다. 

 

아래는 4가지 transaction isolation level 이다. 

1) read uncommitted 

   => dirty read 가능

2) read committed

   => non-repeatable read 가능

3) repeatable read

   => phantom read 가능 

4) serializable

 

반응형
Posted by 돌고래트레이너
생계/MySQL2021. 6. 26. 16:52

 앞선 글에서 가상머신에 우분투를 설치하는 것을 알아보았다.

가상머신 virtualbox mysql 설치 - 1. os 우분투 설치

 

 이번 글에서는 본격적으로 mysql 을 설치해보자. 

 mysql 은 따로 다운 받아서 설치할수도 있지만 cmd 창에서 명령어 한줄이면 된다. 


1. mysql 설치 
 


sudo apt install git

sudo apt-get update
sudo apt-get install mysql-server


sudo systemctl start mysql
sudo systemctl enable mysql

sudo mysql -u root 

 

2. db client tool 설치

이제 디비에 접속하기 위한 툴을 설치해보자.

dbeaver 도 있고 oracle developer 도 있고 암꺼나 써도 되지만 여기서는 workbench 를 쓰겠다. 

workbench 는 아래 다운로드 링크를 따라가면 된다. 

 https://dev.mysql.com/downloads/file/?id=504530
 
c++ 이 필요하다. 아래 링크에서 다운받자.

 https://support.microsoft.com/ko-kr/topic/%EC%A7%80%EC%9B%90%EB%90%98%EB%8A%94-%EC%B5%9C%EC%8B%A0-visual-c-%EB%8B%A4%EC%9A%B4%EB%A1%9C%EB%93%9C-2647da03-1eea-4433-9aff-95f26a218cc0

 

지원되는 최신 Visual C++ 다운로드

시간을 최대한 활용하기 위한 구독

support.microsoft.com

 

 

3. db 접속 

 이제 workbench 에서 가상머신 mysql DB 에 접속해보자. 

- db에 외부 아이피 접속 허용

create user root@'%' identified by '1111';
grant all privileges on *.* to root@'%';
flush privileges;

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

my.cnf 수정 => bind-address = 0.0.0.0

- 방화벽 

sudo ufw allow out 3306/tcp
sudo ufw allow in 3306/tcp

 여기까지 했으면 mysql 을 재시작 해보자.

sudo service mysql restart

 
 - workbench 세팅 

 접속을 시도하면... 

 잘된다. 

 

### 에러메세지 별 접속 실패 시 조치 

 ssh 인증 실패 : 계정, 패스워드, 포트 확인해보자 

 

로컬pc 에서 cmd 창을 열어 key 를 다시 만들자

ssh-keygen -R 192.168.56.1

 

ssh 까진 된거다. mysql port 방화벽 확인해보자.

db 로그인 실패 : db계정, 암호, 외부접근 허용 확인 

반응형
Posted by 돌고래트레이너
생계/MySQL2021. 6. 26. 16:49

가상머신에 mysql 을 설치해보자..

예전에는 가상화머신을 vmware 를 많이 썼는데 유료로 바뀌기도 하고 크랙을 찾기도 쉽지않다. 

반면 오라클 virtual box 는 언제 바뀔지 모르겠지만 아직까지는 무료이다.

 

1. 다운로드

- virtual machine download

 https://www.virtualbox.org/wiki/Downloads
 => windows hosts

버추얼박스를 설치할 로컬pc 는 윈도우니까 windows hosts 를 선택 

  설치는 별거 없다. 그냥 next, next... 하면된다. 



- ubuntu linux download
 

  가상머신에는 리눅스를 설치할 예정이니 우분투 이미지를 받자 

 https://ubuntu.com/download
 Ubuntu 20.04.2.0 LTS =>  ubuntu-20.04.2.0-desktop-amd64.iso 



2. virtual machine, 우분투 설치

버추얼머신 에서 새로만들기 -> 버전 에서 64 bit ubuntu 선택 

 

메모리는 2G를, 디스크는 20G 를 할당하

# 리눅스에 64bit 가 안보인다면 bios 세팅 확인 : 가상화 enable

- 우분투 설치 

새로운 머신을 만들었으면 여기에 우분투를 설치하자

설정에서 저장소에서 아까 다운받은 우분투 이미지를 로드하자

 

한국어를 선택하고 설치를 하자. 

 

빠른설치를 위해 최소설치, 업데이트는 제외하자

mysql 을 사용할 user 를 생성

3. ssh client 설치 

가상머신에 리눅스 까지 설치했으면 로컬 터미널에서 ssh 로 붙어서 작업을 하자.

무료 ssh client 중에 putty 가 유명하지만 좀 구리다.

요즘은 mobaxterm 을 많이 쓰는것 같다. 

https://mobaxterm.mobatek.net/download.html
 

- 우분투에 ssh 설치

가상머신 우분투에는 ssh 가 설치되어있어야 한다. 

sudo apt-get install ssh

방화벽에 막혔다면 풀어주자

## sudo ufw allow ssh

- NAT rule

가상머신을 설치하고 ipconfig 명령어를 쳐보면 아래주소가 추가로 생긴다. 

로컬pc 는 가상머신을 저 ip 로 인식하는데 가상머신은 저 주소안에 

여러개의 게스트os 를 둘수가 있다. 

 

이제 가상머신의 ip 확인을 해야 하는데 그전에 아래 명령어를 먼저 쳐준다. 

sudo apt install net-tools

이제 ip 확인을 해보자. 

 

로컬pc 와 가상머신이 통신하려면 아래 같은 추가적인 작업을 해줘야 한다. 

버추얼머신의 설정 -> 네트워크 를 누른다 

 

이제 포트포워드 규칙에 따라서 로컬pc 에서 터미널로 접속할수 있다. 

 

여기까지 가상머신에 우분투 설치를 알아보았다. 

여기에 mysql 설치, 접속 하는 것 까지는 다음 글에서 알아보자. 

가상머신 virtualbox mysql 설치 - 2. mysql 설치 접속
 

 

반응형
Posted by 돌고래트레이너