全部產品
Search
文件中心

Simple Log Service:關聯MySQL資料來源

更新時間:Sep 02, 2025

本文介紹如何建立外部儲存,建立Log Service與MySQL資料庫的關聯。

前提條件

  • 已採集資料到Log Service。具體操作,請參見資料擷取

  • 已經安裝Log ServiceCLI並且佈建服務入口和存取金鑰

  • 已將資料存放區到阿里雲RDS MySQL資料庫、阿里雲ADB MySQL資料庫或阿里雲ECS上自建的MySQL資料庫。

  • MySQL資料庫在阿里雲VPC內網域內,RDS執行個體、ADB執行個體或ECS執行個體必須與Log ServiceProject處於同一地區。

    重要

    不支援直接使用公網地址串連MySQL資料庫。

背景資訊

Log Service外部儲存功能支援Log Service與阿里雲RDS MySQL資料庫、阿里雲ADB MySQL資料庫以及在阿里雲ECS上自建的MySQL資料庫關聯,您還可以將查詢分析結果寫入MySQL資料庫中,便於進一步處理結果。

操作步驟

1. 設定白名單

RDS MySQL資料庫

需添加白名單地址100.104.0.0/16、11.194.0.0/16和11.201.0.0/16。更多資訊,請參見設定IP白名單

ECS上自建的MySQL資料庫

需設定安全性群組規則,允許100.104.0.0/16、11.194.0.0/16和11.201.0.0/16網段訪問。具體操作,請參見添加安全性群組規則

ADB MySQL資料庫

需添加白名單地址100.104.0.0/16、11.194.0.0/16和11.201.0.0/16。更多資訊,請參見設定白名單

2. 建立ExternalStore

  1. 登入安裝CLI所在的伺服器,在命令列執行touch命令,建立設定檔/home/shell/config.json。在config.json中添加如下指令碼。根據實際情況您需要替換regionvpc-idhostportusernamepassworddbtable的值。

    1. 參數說明

      樣本

      {
          "externalStoreName":"sls_join_meta_store",
          "storeType":"rds-vpc",
          "parameter":{
              "region":"cn-qingdao",
              "vpc-id":"vpc-m5eq4irc1pucp*******",
              "host":"rm-bp1******rm76.mysql.rds.aliyuncs.com",
              "port":"3306",
              "username":"user",
              "password":"****",
              "db":"scmc",
              "table":"join_meta"
          }
      }

      externalStoreName

      ExternalStore名稱,必須小寫。

      storeType

      資料來源類型,固定為rds-vpc

      region

      地區。詳細說明如下:

      • 如果是RDS MySQL資料庫,則配置region為RDS執行個體所在地區。

      • 如果是ADB MySQL資料庫,則配置region為ADB執行個體所在地區。

      • 如果是專用網路下ECS上自建的MySQL資料庫,則配置region為ECS執行個體所在地區。

      重要

      RDS執行個體、ADB執行個體或ECS執行個體必須與Log ServiceProject處於同一地區。

      vpc-id

      VPC ID。詳細說明如下:

      • 如果是專用網路下的RDS PostgreSQL資料庫,則配置vpc-id為RDS執行個體所屬專用網路的ID。

      • 如果是專用網路下的ADB PostgreSQL資料庫,則配置vpc-id為ADB執行個體所屬專用網路的ID。

      • 如果是專用網路下阿里雲Hologres資料庫,則配置vpc-id為阿里雲Hologres所屬專用網路的ID。

      host  

      資料庫地址。詳細說明如下:

      在專用網路下,外表建立後,如果資料庫的執行個體IP發生變化(比如資料庫執行個體發生遷移),則會影響資料庫外表的訪問(即使配置中採用了內網網域名稱,因為建立外表時,後端會自動基於網域名稱解析IP,並儲存到後端配置中,當前暫不支援自動重新整理網域名稱對應的IP)。這種情況下,需要對外表進行更新或者重建。
      • 如果是專用網路下的RDS MySQL資料庫,則配置host為RDS執行個體的內網地址(內網網域名稱或內網IP地址)。

      • 如果是專用網路下的ADB MySQL資料庫,則配置host為ADB執行個體的內網地址(內網網域名稱或內網IP地址)。

      • 如果是專用網路下ECS上自建的MySQL資料庫,則配置host為ECS的私網IP地址。

      • 如果資料庫通過公網可以訪問,則配置對應的公網網域名稱或公網IP地址。

      port

      連接埠號碼。詳細說明如下:

      • 如果是RDS MySQL資料庫,則配置port為RDS執行個體的連接埠號碼。

      • 如果是ADB MySQL資料庫,則配置port為ADB執行個體的連接埠號碼。

      • 如果是專用網路下ECS上自建的MySQL資料庫,則配置port為ECS上MySQL的服務連接埠。

      username

      資料庫使用者名稱。

      password

      資料庫密碼。

      db

      資料庫名。

      table

      資料庫表名,支援兩種格式:

      1. table_name,例如test。

      2. schema_name.table_name,例如public.test。

  1. 在命令列執行如下命令,建立ExternalStore。其中project_name為Log ServiceProject名稱,請根據實際情況替換,本文以log-rds-demo為例。

    aliyunlog log create_external_store --project_name="log-rds-demo" --config="file:///home/shell/config.json" 
  2. 查詢ExternalStore資訊。命令執行成功後,無響應訊息。您可以執行aliyunlog log get_external_store --project_name="log-rds-demo" --store_name="sls_join_meta_store" --format-output=json查詢RDS MySQL外部資料來源詳細資料。查詢資訊如下:

    {
        "externalStoreName":"sls_join_meta_store",
        "storeType":"rds-vpc",
        "parameter":{
             "db": "scmc",
             "host": "rm-bp1******rm76.mysql.rds.aliyuncs.com",
             "port": "3306",
             "region": "cn-wulanchabu",
             "table": "test",
             "username": "user",
             "vpc-id": "vpc-m5eq4irc1pucp*******"
        }
    }

