1
SELECT * FROM MaterialWeeklyOutputTable;
cs

[테이블 구조 설명]

mwSeq : 순번 / auto_increment

mwCode : 원재료 코드명

mwTime : 출고 날짜

mwAmount : 출고량

mwInventory : 남은 재고량

mwRemarks : 비고

 

구하고자 하는 것

월별로 그룹하여

1. 출고량의 합

2. 해당월의 마지막 날(최신)의 재고량

이다.

1
2
3
4
5
6
7
8
9
10
SELECT a.mwCode, a.mwTime, a.mwAmount, temp.mwInventory
FROM 
(
    SELECT mwCode, MAX(mwTime) AS mwTime, SUM(mwAmount) AS mwAmount
    FROM MaterialWeeklyOutputTable
    WHERE mwCode = '070' AND mwTime > '2016-01' 
    GROUP BY LEFT(mwTime, 7)
) a
INNER JOIN MaterialWeeklyOutputTable as temp 
ON temp.mwCode = a.mwCode AND temp.mwTime = a.mwTime
cs

같은 테이블을 INNER JOIN 하여 구하였다.

더 좋은 방법이 떠오르지 않느다....

'Centos7 > MySQL' 카테고리의 다른 글

MySQL Replication  (0) 2019.05.27
MySQL Replication 작동 원리  (0) 2019.05.16

준비 : 서버 2대와 각각의 서버에 mysql 설치되어있는 상태

 

Master 서버 부분

1. mysql 환경 설정

[vi /etc/my.cnf]

1
2
3
4
[mysqld]
log-bin=mysql-bin
server-id=1
binlog_do_db=EdgeDB
 

 

2. mysql 계정 생성(slave에서 master로 접속할 계정)

1
mysql> grant all privileges on *.* to 'repl'@'%' identified by '';
 

 

3. systemctl restart mysqld

mysql 재시작

 

 

4. master 서버 정보 확인

1
2
3
4
5
6
7
 mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000002 |     1956 | EdgeDB       |                  |                   |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
 
 

여기서 file 이름과 position 위치를 알고 있어야 한다.

 


Slave 서버 부분

1. slave서버에 master에 있는 db명과 같은 디비 생성(만약 dump 파일로 db를 옮긴 상태라면 이 과정은 필요없다.)

1
 mysql> create database EdgeDB default character set utf8;
 

 

2. slave 서버 mysql 환경 설정

[vi /etc/my.cnf]

1
2
3
4
5
[mysqld]
server-id=2
binlog_do_db=EdgeDB
slave-skip-errors=all
read_only=1
 

 

3. systemctl restart mysqld

mysql 재시작

 

 

4. slave 서버의 mysql 내부 설정

1
2
3
4
5
6
mysql> change master to
master_host='마스터ip주소',
master_user='repl',
master_password='repl의 비번',
master_log_file='mysql-bin.000002',
master_log_pos=1956;
 

 


5. 연결 확인(master)

1
2
3
4
5
6
7
8
9
10
mysql> show processlist\G
*************************** 1. row ***************************
     Id: 106
   User: repl
   Host: slave서버ip:50896
     db: NULL
Command: Binlog Dump
   Time: 3537
  State: Master has sent all binlog to slave; waiting for more updates
   Info: NULL
 
 

6 slave 서버에서...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: master ip주소
                  Master_User: repl
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 1956
               Relay_Log_File: mysqld-relay-bin.000002
                Relay_Log_Pos: 1740
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1956
              Relay_Log_Space: 1914
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File:
           Master_SSL_CA_Path:
              Master_SSL_Cert:
            Master_SSL_Cipher:
               Master_SSL_Key:
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Master_Server_Id: 1
                  Master_UUID: b9ea7ac5-207f-11e9-b5f6-1866da603378
             Master_Info_File: /var/lib/mysql/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Master_SSL_Crl:
           Master_SSL_Crlpath:
           Retrieved_Gtid_Set:
            Executed_Gtid_Set:
                Auto_Position: 0
