How do I alias a database in MySQL?

前端 未结 4 1271
猫巷女王i
猫巷女王i 2020-12-03 21:00

I\'m looking for a way to alias a database in MySQL. The reason is to be able to rename a live, production database without bringing the system down. I figure I can alias

4条回答
  •  一向
    一向 (楼主)
    2020-12-03 21:42

    Use the code referenced below to create synonyms.

    The easiest way to do this which will work across storage engines (eg: InnoDB, MyISAM, etc) is to use a "Synonym" for all access to a database.

    These links will show you the stored procedures you need in order to accomplish this.

    NOTES: You should remove the "sys." from the "sys.quote_identifier" (should just be "quote_identifier") in 'create_synonym_db.sql'.

    Code:

    • https://github.com/mysql/mysql-sys/blob/master/procedures/create_synonym_db.sql
    • https://github.com/mysql/mysql-sys/blob/master/functions/quote_identifier.sql

    To use:

    This will make a matching access schema for 'CURRENT_DB' which will allow all standard SQL functionality via referencing 'FAKE-DB_NAME'.

    CALL create_synonym_db('CURRENT_DB', 'FAKE_DB_NAME');
    

    To Remove a synonym:

    This will drop the synonym, but not drop the original database (tested on Maria 10.10.0 Series).

    DROP DATABASE FAKE_DB_NAME;
    

    To accomplish your needs, you would have all app tiers communicate with 'FAKE_DB_NAME', and, on the need to do the form of maintenance you're discussing, you'd remove the current synonym and replace it with one pointing to the other database.

    So, once loading those stored prodecures for the correct maintenance account (whatever MySQL account you use for such maintenance), you'd do the following:

    (1) Create a Synonym:

    CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');
    

    (2) Use Database as normal by synonym:

    • All SQL code referring to database by 'FAKE_DB_NAME'

    (3) Make your temp/backup/replacment DB with whatever methods you've chosen.

    (4) Switch all app tier SQL code to the Temp DB

    DROP DATABASE FAKE_DB_NAME;
    CALL create_synonym_db('TempDB', 'FAKE_DB_NAME');
    

    (5) Perform whatever maintenance you have planned on 'NormalDB'

    (6) Switch all app tier SQL code to the Temp DB

    These two transaction should be near instantaneous.

    DROP DATABASE FAKE_DB_NAME;
    CALL create_synonym_db('NormalDB', 'FAKE_DB_NAME');
    

    This will allow you to seamlessly swap in any database without changing code on the app tier.

    IMPORTANT: Keep in mind, when you "switch over" to 'TempDB', any changes made to it will not be in 'NormalDB' that you effectively took "offline" (from the app tier) for maintenance.

提交回复
热议问题