Keep texture centered while scaling
The problem you're experiencing is that the Texture space coordinates are in the range 0 to 1 on the X and Y axes and the scaling takes place from the origin - ie, 0,0. To address this you need to shift the coordinates so that the origin is in the centre of the image (0.5,0.5) before scaling. You can achieve this by splitting the Vector into its separate elements using a Separate XYZ node, manipulating the coordinates using Math nodes and re-combining as shown :



The Subtract node re-maps the range from 0 to 1 into -0.5 to 0.5 so the origin (0) is in the centre of the image. The Multiply can be adjusted to get the desired scaling (highlighted in the image). The Add re-maps the range back to 0 to 1.

Setting the Multiply nodes to '2' will give you a half-sized image. Swapping the Multiply for a Divide or using '0.5' will give the opposite effect.

EDIT : My expectation was that the above method would be quite efficient - since the nodes are performing mathematically simple calculations. 
However, in my particular test case this was adding 10% onto render times.

There are other methods to create the same effect. The most efficient method I have found so far is to use Mapping nodes in place of the Subtract, Multiply and Add - this also removes the need for the Separate and Combine operations :



The Mapping nodes perform the same operations as before - offset by 0.5, scale, offset back by 0.5. This does improve efficiency.

Additionally, since the Mapping node performs the Offset, Rotation, Scale as separate operations in turn, the first two Mapping nodes can actually be combined into the following :



ie, Offset by 0.5 and Scale, offset back by 0.5.

In my test case this was only 2-3% less efficient than no scaling - a significant improvement over using separate Math nodes.