dump all mysql tables into separate files automagically?

后端 未结 10 902
北恋
北恋 2020-11-29 20:21

I\'d like to get dumps of each mysql table into separate files. The manual indicates that the syntax for this is

mysqldump [options] db_name [tbl_name ...]
         


        
相关标签:
10条回答
  • 2020-11-29 20:53

    For Windows Servers, you can use a batch file like so:

    set year=%DATE:~10,4%
    set day=%DATE:~7,2%
    set mnt=%DATE:~4,2%
    set hr=%TIME:~0,2%
    set min=%TIME:~3,2%
    
    IF %day% LSS 10 SET day=0%day:~1,1%
    IF %mnt% LSS 10 SET mnt=0%mnt:~1,1%
    IF %hr% LSS 10 SET hr=0%hr:~1,1%
    IF %min% LSS 10 SET min=0%min:~1,1%
    
    set backuptime=%year%-%mnt%-%day%-%hr%-%min%
    set backupfldr=C:\inetpub\wwwroot\backupfiles\
    set datafldr="C:\Program Files\MySQL\MySQL Server 5.5\data"
    set zipper="C:\inetpub\wwwroot\backupfiles\zip\7za.exe"
    set retaindays=21
    
    :: Switch to the data directory to enumerate the folders
    pushd %datafldr%
    
    :: Get all table names and save them in a temp file
    mysql --skip-column-names --user=root --password=mypassword mydatabasename -e "show tables" > tables.txt
    
    :: Loop through all tables in temp file so that we can save one backup file per table
    for /f "skip=3 delims=|" %%i in (tables.txt) do (
      set tablename = %%i
      mysqldump --user=root --password=mypassword mydatabasename %%i > "%backupfldr%mydatabasename.%backuptime%.%%i.sql"
    )
    del tables.txt
    
    :: Zip all files ending in .sql in the folder
    %zipper% a -tzip "%backupfldr%backup.mydatabasename.%backuptime%.zip" "%backupfldr%*.sql"
    
    echo "Deleting all the files ending in .sql only"
    del "%backupfldr%*.sql"
    
    echo "Deleting zip files older than 21 days now"
    Forfiles /p %backupfldr% /m *.zip /d -%retaindays% /c "cmd /c del /q @path"
    

    Then schedule it using Windows Task Scheduler.

    Also, if you want to exclude certain tables in your backup, note that you can use a where clause on the "show tables" statement, but the column name depends on your database name.

    So for example, if your database name is "blah" then your column name in the "show tables" result set will be "tables_in_blah". Which means you could add a where clause something similar to this:

    show tables where tables_in_blah <> 'badtable'
    

    or

    show tables where tables_in_blah like '%goodtable%'
    
    0 讨论(0)
  • 2020-11-29 20:59

    It looks everybody here forgot of autocommit=0;SET unique_checks=0;SET foreign_key_checks=0; that is suppose to speed up the import process ...

    #!/bin/bash
    MYSQL_USER="USER"
    MYSQL_PASS="PASS"
    
    if [ -z "$1" ]
      then
        echo "Dumping all DB ... in separate files"
        for I in $(mysql -u $MYSQL_USER --password=$MYSQL_PASS -e 'show databases' -s --skip-column-names); 
        do 
          echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$I.sql"
          mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $I >> "$I.sql"; 
          echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$I.sql"
          gzip "$I.sql"
        done
        echo "END."
    else
          echo "Dumping $1 ..."
          echo "SET autocommit=0;SET unique_checks=0;SET foreign_key_checks=0;" > "$1.sql"
          mysqldump -u $MYSQL_USER --password=$MYSQL_PASS $1 >> "$1.sql"; 
          echo "SET autocommit=1;SET unique_checks=1;SET foreign_key_checks=1;commit;" >> "$1.sql"
          gzip "$1.sql"
    fi
    
    0 讨论(0)
  • 2020-11-29 21:03
    #!/bin/bash
    
    for i in $(mysql -uUser -pPASSWORD DATABASE -e "show tables;"|grep -v Tables_in_);do mysqldump -uUSER -pPASSWORD DATABASE $i > /backup/dir/$i".sql";done
    
    tar -cjf "backup_mysql_"$(date +'%Y%m%d')".tar.bz2" /backup/dir/*.sql
    
    0 讨论(0)
  • 2020-11-29 21:05

    The mysqldump command line program does this for you - although the docs are very unclear about this.

    One thing to note is that ~/output/dir has to be writable by the user that owns mysqld. On Mac OS X:

    sudo chown -R _mysqld:_mysqld ~/output/dir
    mysqldump --user=dbuser --password --tab=~/output/dir dbname
    

    After running the above, you will have one tablename.sql file containing each table's schema (create table statement) and tablename.txt file containing the data.

    If you want a dump with schema only, add the --no-data flag:

    mysqldump --user=dbuser --password --no-data --tab=~/output/dir dbname
    
    0 讨论(0)
提交回复
热议问题