1 row in set (0.00 sec)
 
 

Last_IO_Errno: 0

Last_IO_Error:

위와 같이 에러 내용이 없어야 한다.

 

실제로 마스터 mysql에서 데이터를 입출력 하면 slave에 데이터가 입출력 되는것을 확인 가능하다.

'Centos7 > MySQL' 카테고리의 다른 글

GROUP BY 그룹별-월별 최신날짜의 데이터 가져오기  (0) 2020.06.29
MySQL Replication 작동 원리  (0) 2019.05.16

[HTML] - search.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
<html>
        <script type=text/javascript src="{{url_for('static', filename='jQuery.js') }}"></script>
        <script>
        function test(){
                var text_data = $('#item_id').val();
                $.ajax({
                        type : 'POST',                                  <!--GET / POST-->
                        url : 'http://ip주소:5000/item_request',
                        data : {
                                item_id:text_data                       <!--key : "value"-->
                        },
                        dataType : 'JSON',
                        success : function(result){
                                alert("result = "+ result);
                                $('#a').html(result);
                        },
                        error : function(xtr,status,error){
                                alert(xtr +":"+status+":"+error);
                        }
                });
        }
        </script>
        <body>
                <p>검색하고자 하는 아이템을 입력하세요.</p>
                <input type = "text" name="item_id" id="item_id"/>
                <input type = "button" value = "데이터 요청" onclick="test()"/>
                <h1 id ="a"></h1>
        </body>
</html>
 
 

[Flask(python)] -controller.py

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
from flask import Flask, request, Response, jsonify, render_template
 
app = Flask(__name__)
app.debug = True
 
import json
import mysql.connector
 
db = mysql.connector.connect(host="DB가 설치된 IP주소", user="DB사용자",passwd="DB비번", db='DB명', port=DB포트번호)
curs = db.cursor()
 
@app.route('/')
def index():
    return render_template('index.html')
 
@app.route('/search')
def item_search():
    return render_template('search.html')
    
@app.route('/item_request', methods =['POST'])
def item_query():
    value1 = request.form['item_id']
    item_sql = "select * from student where id ='"+value1+"'"
    curs.execute(item_sql)
    row_headers=[x[0for x in curs.description]
    rows=curs.fetchall()            
    json_data=[]                                        #list
    for result in rows:
        json_data.append(dict(zip(row_headers,result)))
    
    json_return=json.dumps(json_data[0])   #string #json
 
    return jsonify(json_return)
 
    curs.close()
 
if __name__=='__main__':
    app.run(host='0.0.0.0',port=5000)
 
db.close()
 
 

[index.html]

1
2
3
4
5
6
7
8
<!DOCTYPE html>
<html>
        <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
        <body>
            <p>정보</p>
            <br><a href ="http://ip:5000/search">item search</a>
        </body>
</html>
 
 

[실행 화면]

 

crontab -

예약된 작업 리스트 출력. 현재 아무런 작업이 예약되어있지 않아 "no crontab for hadoop" 로 나온다.

1
2
[hadoop@master ~]$ crontab -l
no crontab for hadoop
 

crontab -e

등록 및 수정, 삭제

1
[hadoop@master ~]$ crontab -e
 

작성 방법

분,시,일,월,요일 파일명

분 : 0~59

시 : 0~23

일 : 1~31

월 : 1~12

요일 : 0~6 / 0-일, 1-월, 2-화, 3-수, 4-목, 5-금, 6-토

 

예시

1분 마다 실행

1
[hadoop@master ~]$ * * * * * test.sh
 

매시 10분, 45분에 실행

1
[hadoop@master ~]$ 10,45 * * * * test.sh
 

 

매 오전 5시 10분, 45분에 실행

1
[hadoop@master ~]$ 10,45 5 * * * test.sh
 

 

매월 일요일 오전 5시 10분, 45분에 실행

1
[hadoop@master ~]$ 10,45 5 * * 0 test.sh
 

 

 

혹여 본인의 컴퓨터의 타임존하고 맞지 않는 경우가 있으니 아래와 같이 꼭 확인하세요.

1
2
[hadoop@master ~]$ date
2019. 05. 16. (목) 14:29:39 KST
 

KST 는 한국 표준시 이다.

'Centos7' 카테고리의 다른 글

Shell script에서 MySQL Query 사용하는 방법  (0) 2019.05.15

https://medium.com/@sandeepsinh/sqoop-jobs-development-using-python-82e4b0139457

 

Sqoop job development using Python

Sqoop job development using Python

medium.com

기존의 경로에 파일을 있다면 에러가 나기에 파일을 삭제하고 다시 만들어야 한다.

--delete-target-dir --target-dir 'user/hadoop/input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import subprocess
import logging
 
logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.DEBUG)
   # Function to run Hadoop command