3. 執行外部儲存

執行查詢分析

  • 使用外部儲存

    關聯外部資料源後,您可以在Log Service控制台,名為log-rds-demo的Project下,單擊任意Logstore,通過查詢分析語句* | select * from sls_join_meta_store查詢關聯的MySQL表資料。

    image

  • 使用JOIN關聯Log Service與MySQL表

    • 僅支援Logstore與MySQL資料庫小表(資料量小於20 MB)進行聯集查詢。
    • 查詢和分析語句中,Logstore必須寫在join關鍵字前面,ExternalStore寫在join關鍵字後面。
    • 查詢和分析語句中,必須寫ExternalStore名稱,系統自動替換成MySQL資料庫名+表名。請勿直接填寫MySQL表名。

    支援的Join文法有INNER JOIN、LEFT JOIN、RIGHT JOIN和FULL JOIN。

    [ INNER ] JOIN
    LEFT [ OUTER ] JOIN
    RIGHT [ OUTER ] JOIN
    FULL [ OUTER ] JOIN

    JOIN文法範例如下所示。

    method:postlogstorelogs | select count(1) , histogram(logstore) from log  l join sls_join_meta_store m on l.projectid = cast( m.ikey as varchar)

儲存查詢分析結果到MySQL資料庫

MySQL資料庫表的欄位是varchar,需要將日誌庫的欄位轉換為MySQL表的欄位。例如MySQL表的欄位detailvarchar(60),在Logstore中將索引content用cast函數轉換:cast(content as varchar(60))。cast函數請參見類型轉換函式

Log Service支援通過Insert文法將查詢結果插入到MySQL資料庫中。Insert文法範例如下所示:

method:postlogstorelogs | insert into join_meta  select cast(method as varchar(65535)),count(1) from log group by method

SDK操作

Python程式範例

# encoding: utf-8
from __future__ import print_function
from aliyun.log import *
from aliyun.log.util import base64_encodestring
from random import randint
import time
import os
from datetime import datetime
    endpoint = os.environ.get('ALIYUN_LOG_SAMPLE_ENDPOINT', 'cn-chengdu.log.aliyuncs.com')
    accessKeyId = os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSID', '')
    accessKey = os.environ.get('ALIYUN_LOG_SAMPLE_ACCESSKEY', '')
    logstore = os.environ.get('ALIYUN_LOG_SAMPLE_LOGSTORE', '')
    project = "ali-yunlei-chengdu"
    client = LogClient(endpoint, accessKeyId, accessKey, '')
    #建立ExternalStore。
    res = client.create_external_store(project,
                                       ExternalStoreConfig(externalStoreName="rds_store", region="cn-chengdu",
                                                           storeType="rds-vpc",
                                                           vpcId="vpc-2vctx8reuqswmk********",
                                                           host='rm-2vc6x67972iv********.mysql.cn-chengdu.rds.aliyuncs.com',
                                                           port="3306", username="root", password="123456",
                                                           database="test_database", table="test"))
    res.log_print()
    #擷取ExternalStore詳情。
    res = client.get_external_store(project,"rds_store")
    res.log_print()
    res = client.list_external_store(project,"")
    res.log_print()
    # JOIN查詢。
    req = GetLogsRequest(project,logstore,From,To,"","* | select count(1) from  "+ logstore +"  s join  meta m on  s.projectid = cast(m.ikey as varchar)")
    res = client.get_logs(req)
    res.log_print()
     # 將查詢和分析結果寫入MySQL資料庫。
    req = GetLogsRequest(project,logstore,From,To,"","* |  insert into rds_store select count(1) from  "+ logstore )
    res = client.get_logs(req)
    res.log_print()

相關操作

  • 更新MySQL外部儲存。

    aliyunlog log update_external_store --project_name="log-rds-demo" --config="file:///home/shell/config.json" 
  • 刪除MySQL外部儲存。

    aliyunlog log delete_external_store --project_name="log-rds-demo" --store_name=sls_join_meta_store

相關文檔