1) An easy way would be to write an small script that goes through a list containing the URL every page on your website (I'm sure you can generate a list from the database); then fetches the page via HTTP, like any browser would do, and saves the files locally. Say one URL is mysite.com/category/bazingaa/content011, your script would save the page to category/bazingaa/content011, within a directory of your choosing.
Later on, you just upload the whole directory with pages, and point your browser to it instead of the dynamic site. You'll also have to copy the graphics and CSS sheets though.
Note: If you go for this approach, don't delete the old site or database from the server, if you make changes, you would need to regenerate the pages.
It would probably be more practical to use a cache instead of purely static files, since it will save you some time. It will cost you some performance though.
2) I see you are using PHP, so I'm going to recommend you take a look at the Zend framework, it has quite a large library of common use classes, and you don't need to use the whole framework in order to take advantage of them, you can just import what you need.
Particularly, take a look at:
http://framework.zend.com/manual/en/zend.cache.html
http://framework.zend.com/manual/en/zend.cache.backends.html#zend.cache.backends.file
http://framework.zend.com/manual/en/zend.cache.backends.html#zend.cache.backends.memcached
The file based cache will not require anything special and can be used on just about any server, which is handy if you don't yet run on a dedicated server. It will however cost you a disk seek and read for all files not internally cached by the operative system, and those don't come cheap, performance wise.
Memcached is basically a *nix daemon that sits on your server doing nothing and stores all your pages in memory, making it considerably fast, at the cost of RAM.
I would say you use both. Use memcached for your most requested pages and set a maximum amount of RAM for memcached to use. Then, when you need to fetch something from the cache, you first ask memcached, if memcached doesn't have what you are looking for, ask the file cache, if you still haven't found what you are looking for, you dynamically generate the content, and store it on both memcached and the file caches.
Now, all these techniques and caches are great if you are making the script that your sites run on, but that won't be the case most of them, and for that, I would suggest you use a "bridge", so to speak.
If you are using Apache as your webserver, you can set on your web site's root directory, inside the .htaccess file, that you want all request to be redirected to a particular script. The script will be given the requested URL, which can then be used to do the aforementioned operation with memcached and the file based cache. In the dynamic generation, you would just let the script running on the website generate the page by, usually, including it's main page (usually the index.php file) with a simple require()/include() call.
The above approach will give you fine grained control on how to handle your caches to the last detail, but you don't usually need that. Because of this, there are also other less "hands on" approaches to web site caching; namely, SQUID (
http://www.squid-cache.org/), which is an HTTP cached proxy server. I can't give you detailed information on how to use it's cache features as I only use it as my proxy server of choice. I'll have to refer you to the official manual on this one.
There are also some Apache modules for caching and other stuff that I've never needed to use, but it might be worth checking them out. A quick google search will give you some names

.
I follow you here - so to limit the amount of links, basically, I would just limit the amount of external ID's I insert the links on, yes?
Yes, exactly

.
And you insert them with:
INSERT INTO tbl_blinks(external_id,text,url) VALUES('the chosen external id', 'Click Here', 'http://www.hello.com/i/am/a/link');
P.S.: The ';' at the end of the SQL queries will give you an error if you pass it at the end of an SQL query string passed to mysql_query(). So, remove them if you are using the standard mysql extension.
If you have any more questions, just ask

.