연습 - Azure SQL Database에 데이터 로드

완료됨

대량 데이터를 로드하는 경우 다른 곳에서 데이터를 가져와야 합니다. Azure에서는 Azure Blob Storage에 데이터를 저장하거나 덤프하는 것이 일반적입니다. Blob Storage는 상대적으로 저렴한 비용으로 구조화되지 않은 대량의 데이터를 저장하는 데 최적화되어 있습니다.

이 시나리오에서 Adventure Works Cycles는 저장소 식별 번호를 기반으로 저장소 반환 데이터를 수신합니다. 이 데이터는 .dat 파일에 저장된 후 Azure Blob Storage로 푸시됩니다. 데이터를 Blob Storage에 저장한 후 Azure SQL에서 데이터에 액세스할 수 있는 방법이 필요합니다. 스토리지 계정에 대한 액세스 권한이 있는 외부 데이터 원본을 만들어 해당 작업을 수행할 수 있습니다. Microsoft Entra ID, 공유 키 인증 또는 SAS(공유 액세스 서명)를 통해 해당 스토리지 계정에 대한 액세스를 제어할 수 있습니다.

이 연습에서는 Azure Blob Storage에서 Azure SQL Database로 데이터를 대량 로드하는 시나리오 하나를 살펴봅니다. 이 방식은 T-SQL 및 공유 액세스 서명을 사용합니다.

연습을 완료하기 위한 두 가지 옵션이 있습니다.

  • Azure Cloud Shell의 sqlcmd
  • Azure Data Studio의 SQL Notebooks

두 연습은 모두 동일한 명령 및 콘텐츠를 포함하므로 원하는 옵션을 선택할 수 있습니다.

옵션 1: Azure Cloud Shell의 sqlcmd

