2016-07-29 4 views
0

少ないメモリを使用するようにバックアップスクリプトを改善する以下は、私は私のDBサイズとメモリの問題に実行している

は私の現在のバックアップスクリプトです(Erlangのプロセスがクラッシュ)を150メガバイトに近づいてきました。これを改善する方法に関する提案はありますが、バックアップ全体をメモリにロードせず、代わりにS3に直接ストリームしますか?

defmodule Backup do 
    require Logger 
    alias MyApp.{ Repo, BackupUploader, S3 } 

    @database System.get_env("DATABASE_URL") 
    @bucket Application.get_env(:arc, :bucket) 
    @folder "backups" 

    def start do 
    Logger.info "*** Initiating database backup ***" 
    backup = %BackupRequest{} 

    backup 
    |> dump_database 
    |> upload_to_s3 
    end 

    defp dump_database(%BackupRequest{} = backup) do 
    Logger.info "*** Dumping database ***" 
    command = "pg_dump" 
    args = [@database] 
    {data, 0} = System.cmd command, args 

    %{backup | data: data, status: "dumped"} 
    end 

    defp upload_to_s3(%BackupRequest{data: data} = backup) do 
    Logger.info "*** Uploading to S3 bucket ***" 
    key = get_s3_key 
    ExAws.S3.put_object!(@bucket, key, data) 

    Logger.info "*** Backup complete ***" 
    end 

    # Helpers 
    # 
    # 

    defp get_s3_key do 
    {{year, month, day}, {hour, minute, _seconds}} = :os.timestamp |> :calendar.now_to_datetime 

    hash = SecureRandom.urlsafe_base64(32) 
    date = "#{day}-#{month}-#{year}-#{hour}:#{minute}" 
    key = @folder <> "/#{date}_#{hash}_#{Mix.env}" 

    key 
    end 

end 

答えて

関連する問題