def run_unix_cmd(args_list):
"""
    run linux commands
    """
    print('Running system command:{0}'.format('     '.join(args_list)))
    s_output, s_err = proc.communicate()
    s_return = proc.returncode
    return s_return, s_output, s_err
 
  # Create Sqoop Job
def sqoop_job():
   """
   Create Sqoop job
   """
   cmd = ['sqoop''import''--connect''jdbc:mysql://192.168.0.35:3309/member?serverTimezone=Asia/Seoul''--username''hadoop','--password''markate123''--tab    le''student''-m''1''--delete-target-dir','--target-dir''/user/hadoop/input']
   print(cmd)
   (ret, out, err) = run_unix_cmd(cmd)
   print(ret, out, err)
   if ret == 0:
      logging.info('Success.')
   else:
      logging.info('Error.')
 
if __name__ == '__main__':
    sqoop_job()
 
 

 

 

'Centos7 > Sqoop' 카테고리의 다른 글

스쿱-MySQL 연동 2. 테스트  (0) 2019.05.09
스쿱-MySQL 연동 1. Sqoop & MySQL Connector 설치 및 설정  (0) 2019.05.09

MySQL 특징

  • Master MySQL은 Slave MySQL에 대한 정보를 전혀 가지고 있지 않다. 이는 slave가 있는지 없는지, 몇개의 slave가 붙어 있는지, 각 slave가 어디까지 data를 복제했는지 모른다는 거다.
  • Master MySQL에서 Data 또는 스키마에 대한 변경 Event가 발생하면 Binary logs에 기록한다. 다시 말하자면, Data 또는 스키마를 변경하려는 Event를 기록한다는 것이다.  이는 Binary logs가 존재하는 한 데이터를 복구 할 수 있다는 뜻이다. 물론 복제 할 때에도 사용된다.
  • Slave MySQL은 어떤 Event까지 저장되어 있는지 기억하고 있다.

허면 어떻게 MySQL Replication가 이루어 지는지 알아볼 필요가 있다.

 

1. Slave는 I/O thread를 통해 Master에게 Event를 요청한다.(slave는 어떤 Event까지 저장되어있는지 알고 있기 때문에 Master에게 그 이후의 Event를 요청)

 

2. Slave가 Event를 요청하면 Master에서는 Binlog dump thread를 통해 Slave에 Event를 보낸다.

Binlog dump thread : Master에 저장된 Binary logs를 Slave에 전달하기 위해 Master에서는 thread를 만드는데 이를 Binlog dump thread라고 한다. Binlog dump thread는 Slave에서 Event를 요청하면 Binary logs에 락을 걸고 안에 기록된 Event 읽고, 락을 풀고 Slave에 전달하는 기능을 가지고 있다.

 

3. Slave는 I/O thread를 통해 받은 Event를 Relay log에 기록한다.

 

4. Slave는 SQL thread를 통해 Event가 기록된 Relay log를 읽고 자신의 데이터를 변경 한다. 그리고 Relay log를 지운다.

'Centos7 > MySQL' 카테고리의 다른 글

GROUP BY 그룹별-월별 최신날짜의 데이터 가져오기  (0) 2020.06.29
MySQL Replication  (0) 2019.05.27

+ Recent posts