sqlcmd는 명령줄을 사용하여 SQL Server 및 Azure SQL과 상호 작용할 수 있도록 해주는 명령줄 도구입니다. 이 연습에서는 Azure Cloud Shell의 PowerShell 인스턴스에서 sqlcmd를 사용합니다. sqlcmd는 기본적으로 설치되므로 Azure Cloud Shell에서 쉽게 사용할 수 있습니다.

  1. Bash용 Azure Cloud Shell을 구성하는 방법으로 인해 먼저 통합 Azure Cloud Shell에서 다음 명령을 실행하여 터미널 모드를 변경해야 합니다.

    TERM=dumb
    
  2. 서버 이름과 암호를 수정한 후 통합 터미널에서 다음 명령을 실행합니다.

    sqlcmd -S <server name>.database.windows.net -P <password> -U cloudadmin -d AdventureWorks
    
  3. 로드할 데이터에 대한 테이블과 스키마를 만듭니다. 이 프로세스는 간단한 T-SQL입니다. 이제 데이터베이스에 연결했으므로 터미널에서 다음 스크립트를 실행합니다.

    IF SCHEMA_ID('DataLoad') IS NULL
    EXEC ('CREATE SCHEMA DataLoad')
    CREATE TABLE DataLoad.store_returns
    (
        sr_returned_date_sk             bigint,
        sr_return_time_sk               bigint,
        sr_item_sk                      bigint,
        sr_customer_sk                  bigint,
        sr_cdemo_sk                     bigint,
        sr_hdemo_sk                     bigint,
        sr_addr_sk                      bigint,
        sr_store_sk                     bigint,
        sr_reason_sk                    bigint,
        sr_ticket_number                bigint,
        sr_return_quantity              integer,
        sr_return_amt                   float,
        sr_return_tax                   float,
        sr_return_amt_inc_tax           float,
        sr_fee                          float,
        sr_return_ship_cost             float,
        sr_refunded_cash                float,
        sr_reversed_charge              float,
        sr_store_credit                 float,
        sr_net_loss                     float
    );
    GO
    

    T-SQL 문 뒤에 숫자 항목이 표시됩니다. 이는 T-SQL 항목의 각 줄을 나타냅니다. 예를 들어, 앞의 명령은 26으로 끝납니다. 이 줄 다음에 반드시 ENTER를 선택합니다.

    1>이 다시 표시되면 명령이 완료된 것입니다. 이는 sqlcmd가 다음 T-SQL 항목의 첫 번째 줄에 사용할 준비가 되었음을 나타냅니다.

  4. 다음으로, 마스터 키를 만듭니다.

    CREATE MASTER KEY 
    ENCRYPTION BY PASSWORD='MyComplexPassword00!';
    GO
    
  5. Blob Storage가 퍼블릭(익명) 액세스를 허용하도록 구성되어 있지 않으므로 DATABASE SCOPED CREDENTIAL 값을 만들려면 마스터 키가 필요합니다. 자격 증명은 Blob Storage 계정을 나타냅니다. 데이터 부분은 저장소 반환 데이터의 컨테이너를 지정합니다.

    Azure SQL이 해석하는 방법을 알고 있는 ID로 공유 액세스 서명을 사용합니다. 비밀은 Blob 스토리지 계정에서 생성할 수 있는 SAS 토큰입니다. 이 예에서는 액세스 권한이 없는 스토리지 계정의 SAS 토큰이 제공되므로 저장소 반환 데이터에만 액세스할 수 있습니다.

    CREATE DATABASE SCOPED CREDENTIAL [https://azuresqlworkshopsa.blob.core.windows.net/data/]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
    SECRET = 'st=2020-09-28T22%3A05%3A27Z&se=2030-09-29T22%3A05%3A00Z&sp=rl&sv=2018-03-28&sr=c&sig=52WbuSIJCWyjS6IW6W0ILfIpqh4wLMXmOlifPyOetZI%3D';
    GO
    
  6. 컨테이너에 대한 외부 데이터 원본을 만듭니다.

    CREATE EXTERNAL DATA SOURCE dataset
    WITH
    (
        TYPE = BLOB_STORAGE,
        LOCATION = 'https://azuresqlworkshopsa.blob.core.windows.net/data',
        CREDENTIAL = [https://azuresqlworkshopsa.blob.core.windows.net/data/]
    );
    GO
    
  7. 저장소 반환 파일 중 하나를 대량 삽입합니다. 다음 스크립트를 실행하고 완료되는 동안 설명을 검토합니다.

    SET NOCOUNT ON -- Reduce network traffic by stopping the message that shows the number of rows affected
    BULK INSERT DataLoad.store_returns -- Table you created in step 3
    FROM 'dataset/store_returns/store_returns_1.dat' -- Within the container, the location of the file
    WITH (
    DATA_SOURCE = 'dataset' -- Using the external data source from step 6
    ,DATAFILETYPE = 'char'
    ,FIELDTERMINATOR = '\|'
    ,ROWTERMINATOR = '\|\n'
    ,BATCHSIZE=100000 -- Reduce network traffic by inserting in batches
    , TABLOCK -- Minimize number of log records for the insert operation
    );
    GO
    
  8. 테이블에 삽입된 행 수를 확인합니다.

    SELECT COUNT(*) FROM DataLoad.store_returns;
    GO
    

    모든 항목이 올바르게 실행된 경우 2807797이 반환됩니다.

이 코드는 Blob Storage의 데이터를 Azure SQL Database에 삽입하는 방법에 대한 간단한 예입니다. 연습을 다시 실행하려면 다음 코드를 실행하여 수행한 작업을 다시 설정합니다.

DROP EXTERNAL DATA SOURCE dataset;
DROP DATABASE SCOPED CREDENTIAL [https://azuresqlworkshopsa.blob.core.windows.net/data/];
DROP TABLE DataLoad.store_returns;
DROP MASTER KEY;
GO

옵션 2: Azure Data Studio의 SQL Notebooks

이 작업에는 LoadData.ipynb라는 Notebook을 사용합니다. 디바이스의 \mslearn-azure-sql-fundamentals\02-DeployAndConfigure\loaddata에서 찾을 수 있습니다. Azure Data Studio에서 이 파일을 열어서 연습을 완료한 다음, 여기로 돌아옵니다.

어떤 이유로든 연습을 완료할 수 없는 경우 GitHub의 해당 Notebook 파일에서 결과를 검토할 수 있습니다.