 <p>There's not really well defined method of doing this - it's more of a manual task, defining how to transform the data. A form of ETL (Extract, Transform and Load) as it were.</p> <p>Start with your base tables and write some insert statements to get the core data in there, transformed as applicable. Then move onto the "next level" of related data and repeat until all of your info is copied over.</p> <p>Note that often times the new, ideal schema cannot be fully implemented (with all constraints, etc) with the legacy database as some pieces of information may be missing. In these cases you have to either a) generate the data as required during the load, or b) turn off constraints so you can load the legacy data until such data is cleaned up enough to enforce them.</p> <p>All in all, it's a very per-scenario type of thing that tends to be handled manually in most cases. To the best of my knowledge, anyway.</p> <p>Finally, it's been a while since I worked with MySQL, but most database engines allow for two-part naming of some sort, so you can access two separate databases (on the same server) from within a single script, so your insert statements might end up looking like this:</p> <pre><code>INSERT INTO newdb.newtable (thisfield, thatfield) SELECT thisfield, thatfield FROM olddb.oldtable; </code></pre> <p>(with applicable transformations applied, of course)</p>