Export and Load Data from MySQL to SQL Server Using Sling

Slinger avatar
Slinger
Cover for Export and Load Data from MySQL to SQL Server Using Sling

Introduction

Data migration between different database systems is a common yet challenging task in modern data operations. When it comes to moving data from MySQL to SQL Server, organizations often face numerous hurdles: differences in data types, handling large datasets efficiently, maintaining data integrity, and ensuring minimal downtime. Traditional approaches might involve writing custom scripts, using ETL tools that require significant setup, or relying on expensive enterprise solutions.

Enter Sling: a modern data movement and transformation platform that simplifies these complex migrations. In this article, we’ll explore how Sling streamlines the process of migrating data from MySQL to SQL Server, making it accessible, efficient, and reliable.

Understanding Sling’s Capabilities

Sling stands out in the data migration landscape by offering a powerful combination of simplicity and flexibility. Unlike traditional ETL tools that often require extensive setup and configuration, Sling provides a straightforward approach to database migrations while maintaining the robustness needed for production environments.

Key features that make Sling particularly effective for MySQL to SQL Server migrations include:

  • Automatic schema mapping and creation
  • Efficient bulk data transfer
  • Support for incremental updates
  • Built-in data type handling
  • Real-time monitoring and error handling

Let’s dive into how you can leverage these capabilities to simplify your database migration process.

Installing Sling

Before we begin migrating data, let’s get Sling installed on your system. Sling provides multiple installation methods to suit different operating systems and preferences.

System Requirements

Sling is designed to be lightweight and efficient, with minimal system requirements:

  • Operating System: Windows, macOS, or Linux
  • Memory: 512MB minimum (2GB recommended for large datasets)
  • Storage: 100MB for installation
  • Network: Access to both source (MySQL) and target (SQL Server) databases

Installation Methods

Choose the installation method that best suits your environment:

# Install using Homebrew (macOS)
brew install slingdata-io/sling/sling

# Install using curl (Linux)
curl -LO 'https://github.com/slingdata-io/sling-cli/releases/latest/download/sling_linux_amd64.tar.gz' \
  && tar xf sling_linux_amd64.tar.gz \
  && rm -f sling_linux_amd64.tar.gz \
  && chmod +x sling

# Install using Scoop (Windows)
scoop bucket add sling https://github.com/slingdata-io/scoop-sling.git
scoop install sling

# Install using Python pip
pip install sling

For more detailed installation instructions, visit the official documentation.

Verifying Installation

After installation, verify that Sling is properly installed by checking its version:

# Check Sling version
sling --version

If you see the version number displayed, you’re ready to proceed with configuring your database connections.

Setting Up Database Connections

A crucial step in the migration process is properly configuring connections to both your source MySQL database and target SQL Server database. Sling provides multiple ways to manage these connections, including environment variables and a YAML configuration file.

MySQL Connection Setup

For MySQL, you’ll need to provide the following connection details:

  • Host address
  • Port (default: 3306)
  • Database name
  • Username and password
  • Optional SSL/TLS configuration

Here’s how to set up a MySQL connection using the sling conns command:

# Set up MySQL connection using command line
sling conns set MYSQL type=mysql host=your-mysql-host user=your-user database=your-database password=your-password port=3306

Alternatively, you can use a connection URL:

# Set up MySQL connection using URL
sling conns set MYSQL url="mysql://your-user:your-password@your-mysql-host:3306/your-database"

SQL Server Connection Setup

For SQL Server, you’ll need:

  • Host address
  • Port (default: 1433)
  • Database name
  • Username and password
  • Optional instance name
  • Optional encryption settings

Here’s how to set up a SQL Server connection:

# Set up SQL Server connection using command line
sling conns set MSSQL type=sqlserver host=your-sqlserver-host user=your-user database=your-database password=your-password port=1433

Or using a connection URL:

# Set up SQL Server connection using URL
sling conns set MSSQL url="sqlserver://your-user:your-password@your-sqlserver-host:1433?database=your-database&encrypt=true&TrustServerCertificate=true"

Using Environment Variables

You can also set up connections using environment variables:

# MySQL connection string
export MYSQL='mysql://your-user:your-password@your-mysql-host:3306/your-database'

# SQL Server connection string
export MSSQL='sqlserver://your-user:your-password@your-sqlserver-host:1433?database=your-database'

YAML Configuration

For a more maintainable approach, especially in production environments, you can use Sling’s env.yaml file:

connections:
  MYSQL:
    type: mysql
    host: your-mysql-host
    user: your-user
    port: 3306
    database: your-database
    password: your-password

  MSSQL:
    type: sqlserver
    host: your-sqlserver-host
    user: your-user
    port: 1433
    database: your-database
    password: your-password
    encrypt: 'true'
    trust_server_certificate: 'true'

Save this configuration in ~/.sling/env.yaml. For more details about environment configuration, refer to the environment documentation.

Testing Connections

After setting up your connections, it’s important to verify they work correctly:

# Test MySQL connection
sling conns test MYSQL

# Test SQL Server connection
sling conns test MSSQL

You can also list available tables and views in your databases:

# List available streams in MySQL
sling conns discover MYSQL

# List available streams in SQL Server
sling conns discover MSSQL

Sling Connections UI

With both connections properly configured and tested, we’re ready to start migrating data between the databases.

Simple Data Migration with CLI

Sling’s command-line interface provides a straightforward way to migrate data between databases. Let’s explore how to use CLI flags for both simple and more complex migration scenarios.

Basic Table Migration

The simplest form of migration involves copying a single table from MySQL to SQL Server. Here’s a basic example:

# Migrate a single table with default options
sling run --src-conn MYSQL --src-object customers \
          --tgt-conn MSSQL --tgt-object dbo.customers

This command will:

  1. Read the customers table from MySQL
  2. Automatically create the target table in SQL Server if it doesn’t exist
  3. Copy all data maintaining the original schema structure

Advanced CLI Options

For more complex scenarios, Sling provides various CLI flags to customize the migration process. Here’s an example with additional options:

# Migrate data with custom options
sling run --src-conn MYSQL --src-object orders \
          --tgt-conn MSSQL --tgt-object dbo.orders \
          --select 'order_id,customer_id,order_date,total_amount'
          --tgt-options '{ "column_casing": "snake", "add_new_columns": true, "table_keys": { "primary_key": ["order_id"] } }' \
          --mode incremental \
          --update-key order_date

This advanced example:

  • Selects specific columns from the source table
  • Configures primary keys
  • Uses snake case for column names in the target
  • Enables automatic addition of new columns
  • Performs an incremental update based on the order_date column

For a complete list of available CLI flags and options, refer to the CLI flags documentation.

Advanced Data Migration with YAML

While CLI flags are great for quick migrations, YAML configurations provide a more maintainable and powerful way to define complex migration tasks. Let’s explore how to use YAML configurations for MySQL to SQL Server migrations.

Basic Multi-Stream Configuration

Here’s a basic example that migrates multiple tables with default settings:

# mysql_to_sqlserver.yaml
source: mysql
target: mssql

streams:
  customers:
    object: dbo.customers
    mode: full-refresh
    
  orders:
    object: dbo.orders
    mode: incremental
    update_key: order_date
    primary_key: [order_id]

To run this configuration:

# Run the replication using YAML config
sling run -r mysql_to_sqlserver.yaml

Advanced Configuration Example

Here’s a more complex example that showcases various features:

# mysql_to_sqlserver_advanced.yaml
source: mysql
target: mssql

defaults:
  mode: incremental
  target_options:
    column_casing: snake
    add_new_columns: true
    batch_limit: 10000

streams:
  customers:
    object: dbo.customers
    primary_key: [customer_id]
    update_key: last_modified
    select: [customer_id, first_name, last_name, email, status, last_modified]
    source_options:
      table_keys: [customer_id]
    target_options:
      table_keys:
        unique_key: [email]
      pre_sql: |
        IF NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'dbo')
        BEGIN
          EXEC('CREATE SCHEMA dbo')
        END
  
  orders:
    object: dbo.orders
    primary_key: [order_id]
    update_key: order_date
    columns:
      total_amount: decimal(10, 2)
    source_options:
      select: |
        SELECT 
          order_id,
          customer_id,
          order_date,
          COALESCE(total_amount, 0) as total_amount,
          status
        FROM orders
        WHERE status != 'DELETED'
    target_options:
      table_keys:
        primary_key: [order_id]

  order_items:
    object: dbo.order_items
    primary_key: [order_id, item_id]
    update_key: last_modified

This advanced configuration demonstrates:

  • Default settings for all streams
  • Custom SQL queries for data selection
  • Column transformations
  • Primary and foreign key configurations
  • Schema creation with pre-SQL
  • Batch size control for performance optimization

Using Runtime Variables

Sling supports runtime variables that can make your configurations more dynamic:

# mysql_to_sqlserver_dynamic.yaml
source: mysql
target: mssql

env:
  tgt_schema: dbo
  batch_size: 5000

streams:
  main.*:
    object: {tgt_schema}.{stream_table}
    mode: full-refresh
    target_options:
      batch_limit: {batch_size}

You can use this configuration with runtime variables:

# Run with specific table and mode
sling run -r mysql_to_sqlserver_dynamic.yaml --var stream_table=customers --var mode=incremental

For more information about runtime variables, see the runtime variables documentation.

Monitoring Replications

When running YAML-based replications, Sling provides detailed execution information through both the CLI and the web interface:

Sling Execution UI

The web interface provides additional features like:

  • Detailed progress tracking for each stream
  • Historical execution statistics
  • Error logs and debugging information
  • Performance metrics and optimization suggestions

Sling Platform Overview

While the CLI is powerful for individual migrations, the Sling Platform provides a comprehensive web interface for managing and monitoring data operations at scale. Let’s explore the key components of the platform that make database migrations even more manageable.

Web Interface Features

The Sling Platform offers a modern, intuitive interface for:

  • Visual configuration of database connections
  • Interactive replication builder
  • Real-time monitoring of data transfers
  • Team collaboration tools
  • Detailed logging and analytics

Monitoring and Management

The platform provides extensive monitoring capabilities:

  • Real-time progress tracking
  • Historical performance analytics
  • Error detection and alerting
  • Resource utilization metrics
  • Automated retry mechanisms

Team Collaboration

Enterprise features include:

  • Role-based access control
  • Shared connection management
  • Replication templates
  • Audit logging
  • Team-wide notifications

For more information about the Sling Platform, visit the platform documentation.

Next Steps

Now that you understand how to use Sling for MySQL to SQL Server migrations, here are some resources to help you get started and expand your usage:

Additional Resources

Community and Support

Further Use Cases

Beyond MySQL to SQL Server migrations, Sling supports various other scenarios:

  • Real-time data synchronization
  • Database backup and archival
  • Cross-platform data replication
  • Schema migration and validation
  • Data warehouse loading

Whether you’re performing a one-time migration or setting up ongoing data synchronization, Sling provides the tools and flexibility to handle your database migration needs efficiently and reliably.